dangerjs在gitlab的实践

373 阅读2分钟

背景

最近研究了dangerjs,在gitlab实际应用中,遇到了挺多坑,因为dangerjs这方面的文档比较少,所以进行了部署,并将一些常规问题记录下来。

介绍

在开源社区中,danger的使用尤其普遍,它可以拿来自动判断每个人提交的代码合并请求(github中叫Pull Request,下文简称PR,gitlab中叫Merge Request,下文简称MR)是否符合规范,自动化一些费时费力的人工检查,从而保证代码质量,是项目管理的利器。

danger常见的使用场景是:通过自定制的脚本自动化处理一些费神的人工检查。我以前在项目中使用dangerjs在gitlab上实现过这样的检查:合并代码时有没有勾选“合并后删除远端分支”的复选框,有没有勾选“合并时压缩git节点”的复选框,有没有在合并标题中写上对应电子看板的任务卡ID等等,如果没有操作这些则禁止代码合并,及其方便的规范了整个团队的git开发流程。

过程

安装dangerjs

yarn danger -D

获取Token

通过右上角的头像,点击Setting > Access Tokens,将得到的token自己用备忘录记起来,刷新页面则丢失。

image.png

将token保存到环境变量中

需要把token的变量名命名为DANGER_GITHUB_API_TOKEN,并且保存在CI的配置里。

image.png

创建dangerfile.js文件

项目根目录下创建dangerfile.js文件用于编写对应的脚本,比如下面几行代码就是最常用的写法。

import { message, danger } from 'danger';

const modifiedMD = danger.git.modified_files.join('- ');
message('Changed Files in this PR: \n - ' + modifiedMD);

创建.gitlab-ci.yml文件

image: node:12-slim // 改成对应镜像

stages:
  - test
  
# 执行dangerjs
danger:
  tags:
    - pages-share // 改成自己runner的Tags
  only:
    - merge_requests
  stage: test
  script:
    - yarn
    - yarn dangerCI

结果

image.png

FAQ:

Skipping Danger due to this run not executing on a PR.

image.png

原因:

需要设置相应条件,否则会在每次提交时,就自动触发CI。

解决方案:

danger:
  tags:
    - pages-share
  only:
    - merge_requests
  stage: test
  script:
    - yarn dangerCI

插曲:

如果,参考了dangerjs相关issue

不要写这段代码,也就是不要Export这个变量

script:
    - export CI_MERGE_REQUEST_IID=${CI_OPEN_MERGE_REQUESTS#*!}
    - yarn danger ci --failOnErrors

因为研发者也说了

image.png

gitlab请求错误

HTTPError: Response code 404 (Not Found)

image.png

原因:

gitlab缺乏该库

解决方案:

需要在.gitlab-ci.yml先执行一遍安装

danger:
  tags:
    - pages-share
  only:
    - merge_requests
  stage: test
  script:
    - yarn
    - yarn dangerCI

gitlab安装包报错

error danger@11.2.3: The engine "node" is incompatible with this module. Expected version ">=14.13.1". Got "12.22.7"

error Found incompatible module.

image.png

原因:

出现该问题是node版本(本人的node是12.22.7)没有该版本的库,可尝试提高gitlab的node版本,或者降低dangerjs的版本,如10.5.4

解决方案:

yarn danger@10.5.4 -D

参考文章

试了就戒不掉的CI工具-dangerjs