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

Jun 12, 2017 08:30 · 813 words · 4 minute read gitlab gitlab ci

В продолжении цикла о настройке GitLab CI после этапов сборки и тестирования проекта мы рассмотрим этап подготовки docker-образа с исходниками и его загрузку в локальный docker-registry.

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

Инструкции для этапа подготовки 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
...

Задача называется release-image, для корректного выполнения действий нам необходимы артефакты с этапов compile и testing (зависимости описаны в секции dependencies). Запускать данные действия будем только для веток develop и docker.

Основная команда данного этапа уже привычно описана в секции script и выполняет сборку docker-образа из Dockerfile с аргументом BRANCH_NAME (для каждой из наших веток будет отличаться как имя образа, так и код). Имя docker-образа — значение переменной $CONTAINER_RELEASE_IMAGE, которая также описывается в конфигурационном файла .gitlab-ci.yml:

...
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY/develop/ed:$CI_COMMIT_REF_SLUG.sources.last
...

Примечание. Переменные $CI_REGISTRY и $CI_COMMIT_REF_SLUG — зарезервированные, подробности о них здесь.

Перед выполнением основной команды необходимо залогиниться в локальный docker-registry (секция before_script), а после — выполнить пуш образа в этот самый реджистри (секция after_script).

Как мы уже знаем, для сборки docker-образа необходим Dockerfile, и в нашем проекте он выглядит так:

FROM busybox
 
ARG BRANCH_NAME=
 
COPY ./bin /var/www/${BRANCH_NAME}/bin
COPY ./build /var/www/${BRANCH_NAME}/build
COPY ./config /var/www/${BRANCH_NAME}/config
COPY ./data /var/www/${BRANCH_NAME}/data
COPY ./.env /var/www/${BRANCH_NAME}/
COPY ./grunt /var/www/${BRANCH_NAME}/grunt
COPY ./init_autoloader.php /var/www/${BRANCH_NAME}/
COPY ./library /var/www/${BRANCH_NAME}/library
COPY ./module /var/www/${BRANCH_NAME}/module
COPY ./postcss.config.js /var/www/${BRANCH_NAME}/
COPY ./public /var/www/${BRANCH_NAME}/public
COPY ./vendor /var/www/${BRANCH_NAME}/vendor
COPY ./zf /var/www/${BRANCH_NAME}/
 
RUN mkdir -p /var/www/${BRANCH_NAME}/public/static && chmod 777 /var/www/${BRANCH_NAME}/public/static
 
VOLUME /var/www/${BRANCH_NAME}

Сборка образа и его загрузка в реджистри занимает полторы минуты (01:33), а подробности выполнения задачи выглядят следующим образом:

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
$ docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
Login Succeeded
$ docker build -t $CONTAINER_RELEASE_IMAGE -f Dockerfile . --build-arg BRANCH_NAME=$CI_COMMIT_REF_SLUG
Sending build context to Docker daemon 831.7 MB


Step 1 : FROM busybox
---> 00f017a8c2a6
Step 2 : ARG BRANCH_NAME=
---> Using cache
---> dbd4f24f52ff
Step 3 : COPY ./bin /var/www/${BRANCH_NAME}/bin
---> Using cache
---> 83141630cdd0
Step 4 : COPY ./build /var/www/${BRANCH_NAME}/build
---> d39bc08c2d34
Removing intermediate container 0887ba1afffc
Step 5 : COPY ./config /var/www/${BRANCH_NAME}/config
---> b23cb824e69b
Removing intermediate container b4228d5c356a
Step 6 : COPY ./data /var/www/${BRANCH_NAME}/data
---> 321a3980719a
Removing intermediate container 941a1b76bc8e
Step 7 : COPY ./.env /var/www/${BRANCH_NAME}/
---> c9848d18aef2
Removing intermediate container 8a95ad39b960
Step 8 : COPY ./grunt /var/www/${BRANCH_NAME}/grunt
---> f18c968ae7b0
Removing intermediate container c6cbf022aa64
Step 9 : COPY ./init_autoloader.php /var/www/${BRANCH_NAME}/
---> 65660fb6a312
Removing intermediate container 501b859fb30b
Step 10 : COPY ./library /var/www/${BRANCH_NAME}/library
---> 7d2ece63b935
Removing intermediate container d6b08c7b7e9d
Step 11 : COPY ./module /var/www/${BRANCH_NAME}/module
---> 3414dfa5e42e
Removing intermediate container 4843c9fb068d
Step 12 : COPY ./postcss.config.js /var/www/${BRANCH_NAME}/
---> 9859d31f5993
Removing intermediate container b3713f4566f2
Step 13 : COPY ./public /var/www/${BRANCH_NAME}/public
---> de07d12ee599
Removing intermediate container 6ead5e5eef1a
Step 14 : COPY ./vendor /var/www/${BRANCH_NAME}/vendor
---> b39faede905d
Removing intermediate container af641ae07861
Step 15 : COPY ./zf /var/www/${BRANCH_NAME}/
---> 85be2ac48226
Removing intermediate container 62a10fc2986e
Step 16 : RUN mkdir -p /var/www/${BRANCH_NAME}/public/static && chmod 777 /var/www/${BRANCH_NAME}/public/static
---> Running in b48c3ec2346f
---> 07c61cd34160
Removing intermediate container b48c3ec2346f
Step 17 : VOLUME /var/www/${BRANCH_NAME}
---> Running in 5d16383b12d2
---> 7fa41b498273
Removing intermediate container 5d16383b12d2
Successfully built 7fa41b498273
Running after script...
$ docker push $CONTAINER_RELEASE_IMAGE
The push refers to a repository [registry.gitlab.lc:5000/develop/ed]
c35dfd0dbf07: Preparing
344c23cb48e5: Preparing
e848528b313f: Preparing
d3dbf156ad15: Preparing
4d1c30c5a09b: Preparing
9b5407d29f46: Preparing
05bcfb1422a4: Preparing
390f66fe3f1a: Preparing
b06640f7b834: Preparing
98f0b7187a41: Preparing
57da43348ef6: Preparing
4d362f221381: Preparing
3cbbd6721a2c: Preparing
ff8efd539e29: Preparing
c0de73ac9968: Preparing
390f66fe3f1a: Waiting
4d362f221381: Waiting
3cbbd6721a2c: Waiting
b06640f7b834: Waiting
98f0b7187a41: Waiting
ff8efd539e29: Waiting
57da43348ef6: Waiting
c0de73ac9968: Waiting
9b5407d29f46: Waiting
c35dfd0dbf07: Pushed
4d1c30c5a09b: Pushed
344c23cb48e5: Pushed
05bcfb1422a4: Pushed
390f66fe3f1a: Pushed
b06640f7b834: Pushed
98f0b7187a41: Pushed
4d362f221381: Pushed
57da43348ef6: Pushed
3cbbd6721a2c: Pushed
ff8efd539e29: Layer already exists
c0de73ac9968: Layer already exists
9b5407d29f46: Pushed
e848528b313f: Pushed
d3dbf156ad15: Pushed
develop.sources.last: digest: sha256:fdea81e5367ba5c37f1a19c4bdb0900b0702ab38c8b4d675a5305d03eacd2bfe size: 3455
Build succeeded

На этом этап подготовки docker-образа завершается, а в следующей статье мы рассмотрим процесс деплоя данного образа на ревью (rewiev).

tweet Share