如何让gitlab CI作业仅在分支机构上手动触发而始终在master上自动触发?

时间:2019-03-28 13:24:35

标签: gitlab-ci

我有一个页面作业,我想在分支上手动运行,但是会在master上自动触发:

pages:
  stage: deploy
  cache:
    paths:
      - public
  script:
    - scripts/pages.sh
  artifacts:
    paths:
      - public
    expire_in: 2 days

所以我想要一个组合:

  only:
    - master
  when: always
  only:
    - branches
  except:
    - master
  when: manual

有可能吗?

3 个答案:

答案 0 :(得分:5)

如果您使用GitLab CI rules,则应该可以这样做。这是一个外壳为powershell的示例,它显示了当前时间和分支/标签名称:

pages:
  script:
    - mkdir public
    - date > public\index.html
    - $CI_COMMIT_REF_NAME >> public\index.html
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - if: '$CI_COMMIT_BRANCH == null'
      when: never
    - when: manual

GitLab从上到下匹配每个单独的规则。如果分支名为“ master”,则该作业将被标记为when: always。如果分支名称为null,则这是一个标记,并且该作业被标记为never。如果这不是一个名为master的分支,也不是一个标记,则它不是普通分支,并且该作业将标记为manual。

如Aleksey Tsalolikhin所述,您可以删除以下规则:

    - if: '$CI_COMMIT_BRANCH == null'
      when: never

然后,您还将获得为标签运行管道的选项,如下所示:

Rules for manual job for both tags and branches, except master branch

这是否是您想要的,取决于您。

答案 1 :(得分:3)

我已经调整了MrBerta的答案-第三个命令缺少了echo命令。

我还将斜杠从反斜杠更改为常规的正斜杠,因此我可以使用Linux shell而不是Powershell。

现在可以使用了。

这是gitlab-ci.yml文件-归功于MrBerta。

pages:
  script:
    - mkdir public
    - date > public/index.html
    - echo $CI_COMMIT_REF_NAME >> public/index.html
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - if: '$CI_COMMIT_BRANCH == null'
      when: never
    - when: manual

我试图推动掌握,并且我的GitLab页面内容已按预期进行了更新;我尝试推送到功能分支,然后在CI / CD管道用户界面中出现了手动“播放”按钮。

当我推入一个标签(具有分离的头部,即不在任何分支上)时,我无法对其进行测试-GitLab CI不会自动运行管道,而当我尝试运行管道并选择标签时, GitLab引发了一个错误:“表单包含以下错误:该管道没有阶段/作业。”

因此,我将其简化为:

pages:
  script:
    - mkdir public
    - date > public/index.html
    - echo $CI_COMMIT_REF_NAME >> public/index.html
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - when: manual

此页面作业在分支(和标签,但我无法对其进行测试)上手动运行,但根据原始发布者的要求在母版上自动触发。

答案 2 :(得分:0)

您将需要定义两个阶段。您可以复制/粘贴或使用锚点:

.deploy_stage: &deploy_stage
  stage: deploy
  cache:
    paths:
      - public
  script:
    - scripts/pages.sh
  artifacts:
    paths:
      - public
    expire_in: 2 days

deploy_manual:
  <<: *deploy_stage
  only:
    - branches
  when: manual

deploy_master:
  <<: *deploy_stage
  only:
    - master