Сборка, тестирование и поставка docker образа в GitLab CI.

Приветствую вас дорогие мои читатели, давненько я ничего не писал в свой блог и поэтому, хотел бы сегодня поделиться с вами не большим рецептом который я к сожалению не от искал на просторах интернета.

Начать я хотел бы с описания задачи: мне для проекта на Symfony 3 нужно настроить автоматическую сборку, тестирование и поставку образа в приватный docker registry GitLab CI (Docker Runner).

Мне этого удалось добиться, хоть и не без головной боли но тем не менее. Вот так вот сейчас выглядит мой Pipeline для решения поставленной мной задачи:

Я хотел бы стразу оговориться о способе решения данной проблемы к сожалению GitLab не может шарить результат сборки образа между отдельными задачами, это собственно и было моей основной головной болью, пришлось сделать небольшой костыль, а именно для того, что бы сделать образ доступным между всеми последующими шагами после сборки docker образа на первом шаге я экспортирую образ из локального docker в общий для всего Pipeline GitLab CI кеш c помощью docker save и на каждом последующем шаге восстанавливаю его из кеша с помощью docker load. Полный листинг моего gitlab-ci.yml:


stages:
  - build
  - test
  - deploy

cache:
  key: "${CI_PIPELINE_ID}"
  untracked: true

services:
  - docker:dind

variables:
  DOCKER_IMAGE: "${DOCKER_REGISTRY_SERVER}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAMESPACE}:${CI_BUILD_REF_NAME}"
  PHP_CS_FIXER_URL: "https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v2.1.0/php-cs-fixer.phar"

docker:
  stage: build
  image: docker:latest
  script:
    - docker build --pull --compress -t "${DOCKER_IMAGE}" .
    - docker save --output docker-image.tar "${DOCKER_IMAGE}"

phpunit:
  stage: test
  image: docker:latest
  script:
    - docker load --input docker-image.tar
    - docker run -itd --entrypoint /bin/bash --name docker-container --env DEBIAN_FRONTEND=noninteractive "${DOCKER_IMAGE}"
    - docker exec -i docker-container apt update
    - docker exec -i docker-container apt install php-xdebug php-sqlite3 -qqy
    - docker exec -i docker-container bash -c "\"\${SYMFONY_APP}/vendor/bin/phpunit\" -c \"\${SYMFONY_APP}/phpunit.xml.dist\" --coverage-text --colors=never"

codestyle:
  stage: test
  image: docker:latest
  script:
    - docker load --input docker-image.tar
    - docker run -itd --entrypoint /bin/bash --name docker-container "${DOCKER_IMAGE}"
    - docker exec -i docker-container curl -L "${PHP_CS_FIXER_URL}" -o /usr/local/bin/php-cs-fixer
    - docker exec -i docker-container chmod a+x /usr/local/bin/php-cs-fixer
    - docker exec -i docker-container bash -c "cd \"\${SYMFONY_APP}\" && php-cs-fixer fix -v --diff --dry-run"

sandbox:
  stage: deploy
  image: docker:latest
  script:
    - docker load --input docker-image.tar
    - docker login -u "${DOCKER_REGISTRY_USERNAME}" -p "${DOCKER_REGISTRY_PASSWORD}" "${DOCKER_REGISTRY_SERVER}"
    - docker push "${DOCKER_IMAGE}"

Вот наверное и все, что я хотел бы сегодня вам рассказать. Если вам интересна данная тема то пишите в комментариях и я поделюсь с вами рецептом который я применяю для сборки, тестирования и поставки golang образа приложения, а так же запуска на нем acceptance тестов которые заботливо подготавливают для меня мои коллеги по несчастью тестировщики-автоматизаторы. Заметка у меня получилась достаточно краткой поэтому, если у вас остались вопросы то задавайте их в комментариях к данному посту и я с радостью на них вам отвечу.

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

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