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