gitlab ci:手动或仅在master时运行构建作业

时间:2017-12-05 10:50:00

标签: gitlab jobs gitlab-ci

是否可以使用以下要求定义构建作业的gitlab-ci文件:

  • 手动执行 OR
  • 由主推送执行

我想到了这样的事情,但这很糟糕:

build_jar:
stage: build
script:
  - echo "build jar"
artifacts:
  paths:
    - jar/path/*.jar
only:
  - master
when: manual

对我来说,唯一的解决方案是拥有两个作业,一个用于主推,另一个用于手动输入。但缺点是,在gitlab中它变得令人困惑

5 个答案:

答案 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-complexhttps://docs.gitlab.com/ee/ci/variables/

希望这会有所帮助!

答案 3 :(得分:1)

目前你想要的确切不可能。虽然这两个职位(一个only: master,另一个when: manual应该提供替代。

如果你把它们放在同一个阶段,我猜不应该那么混乱。

您还可以使用special yaml features之类的anchorsDRY。{/ 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