在 gitlab CI/CD 管道中自动化许可证检查
Automating the license checking in gitlab CI/CD pipeline
我正在尝试在 GitLab CI/CD 管道上对我的 React 项目中已安装的软件包进行许可证检查。在构建阶段之前,管道应该检查所有可用的许可证,然后将某些指定的许可证列入白名单或黑名单。
我正在使用 license-checker package 在 JSON 文件中实现可用许可证列表。
执行要求的命令后:license-checker --json > ./license.json
,输出为:
license.json
{
"@babel/plugin-transform-parameters@7.10.1": {
"licenses": "MIT",
"repository": "https://github.com/babel/babel",
"path": "..../node_modules/@babel/plugin-transform-parameters",
"licenseFile": "...../node_modules/@babel/plugin-transform-parameters/LICENSE"
},
"@babel/plugin-transform-property-literals@7.10.1": {
"licenses": "MIT",
"repository": "https://github.com/babel/babel",
"path": "..../node_modules/@babel/plugin-transform-property-literals",
"licenseFile": "...../node_modules/@babel/plugin-transform-property-literals/LICENSE"
},
"@babel/plugin-transform-react-constant-elements@7.10.1": {
"licenses": "MIT",
"repository": "https://github.com/babel/babel",
"path": "..../node_modules/@babel/plugin-transform-react-constant-elements",
"licenseFile": "...../node_modules/@babel/plugin-transform-react-constant-elements/LICENSE"
}
// .........and list goes on
}
.gitlab-ci.yml
include:
- local: license-checker-config.yml
stages:
- dependency
dependency:
image: node:12
stage: dependency
script:
- npm ci
- echo "main file...."
license-checker-config.yml
before_script:
- ./license.json
- echo "Checking licenses..."
许可证扫描应该在构建过程之前启动,所以我将其作为 before_script
的一部分包含在内。
在 license-checker-config.yml
中,我需要包含我的 JSON 文件,然后通过迭代检查它,如果它包含像 MIT 这样的许可证,那么只有构建阶段应该继续,否则构建应该失败。
使用我当前的代码设置,我执行了管道并收到错误:
Executing "step_script" stage of the job script
00:01
$ ./license.json
/bin/bash: line 99: ./license.json: Permission denied
ERROR: Job failed: exit code 1
即使文件 license.json 存在于同一个根文件夹中,它也显示权限被拒绝。此外,我无法弄清楚如何在 yml 文件中实现 JSON 文件循环,然后实现所需的。
非常感谢任何帮助我度过难关的人。
我认为这是因为在您检查其中的 json 文件之前该文件夹不存在。
我的建议是为 运行 构建提供前脚本,然后在文件夹中搜索 json 文件,就像您在步骤定义中所做的那样。
简易模式(nodejs)
您可以在您的 package.json(您的应用程序的源代码)中添加一个名为 validate_licenses.js
的脚本
"scripts": {
"start": "...",
"build": "...",
"validate_licenses": " node validate_licenses.js"
}
将许可证验证逻辑放在validate_licenses.js中:
最后只需在管道的任何部分执行:
npm run validate_licenses
这将像 test 一样失败,构建过程将被中断。
- 强制 json 创建并解析它
const { exec } = require("child_process");
const license_checker = require('license-checker')
var fs = require('fs');
exec("license-checker --json > ./license.json", (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`); return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);return;
}
console.log(`json created`);
parseJsonLicenses();
});
function parseJsonLicenses(){
var licenses = JSON.parse(fs.readFileSync('/license.json', 'utf8'));
//iterate licenses and fail if exist one licence differet of MIT
for(var npmModule in licenses){
if(licenses[npmModule].licenses != 'MIT')
throw new Error(npmModule+' has a not allowed license');
}
}
更多信息在其官方ci官方网站:
- https://www.npmjs.com/package/license-checker
- https://github.com/davglass/license-checker/tree/master/tests
-避免json生成并使用[onlyAllow]选项
var checker = require('license-checker');
var config = {
start: '.' ,
onlyAllow: 'MIT'
};
checker.init(config, function(json, err) {
if (err) {
throw new Error(err);
} else {
console.log (JSON.stringify (json))
}
});
我在我的一个项目中进行了测试,但出现了这个错误:
Package "@csstools/convert-colors@1.4.0" is licensed under "CC0-1.0" which is not permitted by the --onlyAllow flag. Exiting.
困难模式(shell 命令)
- 解析之前生成的 json
您可以使用纯 shell 命令阅读、迭代查找 MIT 单词,但这将是一项艰巨的任务。
检查这个:Iterating through JSON array in Shell script
如果成功,您可以在 git 实验室中调用 validate_licenses.sh ci:
test:
stage: test
script:
- echo 'starting licenses validation'
- ./validate_licenses.sh
- 解析之前生成的简单文件
根据这个 post : https://medium.com/@fokusman/the-easiest-way-to-check-all-your-npm-dependency-licenses-753075ef1d9d
可以获得许可证的汇总计数
> license-checker --summary
├─ MIT: 949
├─ ISC: 115
├─ BSD-2-Clause: 24
├─ CC0-1.0: 23
├─ BSD-3-Clause: 18
├─ Apache-2.0: 18
├─ CC-BY-4.0: 2
├─ BSD*: 2
终于可以check if this file contains a specific string and
混合(git 实验室 ci 中的 nodejs 命令)
如果您可以在 git 实验室 ci 中执行 nodejs 命令,则可以直接调用 validate_licenses.js(如果存在):
test:
stage: test
script:
- echo 'starting licenses validation'
- node validate_licenses.js
参考资料
我正在尝试在 GitLab CI/CD 管道上对我的 React 项目中已安装的软件包进行许可证检查。在构建阶段之前,管道应该检查所有可用的许可证,然后将某些指定的许可证列入白名单或黑名单。
我正在使用 license-checker package 在 JSON 文件中实现可用许可证列表。
执行要求的命令后:license-checker --json > ./license.json
,输出为:
license.json
{
"@babel/plugin-transform-parameters@7.10.1": {
"licenses": "MIT",
"repository": "https://github.com/babel/babel",
"path": "..../node_modules/@babel/plugin-transform-parameters",
"licenseFile": "...../node_modules/@babel/plugin-transform-parameters/LICENSE"
},
"@babel/plugin-transform-property-literals@7.10.1": {
"licenses": "MIT",
"repository": "https://github.com/babel/babel",
"path": "..../node_modules/@babel/plugin-transform-property-literals",
"licenseFile": "...../node_modules/@babel/plugin-transform-property-literals/LICENSE"
},
"@babel/plugin-transform-react-constant-elements@7.10.1": {
"licenses": "MIT",
"repository": "https://github.com/babel/babel",
"path": "..../node_modules/@babel/plugin-transform-react-constant-elements",
"licenseFile": "...../node_modules/@babel/plugin-transform-react-constant-elements/LICENSE"
}
// .........and list goes on
}
.gitlab-ci.yml
include:
- local: license-checker-config.yml
stages:
- dependency
dependency:
image: node:12
stage: dependency
script:
- npm ci
- echo "main file...."
license-checker-config.yml
before_script:
- ./license.json
- echo "Checking licenses..."
许可证扫描应该在构建过程之前启动,所以我将其作为 before_script
的一部分包含在内。
在 license-checker-config.yml
中,我需要包含我的 JSON 文件,然后通过迭代检查它,如果它包含像 MIT 这样的许可证,那么只有构建阶段应该继续,否则构建应该失败。
使用我当前的代码设置,我执行了管道并收到错误:
Executing "step_script" stage of the job script
00:01
$ ./license.json
/bin/bash: line 99: ./license.json: Permission denied
ERROR: Job failed: exit code 1
即使文件 license.json 存在于同一个根文件夹中,它也显示权限被拒绝。此外,我无法弄清楚如何在 yml 文件中实现 JSON 文件循环,然后实现所需的。
非常感谢任何帮助我度过难关的人。
我认为这是因为在您检查其中的 json 文件之前该文件夹不存在。
我的建议是为 运行 构建提供前脚本,然后在文件夹中搜索 json 文件,就像您在步骤定义中所做的那样。
简易模式(nodejs)
您可以在您的 package.json(您的应用程序的源代码)中添加一个名为 validate_licenses.js
的脚本 "scripts": {
"start": "...",
"build": "...",
"validate_licenses": " node validate_licenses.js"
}
将许可证验证逻辑放在validate_licenses.js中:
最后只需在管道的任何部分执行:
npm run validate_licenses
这将像 test 一样失败,构建过程将被中断。
- 强制 json 创建并解析它
const { exec } = require("child_process");
const license_checker = require('license-checker')
var fs = require('fs');
exec("license-checker --json > ./license.json", (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`); return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);return;
}
console.log(`json created`);
parseJsonLicenses();
});
function parseJsonLicenses(){
var licenses = JSON.parse(fs.readFileSync('/license.json', 'utf8'));
//iterate licenses and fail if exist one licence differet of MIT
for(var npmModule in licenses){
if(licenses[npmModule].licenses != 'MIT')
throw new Error(npmModule+' has a not allowed license');
}
}
更多信息在其官方ci官方网站:
- https://www.npmjs.com/package/license-checker
- https://github.com/davglass/license-checker/tree/master/tests
-避免json生成并使用[onlyAllow]选项
var checker = require('license-checker');
var config = {
start: '.' ,
onlyAllow: 'MIT'
};
checker.init(config, function(json, err) {
if (err) {
throw new Error(err);
} else {
console.log (JSON.stringify (json))
}
});
我在我的一个项目中进行了测试,但出现了这个错误:
Package "@csstools/convert-colors@1.4.0" is licensed under "CC0-1.0" which is not permitted by the --onlyAllow flag. Exiting.
困难模式(shell 命令)
- 解析之前生成的 json
您可以使用纯 shell 命令阅读、迭代查找 MIT 单词,但这将是一项艰巨的任务。
检查这个:Iterating through JSON array in Shell script
如果成功,您可以在 git 实验室中调用 validate_licenses.sh ci:
test:
stage: test
script:
- echo 'starting licenses validation'
- ./validate_licenses.sh
- 解析之前生成的简单文件
根据这个 post : https://medium.com/@fokusman/the-easiest-way-to-check-all-your-npm-dependency-licenses-753075ef1d9d
可以获得许可证的汇总计数
> license-checker --summary
├─ MIT: 949
├─ ISC: 115
├─ BSD-2-Clause: 24
├─ CC0-1.0: 23
├─ BSD-3-Clause: 18
├─ Apache-2.0: 18
├─ CC-BY-4.0: 2
├─ BSD*: 2
终于可以check if this file contains a specific string and
混合(git 实验室 ci 中的 nodejs 命令)
如果您可以在 git 实验室 ci 中执行 nodejs 命令,则可以直接调用 validate_licenses.js(如果存在):
test:
stage: test
script:
- echo 'starting licenses validation'
- node validate_licenses.js