в GitLab

GitLab CI: Часть 10 (финал), этап cleanup в .gitlab-ci.yml


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

Давайте разберемся с этапом удаления ненужных контейнеров, которые использовались при сборке проекта, его тестировании, упаковке и деплое!

Инструкции для выполнения последнего этапа в цепочке continuous integration выглядят следующим образом:

...
cleanup:
  stage: cleanup
  when: always
  script:
    - docker-compose -f docker/docker-compose-build.yml down
  only:
    - develop
    - docker

Как и ранее, данный шаг будет выполняться для веток develop и docker, однако благодаря параметру when: always он будет выполнен вне зависимости от результатов выполнения предыдущих этапов (неважно, удалось ли собрать docker-образ или протестировать код — «убираем» за собой всегда).

Основная задача также довольно проста — остановить и удалить docker-контейнеры, описанные в конфигурационном файле docker-compose-build.yml, который мы рассматривали в этой статье.

«Уборка» занимает 15-20 секунд, а подробности выполнения этапа cleanup на вкладке 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 testing (2610)...
Downloading artifacts from coordinator... ok        id=2610 responseStatus=200 OK token=uv5PAJbp
Downloading artifacts for compile (2609)...
Downloading artifacts from coordinator... ok        id=2609 responseStatus=200 OK token=ERugScWJ
$ docker-compose -f docker/docker-compose-build.yml down
Stopping memcached ...
Stopping redis ...
Stopping php-fpm ...
Stopping workspace ...
Stopping websocket ...
Stopping websocket ... done
Stopping memcached ... done
Stopping redis ... done
Stopping php-fpm ... done
Stopping workspace ... done
Removing memcached ...
Removing redis ...
Removing php-fpm ...
Removing node ...
Removing workspace ...
Removing websocket ...
Removing application ...
Removing application ... done
Removing workspace ... done
Removing memcached ... done
Removing php-fpm ... done
Removing redis ... done
Removing websocket ... done
Removing node ... done
Removing network docker_default
Build succeeded

Если собрать все наши этапы, которые мы подробно рассматривали на протяжении всего цикла статей о GitLab CI, в один файл, то у нас получится следующее:

image: registry.gitlab.lc:5000/develop/ed:tmaier-dc-ssh

services:
  - registry.gitlab.lc:5000/develop/ed:my-docker-dind

variables:
  DOCKER_DRIVER: overlay
  CONTAINER_RELEASE_IMAGE: $CI_REGISTRY/develop/ed:$CI_COMMIT_REF_SLUG.sources.last
  BUILD: docker-compose -f docker/docker-compose-build.yml
  DC_FILE: ./docker/docker-compose-staging.yml
  ENV_FILE: ./docker/.env.staging.lc

stages:
  - spawn
  - build
  - test
  - release
  - deploy
  - cleanup

spawn_containers:
  stage: spawn
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  script:
    - set -o allexport; . ./docker/.env.staging.lc
    - $BUILD up -d
  only:
    - develop
    - docker

compile:
  stage: build
  script:
    - cp -u .env.develop .env
    - $BUILD exec --user www-data -T workspace sh -c "composer install"
    - $BUILD exec --user www-data -T workspace sh -c "./zf routes compile"
    - $BUILD exec --user www-data -T workspace sh -c "./zf cache clean-modified-content"
    - $BUILD run -T --rm node sh -c "npm install --production && grunt install-build --no-dev"
    - $BUILD exec --user www-data -T workspace sh -c "./zf user-default-avatar"
  cache:
    key: ${CI_COMMIT_REF_NAME}
    paths:
      - node_modules/
      - vendor/
  artifacts:
    paths:
    - vendor/
    - public/dsd/js/utils/routes.js
    - bin/
    - .env
    - public/default_img/user/en/
    - public/default_img/user/ru/
    - public/dsd/css/style.css
    - public/dsd/css/style.css.map
    - public/dsd/mix/tmp-pages-bundle/
    - public/dsd/js/bundles/
    - public/dsd/js/templates.hbs.js
    - public/dsd/js/templates.html.js
    - public/dsl/css/
    - public/dsl/js/bundles/
    - public/dsm/css/ltr-style.css
    - public/dsm/css/ltr-style.css.map
    - public/dsm/css/rtl-style.css
    - public/dsm/css/rtl-style.css.map
    - public/dsm/js/main-build.js
    - public/dsm/js/main-build.js.map
    - public/vendor/
    when: on_success
    expire_in: 1h
  only:
    - develop
    - docker

testing:
  stage: test
  dependencies:
  - compile
  script:
    - $BUILD exec --user www-data -T workspace sh -c "./bin/phpmetrics \"./\"  --exclude=\"node_modules|bin|log|temp|var|vendor|public|www|tests\" --report-html=./build"
  artifacts:
    paths:
    - build/all.html
    - build/complexity.html
    - build/coupling.html
    - build/css/
    - build/images/
    - build/index.html
    - build/js/
    - build/loc.html
    - build/oop.html
    - build/panel.html
    - build/relations.html
    - build/violations.html
    when: on_success
    expire_in: 1h
  only:
    - develop
    - docker

release-image:
  stage: release
  dependencies:
  - compile
  - testing
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  script:
    - docker build -t $CONTAINER_RELEASE_IMAGE -f Dockerfile . --build-arg BRANCH_NAME=$CI_COMMIT_REF_SLUG
  after_script:
    - docker push $CONTAINER_RELEASE_IMAGE
  only:
    - develop
    - docker

deploy-to-review:
  stage: deploy
  before_script:
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
  script:
    - scp $ENV_FILE $DC_FILE 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

deploy-to-prod:
  stage: deploy
  script:
    - echo "Deployed!" # здесь должен быть настоящий скрипт деплоя
  environment:
    name: production
    url: https://www.example.com/
  only:
    - develop
    - docker
  when: manual

cleanup:
  stage: cleanup
  when: always
  script:
    - $BUILD down
  only:
    - develop
    - docker

На этом все, буду рад любым уточнениям и усовершенствованиям, конструктивная критика также приветствуется.

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

  1. Евгений, спасибо большое, замечательный цикл статей. Более подробного разбора запиливания Gitlab CI в инете и не гуглится, а уж тем более с установкой через docker-compose в 5 разных контейнеров.
    У меня по прежнему только один вопрос, как насчет попробовать прикрутить https, точнее как при этом заставить работать registry? Я уже несколько недель бьюсь с сертификатами, что я только ни пробовал — не получается нифига.
    Без https — пожалуйста все стартует с пол-пинка, к registry коннектится. Но стоит поднять https — сам гитлаб работает норм, а к регистри законнектиться ну ни в какую прям.
    Может быть есть желание и возможность покопать в эту сторону?