仅针对合并/特定提交消息执行作业

use*_*695 5 git merge gitlab gitlab-ci

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

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

我想用 gitlab CI 做什么:

  1. 对于合并到主我想做一些测试(阶段测试)
  2. 如果测试阶段成功通过,则应完成合并并grunt bump执行
  3. 这将提高版本值,并对 master 进行新的提交。此提交始终标记为“v0.0.2”,并带有“Release v0.0.2”之类的消息。仅对于这次提交,我想进入构建阶段,该阶段将构建和部署应用程序。

概括

所以 grunt bump应该只在 master 上并且在成功的测试和合并之后执行。仅对于生成的提交(Release vx.xx),应该完成构建和部署工作...

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

我对 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 .*$/
Run Code Online (Sandbox Code Playgroud)

fum*_*uma 9

可以only/except根据预定义的 gitlab 变量执行作业$CI_COMMIT_MESSAGE。请参阅gitlab ci 参考。还要检查有关如何处理变量表达式的文档

commit_message_has_release_job:
  only:
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Release .*$/
  [...]
Run Code Online (Sandbox Code Playgroud)

也可以过滤merge_requests

merge_request_job:
  only:
    - merge_requests
  [...]
Run Code Online (Sandbox Code Playgroud)

将多个情况组合在一起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
Run Code Online (Sandbox Code Playgroud)

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

merge_reqeuest_to_master_job:
  only:
    variables:
      - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
Run Code Online (Sandbox Code Playgroud)

但是,自 12.0 起实现了“CI 变量表达式连接/分离”功能。

merge_reqeuest_to_master_job:
  only:
    - merge_requests
Run Code Online (Sandbox Code Playgroud)

对您的其他评论:

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