Приветствую вас дорогие мои читатели, давненько я ничего не писал в свой блог и поэтому, хотел бы сегодня поделиться с вами не большим рецептом который я к сожалению не от искал на просторах интернета.
Начать я хотел бы с описания задачи: мне для проекта на 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 тестов которые заботливо подготавливают для меня мои коллеги по несчастью тестировщики-автоматизаторы. Заметка у меня получилась достаточно краткой поэтому, если у вас остались вопросы то задавайте их в комментариях к данному посту и я с радостью на них вам отвечу.