Как сделать условное ручное утверждение в рабочих процессах CircleCI 2.0

У меня есть простой случай использования, когда я хочу сделать ручное утверждение только для определенной ветви и / или тега.

Рабочий процесс с type:approval имеет фильтры, как и все другие задания, но задание foo, требующее одобрения вручную (или нет), будет использовать requires: ['approve'] а потом сильно связан с этим.

Это означает, что foo никогда не произойдет, если шаг утверждения не соответствует фильтру.

Итак... любой чистый обходной путь, без большого количества дубликатов в файле yaml?

Изменить: тот же вопрос на CircleCI Обсудить

1 ответ

Решение

Использование карты псевдонимов YAML

Это своего рода хак, но с картой псевдонимов YAML вы повторно используете свои шаги и создаете два отдельных пути рабочего процесса с разными фильтрами: один с утверждением, а другой без.

Вот полный пример:

version: 2.0

# Run job (defined in a YAML alias map, see http://yaml.org/type/merge.html)
run-core: &run-core
    docker:
      - image: circleci/node:8
    steps:
      - checkout
      - restore_cache: { key: 'xxxxx' }
      - run: npm install
      - save_cache: { key: 'xxxxx', paths: ['xxxx'] }
      - run: npm run build
      - run: npm run validate
      - deploy: ./scripts/deploy.sh

# Jobs (duplicate the same job, but with different names)
jobs:
  run:
    <<: *run-core
  run-with-approval:
    <<: *run-core

# This will allow manual approval and context
# See https://circleci.com/docs/2.0/workflows/#git-tag-job-execution
workflows:
  version: 2
  run:
    jobs:
      # Without approval (for all branches except staging)
      - run:
          context: org-global
          filters:
            branches: { ignore: 'staging' } # All branches except staging
            tags: { ignore: '/.*/' }        # Ignore all tags
      # With approval (only for tags and staging branch)
      - run-with-approval:
          context: org-global
          filters:
            tags: { only: '/.*/' }          # All branches and all tags
          requires: ['approve']             # But requires approval (which is filtering)
      - approve:
          type: approval
          filters:
            branches: { only: 'staging' }   # Ignore all branches except staging
            tags: { only: '/.*/' }          # All tags

Я надеюсь, что это поможет

Обновление этого вопроса более свежим ответом: CircleCI имеет предварительную версию API v2 (для поддержки CircleCI 2.1), который поддерживает, среди прочего, условные рабочие процессы (т.е. этап условного удержания)

условное форматирование рабочего процесса

- when:
    condition: << pipeline.parameters.test >>
    steps:
      - hold-step
Другие вопросы по тегам