GitLab CI: Часть 10 (финал), этап cleanup в .gitlab-ci.yml
Jun 26, 2017 08:32 · 812 words · 4 minute read
В завершении цикла статей о настройке 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
На этом все, буду рад любым уточнениям и усовершенствованиям, конструктивная критика также приветствуется.