В этой статье хочу поделиться интеграцией с GitLab CI, кратко и без воды. Но, возможно инструкция вам не подойдет, потому что процессы у всех разные, а мы в своей компании готовим так:
В GitLab у вас есть только 1 способ - создать в своем репозитории файл .gitlab-ci.yml
У нас данный файл находится в таком виде:
# отключаю клонирование репозитория средствами gitlab-runner-a variables: GIT_STRATEGY: none stages: - build - test - deploy - delete - deleteButton building: stage: build when: manual script: - /commander.sh projectName=$CI_PROJECT_NAME env=test appVersion=$CI_COMMIT_REF_NAME build=true where=locally send on testing: stage: test when: manual script: - /commander.sh projectName=$CI_PROJECT_NAME env=test appVersion=$CI_COMMIT_REF_NAME configuration=true deploy=true switch=true where=test-server send to production: stage: deploy when: manual script: - /commander.sh projectName=$CI_PROJECT_NAME env=prod appVersion=$CI_COMMIT_REF_NAME configuration=true where=locally - /commander.sh projectName=$CI_PROJECT_NAME env=prod appVersion=$CI_COMMIT_REF_NAME deploy=true where=prod-server - /commander.sh projectName=$CI_PROJECT_NAME env=prod appVersion=$CI_COMMIT_REF_NAME migrate=true where=locally - /commander.sh projectName=$CI_PROJECT_NAME env=prod appVersion=$CI_COMMIT_REF_NAME switch=true where=prod-server # этап будет запускаться после того, как ветка проекта будет вмержена в мастер-ветку (пайплайн тригерится веб-хуком) delete build: stage: delete only: variables: - $actionName == "deleteBuild" script: - /commander.sh projectName=$CI_PROJECT_NAME appVersion=$CI_COMMIT_REF_NAME clean=true where=locally,test-server # бывает нужно вручную удалить сборку (например: мерж-реквест отменен) delete build button: stage: deleteButton when: manual script: - /commander.sh projectName=$CI_PROJECT_NAME appVersion=$CI_COMMIT_REF_NAME clean=true where=locally,test-server
Если Вам не понятны стадии описанные выше - напишите, я опишу тут почему так, а не иначе. Однако, сейчас хочется рассказать про интересный этап - удаление сборок при мерже веток.
На этот счет мы поступаем следующим образом:
а. при мерже ветки в мастер - удаляется сборка созданная для этой ветке:
б. при успешном деплое новой сборки (ветка master) на продакшен сервер:
И если пункт 2 можно легко реализовать в команде:
/commander.sh projectName=$CI_PROJECT_NAME env=prod appVersion=$CI_COMMIT_REF_NAME switch=true where=prod-server
То, пункт 1 нуждается в объяснении нюансов изложенных ниже.
1. Делаем так, чтобы в момент мержа мерж-реквеста в ветку мастер, GitLab отправлял запрос на адрес Вашего веб-сервера, например http://yapro.ru/gitlab
Для этого в GitLab, на странице проекта, переходим в Settings ➔ Integrations и создаем событие следующим образом:
Два важных момента:
2. Вы должны сделать так, чтобы вызов адреса http://yapro.ru/gitlab отправлял запрос тригерируя на GitLab-е запуск pipeline, например так:
http://gitlab.yapro.ru/api/v4/projects/32/ref/REF_NAME/trigger/pipeline?token=TOKEN&variables[actionName]=deleteBuild
32 - идентификатор проекта, его можно узнать в GitLab-е ➔ Проект ➔ Settings ➔ General:
REF_NAME - значение приходит из запроса, который выполняется по факту срабатывания события (выполнен мерж мерж-реквеста в ветку мастер - см. выше пункт 1), у меня это $requestParams['object_attributes']['source_branch']
TOKEN - секретный ключ, который GitLab будет проверять, чтобы идентифицировать Ваш запрос, данный ключ генерируется автоматически, когда Вы создаете триггер в GitLab-е ➔ Проект ➔ Settings ➔ CI /CD ➔ Pipeline triggers
actionName - имя переменной, которая обрабатывается в файле .gitlab-ci.yml (см. выше), но чтобы передача переменных заработала, данную переменную нужно объявить в GitLab-е ➔ Проект ➔ Settings ➔ CI /CD ➔ Variables
Итак, процесс настройки завершен, всем удачки.
p.s. запрос шага 2 можно посылать любым удобным способом и даже так:
curl -X POST \
-H "Content-Type: application/json" \
-d '{"token":"token", "ref":"master", "variables": {"ENVIRONMENT": "production", "ACTION": "release"}}' \
https://gitlab.com/api/v4/projects/:id/trigger/pipeline
Комментарии
Конечно без ваших конфиденциальных функций