我有一个页面作业,我想在分支上手动运行,但是会在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
有可能吗?
答案 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
然后,您还将获得为标签运行管道的选项,如下所示:
这是否是您想要的,取决于您。
答案 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