是否可以使用以下要求定义构建作业的gitlab-ci文件:
我想到了这样的事情,但这很糟糕:
build_jar:
stage: build
script:
- echo "build jar"
artifacts:
paths:
- jar/path/*.jar
only:
- master
when: manual
对我来说,唯一的解决方案是拥有两个作业,一个用于主推,另一个用于手动输入。但缺点是,在gitlab中它变得令人困惑
答案 0 :(得分:12)
我也没有找到在一个区块中执行此操作的方法,并且必须使用yaml锚点并拆分为两个单独的块:
.deploy_common: &deploy_common
# common config HERE
deploy_master_CD:
<<: *deploy_common
only:
refs:
- master
deploy_manual:
<<: *deploy_common
when: manual
答案 1 :(得分:5)
使用GitLab 11.3中的extends
configuration parameter可以轻松定义两个作业。它是使用YAML锚的一种替代方法,并且更具灵活性和可读性:
.deploy_common:
# common config
deploy_master_CD:
extends: .deploy_common
only:
refs:
- master
deploy_manual:
extends: .deploy_common
when: manual
答案 2 :(得分:3)
我自己遇到了这个问题,终于找到了答案(或者找到了我需要的可行版本):
build_jar:
stage: build
script:
- echo "build jar"
artifacts:
paths:
- jar/path/*.jar
only:
variables:
- $CI_PIPELINE_SOURCE == "web"
- $CI_COMMIT_REF_NAME == "master"
变量块下的条件是“或”运算的,因此当它在master分支上或从Web启动时就可以运行该作业(在我的情况下可以与“ manual”互换)。这不会像'when:manual'那样暂停管道,但是我还是不希望它这样做。
以下是文档:https://docs.gitlab.com/ee/ci/yaml/#only-and-except-complex和https://docs.gitlab.com/ee/ci/variables/
希望这会有所帮助!
答案 3 :(得分:1)
目前你想要的确切不可能。虽然这两个职位(一个only: master
,另一个when: manual
应该提供替代。
如果你把它们放在同一个阶段,我猜不应该那么混乱。
您还可以使用special yaml features之类的anchors来DRY。{/ p>
答案 4 :(得分:1)
我不得不使用它来避免产生额外的“阻塞”管道。
- if: '$CI_MERGE_REQUEST_EVENT_TYPE == "detached"' # Avoid spawning of additional pipelines
when: never
- if: '$CI_MERGE_REQUEST_ID != ""' # Force manual deploy if master was pushed without a MR
when: manual
allow_failure: true # to avoid blocked state for the whole pipeline
- if: '$CI_COMMIT_REF_SLUG == "master"' # Auto deploy on master
when: on_success
- when: manual # Manually deploy on all other branches
allow_failure: true # to avoid blocked state for the whole pipeline