mirror of https://github.com/grafana/grafana
Build: Adds pre-commit check that fails if node versions are not synced (#17820)
* Build: Adds pre-commit check that fails if node versions are not synced * Build: Throws error instead * Minor refactoring and testingpull/17957/head
parent
315177fad7
commit
b1a0bd115c
@ -0,0 +1,78 @@ |
||||
import { Task, TaskRunner } from './task'; |
||||
import chalk from 'chalk'; |
||||
import { coerce, satisfies } from 'semver'; |
||||
import { readFileSync } from 'fs'; |
||||
|
||||
interface FailedVersionCheck { |
||||
file: string; |
||||
line: string; |
||||
} |
||||
|
||||
interface NodeVersionCheckerOptions {} |
||||
|
||||
const pattern = /(circleci\/|FROM )node\:([0-9]+(\.[0-9]+){0,2})/gm; |
||||
const packageJsonFile = 'package.json'; |
||||
|
||||
const failures: FailedVersionCheck[] = []; |
||||
|
||||
export const nodeVersionFiles = [packageJsonFile, 'Dockerfile', '.circleci/config.yml']; |
||||
|
||||
const nodeVersionCheckerRunner: TaskRunner<NodeVersionCheckerOptions> = async () => { |
||||
// Read version from package json and treat that as the expected version in all other locations
|
||||
const packageJson = require(`${process.cwd()}/${packageJsonFile}`); |
||||
const expectedVersion = packageJson.engines.node; |
||||
|
||||
console.log(chalk.yellow(`Specified node version in package.json is: ${expectedVersion}`)); |
||||
|
||||
for (const file of nodeVersionFiles) { |
||||
const fileContent = readFileSync(`${process.cwd()}/${file}`); |
||||
const matches = fileContent.toString('utf8').match(pattern); |
||||
|
||||
if (!matches) { |
||||
continue; |
||||
} |
||||
|
||||
for (const match of matches) { |
||||
const actualVersion = coerce(match); |
||||
if (!actualVersion) { |
||||
failures.push({ |
||||
file, |
||||
line: match, |
||||
}); |
||||
continue; |
||||
} |
||||
|
||||
const satisfied = satisfies(actualVersion, expectedVersion); |
||||
if (!satisfied) { |
||||
failures.push({ |
||||
file, |
||||
line: match, |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (failures.length > 0) { |
||||
console.log(chalk.red('--------------------------------------------------------------------')); |
||||
console.log(chalk.red(`These entries don't satisfy the engine version in ${packageJsonFile}`)); |
||||
console.log(chalk.red('--------------------------------------------------------------------')); |
||||
|
||||
for (let index = 0; index < failures.length; index++) { |
||||
const failure = failures[index]; |
||||
console.log(chalk.green(`\tIn ${failure.file} the line ${failure.line} does not satisfy ${expectedVersion}.`)); |
||||
} |
||||
|
||||
throw new Error('Node versions not in sync'); |
||||
} |
||||
|
||||
console.log(chalk.yellow('--------------------------------------------------------------------')); |
||||
console.log(chalk.yellow('All node versions seem ok.')); |
||||
console.log(chalk.yellow("Don't forget to sync https://github.com/grafana/grafana-build-container")); |
||||
console.log(chalk.yellow(`also if you changed the engine version in ${packageJsonFile}`)); |
||||
console.log(chalk.yellow('--------------------------------------------------------------------')); |
||||
}; |
||||
|
||||
export const nodeVersionCheckerTask = new Task<NodeVersionCheckerOptions>( |
||||
'Node Version Checker', |
||||
nodeVersionCheckerRunner |
||||
); |
Loading…
Reference in new issue