#bash #gitlab #yaml #gitlab-ci #gitlab-ci-runner
#bash #gitlab #yaml #gitlab-ci #gitlab-ci-runner
Вопрос:
Возможно ли запустить конвейер благодаря Gitlab CI / CD после удаления ветки.
На самом деле я хочу отредактировать файл после удаления этой ветки.
Например, у меня есть два репозитория, R1 и R2.
В R1 у меня есть 2 ветки
- B1
- B2
Я хочу отредактировать файл из R2, когда B1 (который является веткой R1) будет удален.
Я знаю, как получить доступ к файлу и отредактировать его, но я не знаю, как я могу установить триггер для удаленной ветки.
Ответ №1:
Вы можете использовать окружения. Посмотрите на остановку среды.
GitLab автоматически запустит действие остановки, когда соответствующая ветвь будет удалена. Задание stop_review должно находиться на той же стадии, что и задание deploy_review, чтобы среда автоматически остановилась.
deploy_review:
stage: deploy
script:
- echo "Deploy a review app"
environment:
name: review/$CI_COMMIT_REF_NAME
url: https://$CI_ENVIRONMENT_SLUG.example.com
on_stop: stop_review
only:
- branches
except:
- master
stop_review:
stage: deploy
variables:
GIT_STRATEGY: none
script:
- echo "Implement editing files from R2 here"
when: manual
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
Это не совсем то, что вы хотите, но, возможно, более полезно для вас.
Комментарии:
1. Спасибо за ваш ответ, но stop_review не вызывается, когда я удаляю ветку, он будет вызываться только из ручного действия..
Ответ №2:
Ответ @Novikov — это именно то, что вам нужно, я тоже сначала думал, что это работает только вручную, но это работает автоматически. Я добавляю некоторую точность, которой нет в его ответе.
У меня была такая же утилита, как и у вас.
- Репозиторий-1 содержит код приложения.
- Repo-2 содержит код terraform для развертывания / уничтожения инфраструктуры приложения.
Конвейер Repo-1 запускает конвейер в моем репозитории-2, который будет развертывать приложение, и поэтому мне нужно было, чтобы удаление ветки в репозитории-1 запускало конвейер repo-2 для удаления среды.
Итак, я использовал environment
функцию, документация gitlab объясняет, как ее использовать.
deploy:
stage: deploy
script:
- {...}
environment:
name: deployment-${CI_COMMIT_BRANCH}
on_stop: destroy
destroy:
stage: deploy
variables:
GIT_STRATEGY: none
script:
- {...}
environment:
name: deployment-${CI_COMMIT_BRANCH}
action: stop
when: manual
ВАЖНО
- Я знаю, что мы используем
when: manual
, но это работает автоматически, когда ветка удаляется / объединяется. - Оба задания (развертывание — уничтожение) должны иметь одинаковую стадию.
- Для переменной GIT_STRATEGY необходимо установить значение none, иначе она попытается извлечь репозиторий из ветки, которая больше не существует, и задание завершится неудачей.
- Используйте динамическую переменную для имени среды, иначе это не сработает, каждая среда должна иметь свое собственное имя.
- Также важно уточнить, что
environment
функция не работает сtrigger
функцией, поэтому, если вы хотите запустить другой конвейер, вам нужно использовать API.
Источник: Документация Gitlab
Ответ №3:
Конвейер не может узнать, когда вы удалили ветку, ни через пользовательский интерфейс, ни через git branch -r -D
. Конвейеры запускаются как фиксатор на сервере gitlab (при нажатии), и когда вы нажимаете кнопку Запуска конвейера вручную в пользовательском интерфейсе.
При этом можно удалить ветку из задания конвейера, поэтому, хотя я оставлю это на ваше усмотрение, чтобы определить, как вы хотите это сделать, вы можете добавить задание, которое использует trigger
ключевое слово для запуска конвейера в R2 после того, как задание в вашем конвейере R1 удалит ветку.
Смотрите документы по триггеру:https://docs.gitlab.com/ee/ci/yaml/index.html#trigger и посмотрите на конвейеры с несколькими проектами.
Итак, в R2 у вас есть конвейер, который настроен на редактирование некоторого файла в R1, затем вы должны настроить задание, которое удаляет ветку B1, и выполнить это задание с помощью «триггерного задания», которое выполняется в R1 и отправляет команду в Gitlab API для запуска конвейера в R2.