在 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官方网站:

-避免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

参考资料