Как я могу запустить задание с помощью ручного нажатия или сообщения о фиксации

#gitlab #gitlab-ci

#gitlab #gitlab-ci

Вопрос:

У нас есть задание (развертывание в производство), которое мы обычно выбираем вручную после проверки этой сборки на промежуточном этапе. Однако очень редко у нас возникает проблема, которую мы случайно развернули, и мы хотим исправить как можно скорее. В этом случае мы запускаем тесты локально (намного быстрее) и помещаем [urgent-fix] в наше сообщение о фиксации, чтобы остановить выполнение тестов в CI (переходя сразу к сборке образа Docker и промежуточному развертыванию).

Что мы хотели бы сделать, так это то, что если мы поместим [urgent-fix] , это автоматически запустит производственное развертывание (обычно это when: manual шаг). Можем ли мы как-то этого добиться?

Ответ №1:

Похоже, вы можете использовать комбинацию синтаксиса only:variables и $CI_COMMIT_MESSAGE предопределенной переменной.

Грубая идея (непроверенная):

 .deploy_production: amp;deploy_production
  stage: deploy production
  script:
    - echo "I'm deploy production here"
  tags:
    - some special tag

deploy::manual:
  << *deploy_production
  when: manual
  allow_failure: false

deploy:urgent_fix:
  << *deploy_production
  only:
    variables:
      - $CI_COMMIT_MESSAGE =~/[urgent-fix]/
  

Комментарии:

1. Это идеально, спасибо! Мы уже используем шаблонные части, поэтому я должен был подумать об этом!

Ответ №2:

Начиная с GitLab версии 12.3 (~ сентябрь 2019), GitLab поставляется с «Гибкими правилами для конфигурации сборки CI». Функция предназначена для замены only/except функциональности и полностью документирована здесь.

С помощью rules: теперь вы можете полностью влиять на when: поведение вашего задания в зависимости от различных условий (в отличие от only/except: того, что заставляло вас создавать отдельные задания для ситуаций, подобных описанной в OP; см. Принятый ответ).

Например, вы можете сделать:

 deploy:
  rules:
    - if: '$CI_COMMIT_TITLE =~ /urgent-fix/'
      when: on_success
    - when: manual # default fallback
  script:
    - sh deploy.sh
  

Следует подчеркнуть то, что в приведенном выше примере я использовал $CI_COMMIT_TITLE вместо $CI_COMMIT_MESSAGE (см. Документы gitlab), чтобы избежать повторного появления строки «срочное исправление» в сообщении о фиксации, автоматически собранном в ходе git merge , которое затем случайно запустило бы задание повторно.

Отказ от ответственности: Пожалуйста, имейте в виду, что новая rules: функция вступает в конфликт с only/except: и, следовательно, требует от вас удаления only/except: вхождений. Также, пожалуйста, обратите внимание, что rules: это следует использовать только в сочетании с workflow: (читайте документы), чтобы избежать запуска нежелательных «отсоединенных» конвейеров.