Как делается деплой на гитлабе
Деплой в GitLab — это автоматизированный процесс развертывания приложения, который настраивается через файл .gitlab-ci.yml и выполняется в рамках пайплайна CI/CD. Основная идея: вы описываете этапы (стадии) сборки, тестирования и деплоя, а GitLab Runner выполняет их при каждом пуше в репозиторий или по расписанию. Для управления окружениями (staging, production) используются специальные секции в конфигурации, а для секретов — переменные CI/CD.
Как это работает
Пайплайн в GitLab состоит из джоб (jobs), каждая из которых принадлежит определенной стадии (stage). Стадии выполняются последовательно: сначала build, затем test, и только потом deploy. Если какая-то джоба завершается с ошибкой, последующие стадии не запускаются. Это позволяет гарантировать, что в продакшн попадает только протестированный код.
Для деплоя обычно создается отдельная джоба, которая запускает скрипты развертывания. Например, это может быть SSH-подключение к серверу, обновление Docker-образа, вызов API или использование Kubernetes.
Пример конфигурации
Базовый файл .gitlab-ci.yml для деплоя выглядит так:
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- echo "Building the application..."
# команды сборки, например: docker build -t myapp .
test_job:
stage: test
script:
- echo "Running tests..."
# команды тестирования, например: pytest
deploy_job:
stage: deploy
script:
- echo "Deploying to production..."
# команды деплоя, например: docker push myapp && ssh server 'docker pull && docker run'
environment:
name: production
url: https://yourproduction.url
Здесь `environment` определяет имя окружения и его URL. Это позволяет отслеживать деплои в интерфейсе GitLab и откатываться к предыдущим версиям.
## Управление окружениями и секретами
Окружения (environments) — это логические сущности, которые представляют целевые серверы или кластеры. Вы можете определить несколько окружений, например `staging` и `production`, и настроить автоматический деплой в зависимости от ветки. Для этого используются правила `only` или `rules`:
```yaml
deploy_staging:
stage: deploy
script:
- echo "Deploy to staging"
environment:
name: staging
only:
- develop
deploy_production:
stage: deploy
script:
- echo "Deploy to production"
environment:
name: production
only:
- mainСекреты (API-ключи, пароли) хранятся в переменных CI/CD. Их можно задать в настройках проекта (Settings → CI/CD → Variables) и использовать в скриптах как обычные переменные окружения:
deploy_job:
stage: deploy
script:
- curl -X POST -H "Authorization: Bearer $API_KEY" https://api.example.com/deploy
environment:
name: productionПеременные можно помечать как protected (доступны только для защищенных веток) и masked (скрыты в логах).
Подводные камни
- Права доступа: для деплоя на сервер нужен SSH-ключ или токен, который должен быть добавлен в переменные CI/CD. Не храните секреты прямо в
.gitlab-ci.yml. - Идемпотентность: скрипты деплоя должны быть безопасны для повторного запуска. Если деплой упал на середине, повторный запуск не должен ломать систему.
- Откаты: GitLab позволяет откатить деплой на предыдущую версию через интерфейс, но для этого нужно правильно настроить
environmentи использовать механизм деплоя, поддерживающий версионирование (например, Docker-образы с тегами). - Кэширование: если сборка и деплой используют общие артефакты, настройте
cacheилиartifacts, чтобы не пересобирать все заново.
Когда использовать
GitLab CI/CD подходит для большинства проектов, где нужна автоматизация деплоя. Он особенно удобен, если вы уже используете GitLab как хостинг репозитория. Для сложных сценариев (например, мультирегиональный деплой) можно комбинировать с Kubernetes и GitLab Agent.
Коротко
- Деплой в GitLab настраивается через
.gitlab-ci.ymlс описанием стадий и джоб. - Используйте
environmentдля управления окружениями иonly/rulesдля выбора веток. - Секреты храните в переменных CI/CD, а не в коде.
- Пайплайн запускается автоматически при пуше, если не заданы дополнительные правила.
- Для откатов и мониторинга настраивайте URL окружений и используйте теги версий.
Похожие вопросы
- Что такое неймспейс26%
- Чем отличаются HTTP и HTTPS26%
- Чем хочется заниматься с чем работать на данной позиции20%
- Какие бывают виды дополнительных контейнеров в поде20%
- Что такое факты в ansible20%
- Какие существуют Probe20%
- Каково ваше видение идеального workflow CI/CD20%
- В чём разница между git rebase и git merge20%