Мы пытаемся разработать конвейер GitLab ci. У нас есть три задания: A, B и C. Мы хотим выполнить задание C только в том случае, когда выполняется либо A, либо B.
Как определить такое задание C?
Я пытался использовать needs
, но выдает ошибку, так как нужное задание не выполняется:
Found errors in your .gitlab-ci.yml:
'C' job needs 'A' job, but 'A' is not in any previous stage.
'C' job needs 'B' job, but 'B' is not in any previous stage.
Моя попытка:
C:
stage: push
image: alpine
tags:
- DOCKER
needs:
- job: B
artifacts: true
Насколько мне известно, не существует лаконичного встроенного способа сделать это, но ключевое слово needs: optional
может оказаться полезным в сочетании с правилами.
Я мог бы привести более полный пример, если бы вы разместили правила для заданий A и B. Давайте представим, что это правила, определенные для заданий A и B.
# Job runs only on the main branch
A:
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- when: never
B:
rules:
- if: $CI_COMMIT_BRANCH =~ /feature/*/i
- when: never
C:
stage: push
image: alpine
tags:
- DOCKER
needs:
- job: A
optional: true
artifacts: true
- job: B
optional: true
artifacts: true
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_BRANCH =~ /feature/*/i
- when: never
Имейте в виду, что если определенные правила допускают ситуацию, когда задание C запускается без запуска любого из зависимых заданий (A и B), оно не завершится автоматически, поскольку зависимые задания считаются необязательными.
В этом случае вам просто нужно будет использовать эти правила и в задании C, чтобы правила задания C представляли собой комбинацию правил заданий A и B.
правила для задания A и B основаны только на изменениях файлов, таких как:,changes: [folder/file_server/**/*] и нет специального правила для задания C