gitlab ci: Запустите сборку задания вручную или только в режиме мастера

Возможно ли, чтобы файл gitlab-ci выполнял задание на сборку, определяемое следующими требованиями:

  • выполняться при ручном ИЛИ
  • получить исполнение путем нажатия мастера

Я думал о чем-то подобном, но это плохо ложно:

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

Единственное решение для меня состоит в том, чтобы иметь два задания: одно для основного нажатия и один ручной ввод. Но недостатком является то, что в gitlab он становится смущенным

Ответ 1

Я также не нашел способа сделать это в одном блоке, и мне пришлось использовать якоря yaml и разделить на два отдельных блока:

.deploy_common:
# common config HERE

deploy_master_CD:
  extends: .deploy_common
  only:
    refs:
      - master

deploy_manual:
  extends: .deploy_common
  when: manual

ИЛИ все в одном, начиная с GitLab 12.3 , используя правила

deploy:
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master"'
    - when: manual

Ответ 2

Если бы я сама столкнулась с этой проблемой, то, наконец, решила (или, во всяком случае, нашла работоспособную версию для моих нужд):

build_jar:
  stage: build
  script:
    - echo "build jar"
  artifacts:
    paths:
      - jar/path/*.jar
  only:
    variables:
    - $CI_PIPELINE_SOURCE == "web"
    - $CI_COMMIT_REF_NAME == "master"

Условия в блоке переменных объединяются в OR, поэтому задание запускается, когда оно находится либо в основной ветки, либо запускается из Интернета (в моем случае взаимозаменяемо с 'manual'). Это не делает паузу в конвейере, как в случае "когда: вручную", но я все равно не хотел, чтобы это делалось.

Вот документы: https://docs.gitlab.com/ee/ci/yaml/#only-and-except-complex и https://docs.gitlab.com/ee/ci/variables/

Надеюсь, это поможет!

Ответ 3

Определение двух заданий упрощается с помощью параметра конфигурации extends в GitLab 11.3. Это альтернатива использованию якорей YAML, немного более гибкая и удобочитаемая:

.deploy_common:
  # common config

deploy_master_CD:
  extends: .deploy_common
  only:
    refs:
      - master

deploy_manual:
  extends: .deploy_common
  when: manual

Ответ 4

Точная вещь, которую вы хотите, на данный момент невозможна. Несмотря на то, что 2 задания (одно с одним only: master и с другим, when: manual должно предоставить альтернативу.

Если вы поместите их в одну и ту же сцену, я не думаю, что это путающе.

Вы также можете использовать некоторые специальные функции yaml, такие как якоря, чтобы оставаться сухими.