в GitLab

GitLab CI: Часть 9, этап deploy в .gitlab-ci.yml (продолжение)


В данной статье цикла о continuous integration и особенностях ее реализации в GitLab продолжаем максимально подробно разбирать этап деплоя изменений на ревью с помощью docker-образов.

Давайте разберемся с содержимым файла docker-compose-staging.yml и посмотрим, что у нас получилось!

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

version: '2'
services:
### Applications Code Container #############################
    applications:
        container_name: application
        image: registry.gitlab.lc:5000/develop/ed:develop.sources.last
### Applications1 Code Container ############################
    applications1:
        container_name: application1
        image: registry.gitlab.lc:5000/develop/ed:docker.sources.last
### PHP-FPM Container #######################################
    php-fpm:
        container_name: php-fpm
        image: registry.gitlab.lc:5000/develop/ed:php-fpm-ed-sq
        volumes_from:
            - applications
            - applications1
        expose:
            - "9000"
### Nginx Server Container ##################################
    nginx:
        container_name: nginx
        image: registry.gitlab.lc:5000/develop/ed:nginx-ed-sq
        volumes_from:
            - applications
            - applications1
        depends_on:
            - "websocket"
        ports:
            - "${HTTP_PORT}:80"
            - "443:443"
        links:
            - php-fpm
### Redis Container #########################################
    redis:
        container_name: redis
        image: registry.gitlab.lc:5000/develop/ed:redis-ed-sq
        volumes:
            - redis:/data
        ports:
            - "6379:6379"
        links:
            - php-fpm
### Memcached Container #####################################
    memcached:
        container_name: memcached
        image: registry.gitlab.lc:5000/develop/ed:memcached-ed-sq
        volumes:
            - memcached:/var/lib/memcached
        ports:
            - "11211:11211"
        links:
            - php-fpm
### Websocket Container ######################################
    websocket:
        container_name: websocket
        restart: always
        image: registry.gitlab.lc:5000/develop/ed:websocket-ed-sq
        depends_on:
            - "redis"
        environment:
            - WS_PORT=${WS_PORT}
            - REDIS_HOST=${REDIS_HOST}
            - REDIS_PORT=${REDIS_PORT}
            - REDIS_PASS=${REDIS_PASS}
        volumes_from:
            - applications
            - applications1
        ports:
            - "${WS_PORT}:${WS_PORT}"
### SDCV Container ##########################################
    sdcv:
        container_name: sdcv
        image: registry.gitlab.lc:5000/develop/ed:sdcv-ed-sq
        ports:
            - "9095:9095"
### Volumes Setup ###########################################
volumes:
    memcached:
        driver: "local"
    redis:
        driver: "local"

На мой взгляд, содержимое данного файла не требует дополнительных пояснений, однако если у вас возникнут вопросы — буду рад ответить на них в комментариях.

На вкладке pipelines подробности выполнения этапа деплоя выглядят так:

Running with gitlab-ci-multi-runner 1.10.0 (4a71a97)
Using Docker executor with image registry.gitlab.lc:5000/develop/ed:tmaier-dc-ssh ...
Starting service registry.gitlab.lc/develop/ed:my-docker-dind ...
Using locally found image version due to if-not-present pull policy
Waiting for services to be up and running...
Using locally found image version due to if-not-present pull policy
Running on runner-9e68759f-project-8-concurrent-0 via c7662d5025ba...
Fetching changes...
Removing .env
Removing bin/
Removing build/all.html
Removing build/complexity.html
Removing build/coupling.html
Removing build/css/
Removing build/images/
Removing build/index.html
Removing build/js/
Removing build/loc.html
Removing build/oop.html
Removing build/panel.html
Removing build/relations.html
Removing build/violations.html
Removing public/default_img/user/en/
Removing public/default_img/user/ru/
Removing public/dsd/css/style.css
Removing public/dsd/css/style.css.map
Removing public/dsd/js/bundles/
Removing public/dsd/js/templates.hbs.js
Removing public/dsd/js/templates.html.js
Removing public/dsd/js/utils/routes.js
Removing public/dsd/mix/tmp-pages-bundle/
Removing public/dsl/css/
Removing public/dsl/js/bundles/
Removing public/dsm/css/ltr-style.css
Removing public/dsm/css/ltr-style.css.map
Removing public/dsm/css/rtl-style.css
Removing public/dsm/css/rtl-style.css.map
Removing public/dsm/js/main-build.js
Removing public/dsm/js/main-build.js.map
Removing public/vendor/
Removing vendor/
HEAD is now at 635e14c14a Merge branch 'develop' into 'develop'
Checking out 635e14c1 as develop...
Skipping Git submodules setup
Downloading artifacts for compile (2609)...
Downloading artifacts from coordinator... ok        id=2609 responseStatus=200 OK token=ERugScWJ
Downloading artifacts for testing (2610)...
Downloading artifacts from coordinator... ok        id=2610 responseStatus=200 OK token=uv5PAJbp
$ eval $(ssh-agent -s)
Agent pid 14
$ ssh-add <(echo "$SSH_PRIVATE_KEY")
Identity added: /dev/fd/63 (/dev/fd/63)
$ scp $ENV_FILE $DC_FILE provisioner@staging.lc:~/docker
Warning: Permanently added 'staging.lc,192.168.0.140' (ECDSA) to the list of known hosts.
$ ssh provisioner@staging.lc 'bash -s' < ./docker/deploy.sh
Warning: Permanently added 'staging.lc,192.168.0.140' (ECDSA) to the list of known hosts.
Pulling applications (registry.gitlab.lc:5000/develop/ed:develop.sources.last)...
develop.sources.last: Pulling from develop/ed
Digest: sha256:fdea81e5367ba5c37f1a19c4bdb0900b0702ab38c8b4d675a5305d03eacd2bfe
Status: Downloaded newer image for registry.gitlab.lc:5000/develop/ed:develop.sources.last
Pulling applications1 (registry.gitlab.lc:5000/develop/ed:docker.sources.last)...
docker.sources.last: Pulling from develop/ed
Digest: sha256:a9ad02b5c1c92f40eb0f908954cbece15052b76b2d2f8a43964a26d88705f127
Status: Image is up to date for registry.gitlab.lc:5000/develop/ed:docker.sources.last
Pulling php-fpm (registry.gitlab.lc:5000/develop/ed:php-fpm-ed-sq)...
php-fpm-ed-sq: Pulling from develop/ed
Digest: sha256:b335cb7f1e29f120d38d2baa3b3f0c3681f24124858b79bffd6df7e1fdb4ccb5
Status: Image is up to date for registry.gitlab.lc:5000/develop/ed:php-fpm-ed-sq
Pulling redis (registry.gitlab.lc:5000/develop/ed:redis-ed-sq)...
redis-ed-sq: Pulling from develop/ed
Digest: sha256:07292eb9cc8e873b81ca3cfc4b1685b42fa5136ad185857a11e6a9168346deb2
Status: Image is up to date for registry.gitlab.lc:5000/develop/ed:redis-ed-sq
Pulling websocket (registry.gitlab.lc:5000/develop/ed:websocket-ed-sq)...
websocket-ed-sq: Pulling from develop/ed
Digest: sha256:fd9d07def9039da373e5fe4a1bf00b98f123f64c3f76eaa3aa0021f80456d3c5
Status: Image is up to date for registry.gitlab.lc:5000/develop/ed:websocket-ed-sq
Pulling nginx (registry.gitlab.lc:5000/develop/ed:nginx-ed-sq)...
nginx-ed-sq: Pulling from develop/ed
Digest: sha256:89fe4ff99bf343205418cd136dbb192e48a1905445d9a4b7751d11694141c9d3
Status: Image is up to date for registry.gitlab.lc:5000/develop/ed:nginx-ed-sq
Pulling memcached (registry.gitlab.lc:5000/develop/ed:memcached-ed-sq)...
memcached-ed-sq: Pulling from develop/ed
Digest: sha256:d6d57917ce5a6c01f570eb9b7b3b0205ef0c0100489cfbecbab2f28583a4b3f9
Status: Image is up to date for registry.gitlab.lc:5000/develop/ed:memcached-ed-sq
Stopping nginx ...
Stopping websocket ...
Stopping redis ...
Stopping memcached ...
Stopping php-fpm ...
Stopping memcached ... done
Stopping nginx ... done
Stopping websocket ... done
Stopping redis ... done
Stopping php-fpm ... done
Removing nginx ...
Removing websocket ...
Removing redis ...
Removing memcached ...
Removing php-fpm ...
Removing application ...
Removing application1 ...
Removing websocket ... done
Removing application1 ... done
Removing redis ... done
Removing php-fpm ... done
Removing application ... done
Removing memcached ... done
Removing nginx ... done
Removing network docker_default
Creating network "docker_default" with the default driver
Creating application1
Creating application
Creating php-fpm
Creating memcached
Creating redis
Creating websocket
Creating nginx
Build succeeded

Занимает все это действие чуть менее полутора минут (01:26).

Для быстрого доступа к сайту после деплоя можно воспользоваться вебинтерфейсом GitLab — достаточно перейти на вкладку «Pipelines -> Environments» и кликнуть мышкой по ссылке «Open».

В завершающей статье цикла о настройке GitLab CI мы рассмотрим этап удаления контейнеров и данных, использовавшихся при сборке проекта, а также увидим полную версию конфигурационного файла .gitlab-ci.yml.

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

  1. Добрый день, Евгений. Прежде всего хочу искренне поблагодарить за потраченное время на написание этого замечательного цикла статей, аналогов которых я не нашел в сети. Тема не простая, но объяснения очень доходчивы)
    У меня возникло 2 вопроса:
    1) Почему есть 2 контейнера applications и applications2 ?
    2) Почему используете links: php-fpm, если контейнеры находятся в одной сети default и имеют доступ к друг другу по умолчанию ?

    • Здравствуйте!
      Начну, пожалуй, со второго вопроса — это уже сейчас я понимаю, что использование links здесь бессмысленно, но во время написания статьи я еще до этого знания не добрался )))
      Что касается первого вопроса — два контейнера applications и applications2 используются потому, что процесс CI запускается для двух разных веток в репозитории, в которых код может отличаться (в зависимости от ветки собирается докер-образ с исходниками). Наличие двух контейнеров с кодом позволяет развернуть два сайта для тестирования

      • Спасибо за ответ. А есть помыслы как сделать review apps на каждую ветку? Т.е. динамически создавать любое количество окружений для ревью любых веток?

        • Буквально на днях такая задача возникла.
          Пока мыслей по этому поводу немного — самое простое и понятное, что можно сделать — nginx, обслуживающий много «серверов», где имя сервера будет регуляркой, (server_name ~^(www\.)?(?.+?).my.domain.com$;) а код будет попадать в корневой каталог (root_directory) через rsync (пример — https://gitlab.com/gitlab-examples/review-apps-nginx/).

          Но мне этот вариант не сильно подходит, так как требуют все окружения разворачивать в docker-контейнерах… А развернуть на одном хосте много разных окружений не получится хотя бы из-за портов nginx (если использовать одни и те же 80 и 443), а «костылить» разные порты пока не хочется…

          Вообщем, пока думаю. Если у вас будут идеи — пишите, буду благодарен!

          • Я вижу пока 2 варинта.
            1) Использовать выше описанную схему с server_name, но окружение будет едино для всех веток, т.е. контейнеры mysql, redis, php … будут обслуживать все ветки, индивидуальным будет только код и база данных. Но вариант далеко не идеальный.
            2) Использовать инструмент для управления контейнерами типа Kubernetes или надстройку над ним Openshift.

            Вы не рассматривали вариант с Openshift?

          • Нет, openshift не смотрел… Даже до кубернетеса полноценно не добрался — глянул одним глазом, показался сложным и я взялся за «родной» сворм…