Skip to content

Commit

Permalink
🌱 [backport release-0.2] Update repo CI (#1871)
Browse files Browse the repository at this point in the history
Backport repo level CI updates following changes in #1804 and others.
This will allow the "required" PR check of "unit-test" to be run on the
release-0.2 branch.

Specific changes:
  - Workflow `ci-actions.yml` replaced by `ci-repo.yml`
  - Add `./scripts/verify_lock.mjs` updated for the branch's package.json
    project structure
  - Disable the lint step since linting does not exist on release-0.2
  - Disable codecov uploads since we don't need it on an old release
    branch

---------

Signed-off-by: Scott J Dickerson <[email protected]>
  • Loading branch information
sjd78 authored Apr 19, 2024
1 parent 529f99b commit df20a4e
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 38 deletions.
38 changes: 0 additions & 38 deletions .github/workflows/ci-actions.yml

This file was deleted.

68 changes: 68 additions & 0 deletions .github/workflows/ci-repo.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: CI (repo level)

on:
push:
branches:
- "main"
- "release-*"
pull_request:
branches:
- "main"
- "release-*"

jobs:
unit-test-lookup-image:
runs-on: ubuntu-latest
outputs:
builder-image: ${{ steps.grepBuilder.outputs.builder }}
steps:
- uses: actions/checkout@v4
- name: Lookup builder image from the project's Dockerfile
id: grepBuilder
run: |
builder=$(grep 'as builder' Dockerfile | sed -e 's/^FROM \(.*\) as builder$/\1/')
echo "Builder image: \`$builder\`" >> "$GITHUB_STEP_SUMMARY"
echo "builder=$builder" >> "$GITHUB_OUTPUT"
unit-test:
runs-on: ubuntu-latest
needs: unit-test-lookup-image

# Use the same container as the Dockerfile's "FROM * as builder"
container: ${{ needs.unit-test-lookup-image.outputs.builder-image }}

steps:
- uses: actions/checkout@v4

# TODO: Setup a cache for npm so it could install faster
# follow actions/setup-node@v4 techniques

- name: Verify package-lock.json
run: ./scripts/verify_lock.mjs

- name: Install
run: |
npm version
npm clean-install --ignore-scripts
# Linting doesn't exist on release-0.2
# - name: Lint sources
# run: npm run lint

- name: Build
run: npm run build

- name: Test
run: npm run test -- --coverage --watchAll=false

# - name: Upload to codecov (client)
# uses: codecov/codecov-action@v4
# with:
# flags: client
# directory: ./*/coverage

# - name: Upload to codecov (server)
# uses: codecov/codecov-action@v4
# with:
# flags: server
# directory: ./*/coverage
66 changes: 66 additions & 0 deletions scripts/verify_lock.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env node

import process from "node:process";
import path from "node:path";
import { readFileSync } from "node:fs";

// set the working directory to project root
// fs.accessSync("./package-lock.json")
const getProjectRoot = () => path.resolve(path.dirname(process.argv[1]), "../");
process.chdir(getProjectRoot());

// load the lock file
const lockFilePath = path.resolve(process.cwd(), "package-lock.json");
const lockFile = JSON.parse(readFileSync(lockFilePath));

const toLog = {
name: lockFile.name,
version: lockFile.version,
lockfileVersion: lockFile.lockfileVersion,
};

// check the packages packages
const removeUndefined = (obj) =>
Object.fromEntries(Object.entries(obj).filter((e) => e[1] !== undefined));

const results = {
project: [],
resolved: [],
unresolved: [],
};
Object.entries(lockFile.packages).forEach(([name, p]) => {
const bucket = ["", "client", "server"].includes(name)
? results.project
: p.resolved
? results.resolved
: results.unresolved;

bucket.push(
removeUndefined({
name,
version: p.version,
resolved: p.resolved,
packageName: p.name,
})
);
});

// log findings
toLog.packages = results.project;
toLog.dependencies = {
countResolved: results.resolved.length,
countUnresolved: results.unresolved.length,
unresolved: results.unresolved,
};

console.log(`package-lock.json (${lockFilePath}) status:`);
console.dir(toLog, { depth: 3 });
console.log();
if (results.unresolved.length === 0) {
console.log("\u{1f600} lock file is ok!");
} else {
console.log("\u{1f621} lock file contains unresolved dependencies!");
}

// exit the script with an appropriate error code
process.exit(results.unresolved.length === 0 ? 0 : 1);

0 comments on commit df20a4e

Please sign in to comment.