仅为合并/特定提交消息做作业

Do jobs only for merge / specific commit message

我不太确定 gitlab CI 工作流程应该如何实现这一点:

  1. 在我的 gitlab 存储库中,每个功能都将在自己的分支中开发。至少分支会合并到master。
  2. 我正在使用 npm 包 grunt-bump 来提升 package.json
  3. 的版本

我想用gitlab做什么CI:

  1. 对于合并到master我想做一些测试(阶段测试)
  2. 如果测试阶段成功通过,合并应该完成,grunt bump 应该执行
  3. 这会增加版本值并向 master 提交新的提交。这个提交总是被标记为 "v0.0.2" 并且有一个像 "Release v0.0.2" 的消息。仅针对此提交,我想进入将构建和部署应用程序的构建阶段。

总结

所以 grunt bump 应该只在 master 上并且在成功测试和合并之后执行。仅针对生成的提交(发布 vx.x.x)构建和部署作业应该完成...

也许有比这个想法更智能的工作流程。基本上我想在合并和成功测试后增加版本值并标记提交...

我对 YAML 文件的尝试

stages:
  - test
  - build
  - deploy

lint:
  image: testing:latest
  stage: test
  tags:
    - testing
  script:
    - /node_modules/.bin/eslint --ext .js --ext .jsx .

bump:
  stage: build
  tags: 
    - deploy
  script:
    - grunt bump
  only:
    - master
    - /^Merge .*$/

build:
  stage: build
  tags:
    - deploy
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:latest
  only:
    - master
    - tags
    - /^Release .*$/

production:
  stage: deploy
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE:latest
    - cd /home/ubuntu
    - docker-compose up -d
  only:
    - master
    - tags
    - /^Release .*$/

可以根据预定义的 gitlab 变量 $CI_COMMIT_MESSAGE 执行作业 only/except。 参见 gitlab ci reference。 还要检查 docu 变量表达式的处理方式。

commit_message_has_release_job:
  only:
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Release .*$/
  [...]

也可以过滤 merge_requests

merge_request_job:
  only:
    - merge_requests
  [...]

合并 only/except 的多个案例可能不会像您预期的那样工作。该列表不适用于 AND,但 OR。此外,不能 100% 确定前导 only 后跟 except 是否按预期工作。所以一个简单的解决方法是这样的:

merge_reqeuest_to_master_job:
  only:
    - merge_requests
  before_script:
    - if [[ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master" ]]; exit 0 ; fi

由于刚刚设置了变量 $CI_MERGE_REQUEST_TARGET_BRANCH_NAME,如果管道用于合并请求,您可以这样做:

merge_reqeuest_to_master_job:
  only:
    variables:
      - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"

但是,功能 "CI variable expression conjunction/disjunction" 从 12.0 开始实施。

merge_reqeuest_to_master_job:
  only:
    - merge_requests

对您的其他评论:

  • 如果一个阶段的单个作业失败,默认情况下不会自动启动以下阶段的任何作业(如果您不这样做 allow_failure: truewhen: on_failure

是的,可以使用特定的提交消息触发管道,为此我们可以使用正则表达式

对我来说,它适用于以下内容,

install_nodemodules:
stage: install
script:
    - npm install
artifacts:
    paths:
      - node_modules/
only:
    variables:
         - $CI_COMMIT_MESSAGE =~ /Release/

在每个阶段都需要指定这个条件来执行当Commit消息等于Release的阶段