Gitlab-CI: сборка и деплой docker контейнера на сервер

Имеется простое приложение на flask, работает в docker контейнере, разработка ведется в репозитории gitlab. Было решено максимально упростить процесс выката изменений на «продакшн». Сделал коммит, запушил, а далее все автоматически (ci должен собрать образ, залить его в registry, подключится к docker на «продакшн» сервере и обновить контейнер.

Сразу покажу gitlab-ci.yml

image: docker:18.09.7
services:
- docker:18.09.7-dind

stages:
- build
- deploy

before_script:
  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY

build:
  only:
    - pushes
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest

deploy:
  only:
    - pushes
  stage: deploy
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - cp $DOCKER_CACERT ~/.docker/ca.pem && cp $DOCKER_CERT ~/.docker/cert.pem && cp $DOCKER_KEY ~/.docker/key.pem
    - export DOCKER_HOST=tcp://MYSERVER.COM:2376 DOCKER_TLS_VERIFY=1
    - docker stop $CI_PROJECT_NAME || true
    - docker rm $CI_PROJECT_NAME || true
    - docker rmi $CI_REGISTRY_IMAGE:latest
    - docker pull $CI_REGISTRY_IMAGE:latest
  script:
    - docker run --name $CI_PROJECT_NAME -d
      -p 127.0.0.1:5000:5000 --restart unless-stopped
      -e DATABASE_URL="$DATABASE_URL"
      -e SECRET_KEY=$SECRET_KEY
      -e GOOGLE_OAUTH_CLIENT_ID=$GOOGLE_OAUTH_CLIENT_ID
      -e GOOGLE_OAUTH_CLIENT_SECRET=$GOOGLE_OAUTH_CLIENT_SECRET
      -e SENTRY_ENV=$SENTRY_ENV
      -e SENTRY_DSN="$SENTRY_DSN"
      $CI_REGISTRY_IMAGE:latest

Важные моменты по файлу.

  1. В before_script мы авторизируемся в локальном image registry
  2. only: pushes (сборка и деплой триггерится пушем в репозиторий, иначе если вы запушите 10 коммитов у вас запустится 10 процессов сборки)
  3. В секции deploy->before_script снова авторизируемся, но уже на нашем «продакшн» сервере при помощи сертификатов, которые должны быть добавлены как переменные (тип: file, 3 переменных: $DOCKER_CACERT (содержимое ca.pem), $DOCKER_CERT (содержимое client.pem), $DOCKER_KEY (содержимое cclient.key)) в настройках репозитория. Как включить удаленный доступ и сгенерировать сертификаты для docker я писал здесь.
  4. Измените строку «DOCKER_HOST=tcp://MYSERVER.COM:2376» на корректный адрес удаленного docker сервера и порт api.
  5. В секции script происходит запуск контейнера из только-что собранного image, с необходимыми для вашего приложения переменными окружения, измените их в соответствии с требованиями вашего софта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *