From e2f9c439cc45381698a9d6acf8ffd045a1ff9ef5 Mon Sep 17 00:00:00 2001 From: Max Duval Date: Wed, 21 Jun 2023 16:17:41 +0100 Subject: [PATCH] feat(Makefile): lint project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a check for node versions in all known config using it: - dotcom-rendering’s riff-raff.yaml - dotcom-rendering’s Containerfile - apps-rendering’s riff-raff.yaml Co-authored-by: Alex Sanders --- .github/workflows/lint.yml | 3 + apps-rendering/riff-raff.yaml | 3 +- dotcom-rendering/Containerfile | 1 + dotcom-rendering/makefile | 8 +- .../scripts/deploy/riff-raff.yaml | 3 +- scripts/check-node-versions.mjs | 76 +++++++++++++++++++ 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 scripts/check-node-versions.mjs diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4eae5b3f60b..e2e3d8848eb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,6 +13,9 @@ jobs: cache: 'yarn' - run: make install working-directory: dotcom-rendering + - name: Lint Project + run: make lint-project + working-directory: dotcom-rendering - name: Lint run: make lint working-directory: dotcom-rendering diff --git a/apps-rendering/riff-raff.yaml b/apps-rendering/riff-raff.yaml index 297bb3dc293..e682c97e966 100644 --- a/apps-rendering/riff-raff.yaml +++ b/apps-rendering/riff-raff.yaml @@ -11,7 +11,8 @@ templates: amiParameter: AMIMobileappsrendering amiEncrypted: true amiTags: - Recipe: jammy-mobile-node18-ARM + # Keep the Node version in sync with `.nvmrc` + Recipe: jammy-mobile-node18.16.1-ARM AmigoStage: PROD deployments: mobile-apps-rendering-cfn: diff --git a/dotcom-rendering/Containerfile b/dotcom-rendering/Containerfile index cc84ce69c5e..13ac3016eff 100644 --- a/dotcom-rendering/Containerfile +++ b/dotcom-rendering/Containerfile @@ -1,4 +1,5 @@ # This container is used in our CICD pipelines for running E2E and regression tests. +# Keep the Node version in sync with `.nvmrc` FROM node:18.16.1-alpine WORKDIR /opt/app/dotcom-rendering/dotcom-rendering diff --git a/dotcom-rendering/makefile b/dotcom-rendering/makefile index a92234358eb..a2c8c01ee64 100644 --- a/dotcom-rendering/makefile +++ b/dotcom-rendering/makefile @@ -136,6 +136,10 @@ lint: clean-dist install $(call log, "checking for lint errors") @yarn lint +lint-project: + $(call log, "linting project") + @node ../scripts/check-node-versions.mjs + stylelint: clean-dist install $(call log, "checking for style lint errors") @stylelint "src/**/*.ts{,x}" @@ -149,10 +153,10 @@ test-ci: clear clean-dist install $(call log, "running tests") @yarn test:ci --verbose --collectCoverage --coverageReporters=lcov -validate: clean-dist install tsc lint stylelint test validate-build +validate: clean-dist install lint-project tsc lint stylelint test validate-build $(call log, "everything seems 👌") -validate-ci: install tsc lint stylelint test-ci +validate-ci: install lint-project tsc lint stylelint test-ci $(call log, "everything seems 👌") # helpers ######################################### diff --git a/dotcom-rendering/scripts/deploy/riff-raff.yaml b/dotcom-rendering/scripts/deploy/riff-raff.yaml index 88a78b200f7..68690ba41f3 100755 --- a/dotcom-rendering/scripts/deploy/riff-raff.yaml +++ b/dotcom-rendering/scripts/deploy/riff-raff.yaml @@ -19,7 +19,8 @@ deployments: InstanceType: t4g.small amiParametersToTags: AMI: - Recipe: dotcom-rendering-ARM-jammy-node-18 + # Keep the Node version in sync with `.nvmrc` + Recipe: dotcom-rendering-ARM-jammy-node-18.16.1 BuiltBy: amigo AmigoStage: PROD rendering: diff --git a/scripts/check-node-versions.mjs b/scripts/check-node-versions.mjs new file mode 100644 index 00000000000..c02a1f8c471 --- /dev/null +++ b/scripts/check-node-versions.mjs @@ -0,0 +1,76 @@ +// @ts-check + +import { readFile } from 'node:fs/promises'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { log, warn } from '../dotcom-rendering/scripts/env/log.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +process.chdir(resolve(__dirname, '..')); + +const nvmrc = (await readFile('.nvmrc', 'utf-8')) + // We don’t care about leading or trailing whitespace + .trim(); + +/** Matches `x.y.z` pattern */ +const nodeVersionPattern = /^\d+\.\d+\.\d+$/; +const nodeVersion = nvmrc.match(nodeVersionPattern)?.[0] ?? undefined; + +if (!nodeVersion) { + warn( + 'Node version in .nvmrc has incorrect pattern:', + `\`${nvmrc}\` does not match \`x.y.z\``, + ); + process.exit(1); +} else { + log(`Found node version ${nodeVersion} in \`.nvmrc\``); +} + +const requiredNodeVersionMatches = + /** @type {const} @satisfies {ReadonlyArray<{filepath: string, pattern: RegExp}>}*/ ([ + { + filepath: 'dotcom-rendering/Containerfile', + pattern: /^FROM node:(.+)-alpine$/m, + }, + { + filepath: 'dotcom-rendering/scripts/deploy/riff-raff.yaml', + pattern: /^ +Recipe: dotcom-rendering.*-node-(\d+\.\d+\.\d+)$/m, + }, + { + filepath: 'apps-rendering/riff-raff.yaml', + pattern: /^ +Recipe: .+-mobile-node(\d+\.\d+\.\d+).*$/m, + }, + ]); + +const problems = ( + await Promise.all( + requiredNodeVersionMatches.map(async ({ filepath, pattern }) => { + const fileContents = await readFile( + resolve(...filepath.split('/')), + 'utf-8', + ); + const foundNodeVersion = + fileContents.match(pattern)?.[1] ?? undefined; + + return foundNodeVersion === nodeVersion + ? undefined + : `Node version in ${filepath} (${foundNodeVersion}) does not match \`.nvmrc\` (${nodeVersion})`; + }), + ) +).filter( + /** @type {(problem?: string) => problem is string} */ + (problem) => !!problem, +); + +if (problems.length === 0) { + log( + `All ${requiredNodeVersionMatches.length} checked files use the correct Node version`, + ); + process.exitCode = 0; +} else { + for (const problem of problems) { + warn(problem); + } + process.exitCode = 1; +}