强制覆盖gitlab PR

时间:2019-02-05 20:56:56

标签: ember.js gitlab code-coverage gitlab-ci

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

我可以使用istanbul获取coverage输出,并使用以下正则表达式获取正确显示的coverage徽章:

Gitlab CI screenshot

并使用此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中的覆盖率降低,如何使下一个管道失败?

1 个答案:

答案 0 :(得分:0)

在深入研究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。比较代码覆盖率和存储的“最大”覆盖率(默认为0)

如果覆盖范围减少,只需返回一个非零的退出代码(谢谢勒克斯!)

"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。合并合并请求时更新“最大”覆盖率

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

使用stages依次运行这三个管道,不要忘记在管道之间缓存“最大”覆盖率:

cache:
  paths:
    - coverage/.max