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

时间:2017-04-19 20:08:55

标签: git merge gitlab gitlab-ci

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

  1. 在我的gitlab资源库中,每个功能都将在自己的分支中开发。至少该分支将合并为主。
  2. 我正在使用npm package grunt-bump来提升package.json
  3. 的版本

    我想用gitlab CI做什么:

    1. 合并为主我想做一些测试(阶段测试)
    2. 如果测试阶段已成功通过,则应完成合并并执行grunt bump
    3. 这将提升版本值,并将执行新的提交。此提交始终标记为" v0.0.2"并有一条消息,如"发布v0.0.2"。仅针对此提交,我想进入构建阶段,这将构建和部署应用程序。
    4. 摘要

      所以grunt bump只应在master上和成功测试和合并后执行。仅对于生成的提交(Release 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 .*$/
      

2 个答案:

答案 0 :(得分:1)

可以根据预定义的gitlab变量only/except执行作业$CI_COMMIT_MESSAGE。 参见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

答案 1 :(得分:0)

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

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

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

当你想执行时,你可以给每个阶段这个选项