GitLab CI: Часть 9, этап deploy в .gitlab-ci.yml

Jun 15, 2017 08:31 · 504 words · 3 minute read gitlab gitlab ci

В предыдущей статье цикла о настройке GitLab continuous integration мы занимались сборкой docker-образа с исходниками проекта. После сборки и загрузки docker-образа в локальный docker-registry, мы можем использовать его для деплоя на ревью (review), продакшн (production) и т. д.

Давайте разберемся со следующим этапом из конфигурационного файла .gitlab-ci.yml — этапом деплоя!

Часть специального файла .gitlab-ci.yml, в которой описаны инстукции для этапа деплоя в нашем случае выглядит так:

...
deploy-to-review:
  stage: deploy
  before_script:
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
  script:
    - scp ./docker/.env.staging.lc ./docker/docker-compose-staging.yml provisioner@staging.lc:~/docker
    - ssh provisioner@staging.lc 'bash -s' < ./docker/deploy.sh
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://www.$CI_COMMIT_REF_SLUG.labs.lc
  only:
    - develop
    - docker
...

В статье про специальные docker-образы, которые используются в процессе GitLab CI, мы упоминали о необходимости установки ssh-клиента — он нам пригодится в момент деплоя на ревью (сервер с именем staging.lc). Как обычно, действия выполняются для веток develop и docker, но у нас появилась новая секция — environment — в которой описаны настройки окружения (отличаются, как не сложно догадаться, именем ветки).

Например, если GitLab CI выполняется для ветки docker, то после успешного деплоя сайт будет доступен из браузера по адресу https://www.docker.labs.lc. Больше подробностей об окружениях, в частности о динамических окружениях которые используются в данном примере можно прочесть здесь.

Примечание. Конечно же, ваш web-сервер должен быть настроен на обслуживание данных доменов и каталогов с кодом, но это тема для отдельной статьи.

Основные команды, описанные в секции script с помощью утилиты scp копируют на сервер staging.lc (в каталог ~/docker) файлы .env.staging.lc (переменные окружения) и docker-compose-staging.yml (настройки docker-контейнеров окружения), после чего выполняют на удаленном сервере скрипт deploy.sh (рассмотрим его позже).

Перед выполнением основных команд (секция before_script) с помощью команды ssh-add добавляется приватная часть ssh-ключа пользователя, под которым осуществляется подключение на удаленный сервер (provisioner). Так как это приватная часть ключа, ее необходимо скрыть от посторонних глаз с помощью так называемых “Secret Variables”.

Примечание. Secret Variables — These variables will be set to environment by the runner. So you can use them for passwords, secret keys or whatever you want.

“Секретные” переменные можно найти и добавить в вебинтерфейсе GitLab в настройках проекта (“Settings -> CI/CD Pipelines”).

Содержимое скрипта deploy.sh, который и выполняет основные действия деплоя на удаленный сервер выглядит так:

#!/bin/bash
DIRECTORY=~/docker
DC_FILE=docker-compose-staging.yml
ENV_FILE=.env.staging.lc
 
cd $DIRECTORY;
 
set -o allexport; . $ENV_FILE;
docker-compose -f $DC_FILE pull;
docker-compose -f $DC_FILE down;
docker-compose -f $DC_FILE up -d;

Как видим, скрипт выполняет несколько простых действий:

  • применяет переменные окружения из файла .env.staging.lc;
  • скачивает из локального docker-registry последние версии docker-образов (если образ не был изменен, то и скачиваться он не будет);
  • останавливает и удаляет все запущенные docker-контейнеры, описанные в файле docker-compose-staging.yml;
  • создает и запускает новые docker-контейнеры согласно описанию в docker-compose-staging.yml.

Файл с переменными окружения в данном случае выглядит так:

#########################################################
# Эти переменные используются для staging-окружения 
#########################################################
# UID пользователя запускающего контейнеры в хост-системе
PUID=1000
# порт WebSocket сервера
WS_PORT=8092
# включить/выключить xdebug
DEV_MODE=false
# включить/выключить htpasswd
ENABLE_HTPASSWD=false
# настройки Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASS=password
# порт HTTP сервера
HTTP_PORT=80

В продолжении данной статьи мы рассмотрим содержимое файла docker-compose-staging.yml, который используется для запуска контейнеров на ревью и увидим подробности выполнения данного этапа GitLab CI.

tweet Share