gitlab PR 中的强制覆盖率增加

Force coverage increase in gitlab PRs

为了通过要求对托管在 gitlab 上的 EmberJS 项目的每个拉取请求进行单元测试来增加测试覆盖率,我希望管道 如果覆盖率没有增加就会失败 .

我可以使用 istanbul 获取覆盖率输出,并使用以下正则表达式正确显示覆盖率标志:

并使用这个 gitlab-ci.yml:

image: sergiolepore/ember-cli

before_script:
  - yarn --ignore-engines
  - bower --allow-root install

"Ember Unit Tests":
  script:
    - COVERAGE=true npm test -- --filter=Unit
    - grep -o '"pct":\d*\.\d*' coverage/coverage-summary.json | head -1

如果 PR 中的覆盖率下降,我怎样才能让下一个管道失败?

经过大量挖掘 https://docs.gitlab.com/ee/ci/yaml/,这是我找到的解决方案:

1。执行测试时生成代码覆盖率

该管道将使用 artifacts

存储作业之间 coverage/.current 下的覆盖百分比
"Ember Unit Tests":
  artifacts:
    paths:
      - coverage/.current
  script:
    - COVERAGE=true yarn test --filter=Unit
  after_script:
    - grep -o <regex> coverage.json >> coverage/.current

2。将代码覆盖率与存储的 "max" 覆盖率(默认为 0)

进行比较

如果覆盖率下降,只需return一个非零退出代码(谢谢 Lux!)

"Increase Coverage":
  before_script:
    - MAX=`if [ -f coverage/.max ] ; then cat coverage/.max ; else echo 00.00 ; fi`
    - CURRENT=`cat coverage/.current`
  script: if [[ $CURRENT < $MAX ]] ; then exit 1 ; fi

3。合并拉取请求时更新 "max" 覆盖范围

"Update Max Coverage":
  except:
    - pushes
  before_script:
    - NEW_MAX=`cat coverage/.current`
  script: echo $NEW_MAX > coverage/.max

运行 这三个管道连续使用 stages 并且不要忘记缓存管道之间的 "max" 覆盖范围:

cache:
  paths:
    - coverage/.max