GitLab CI: Часть 5, этап build в .gitlab-ci.yml (первый подход)
May 29, 2017 16:25 · 822 words · 4 minute read
В предыдущей статье цикла о настройке continuous integration в GitLab мы подробно рассмотрели первый этап (stage) описанный в файле .gitlab-ci.yml
, который должен создавать и запускать docker-контейнеры, необходимые для сборки проекта.
В данной статье давайте разберемся с первой работоспособной версией второго этапа — непосредственно сборки проекта!
В нашем случае, для сборки проекта с помощью GitLab CI достаточно выполнения таких инструкций из специального файла .gitlab-ci.yml
:
...
compile:
stage: build
script:
- cp -u .env.develop .env
- docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "composer install"
- docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./zf routes compile"
- docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./zf cache clean-modified-content"
- docker-compose -f docker/docker-compose-build.yml run -T --rm node sh -c "npm install --production && grunt install-build --no-dev"
- docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./zf user-default-avatar"
only:
- develop
- docker
...
Согласно данным инструкциям, будут выполнены следующие действия:
- из файла
.env.develop
создается файл.env
с переменными окружения; - в docker-контейнере workspace выполняется сборка бекенда (
composer
+ кастомные задачи по генерации роутов и очистке кеша); - в docker-контейнере node выполняется сборка фронтенда (
npm install
иgrunt install-build
); - в docker-контейнере workspace запускается кастомная задача по созданию аватаров.
Выполнение представленных здесь инструкций занимает 7-8 минут, детали на вкладке pipelines при успешном завершении выглядят примерно так (вывод очень сокращен):
Running with gitlab-ci-multi-runner 1.11.0 (33af656)
on lebed-build-runner (d58fbc5e)
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-d58fbc5e-project-8-concurrent-0 via e1470885895d...
Fetching changes...
HEAD is now at a06b8f0 Merge branch 'release/2.16' into 'release/2.16'
Checking out a06b8f01 as develop...
Skipping Git submodules setup
$ cp -u .env.develop .env
$ docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "composer install"
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 79 installs, 0 updates, 0 removals
- Installing hirak/prestissimo (0.3.5): Downloading (connecting...)Downloading (0%) Downloading (15%)Downloading (35%)Downloading (50%)Downloading (55%)Downloading (85%)Downloading (100%)
...
- Installing zendframework/zend-developer-tools (1.0.0): Downloading (connecting...)Downloading (100%)
Package sparkpost/php-sparkpost is abandoned, you should avoid using it. Use sparkpost/sparkpost instead.
Generating autoload files
$ docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./zf routes compile"
Routes compiled and copied to public/dsd/js/utils/routes.js
Now run: sudo -u root ./zf cache clean-modified-content
$ docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./zf cache clean-modified-content"
Unable to find: data/cache/cache_modified_content.php. Possible file already removed.
$ time docker-compose -f docker/docker-compose-build.yml run -u www-data -T --rm node sh -c "npm install --production && grunt install-build"
Starting application
npm WARN deprecated minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/chokidar/node_modules/fsevents):
...
>> Local Npm module "grunt-scss-lint" not found. Is it installed?
Running "clean:js" (clean) task
>> 0 paths cleaned.
Running "copy:js" (copy) task
Created 58 directories, copied 995 files
Running "sass:dsl" (sass) task
Running "sass:dsd" (sass) task
Running "sass:dsm" (sass) task
Asset Size Chunks Chunk Names
main.js 287 kB 2 [emitted] main
job.js 277 kB 8 [emitted] job
reviews.js 273 kB 9 [emitted] reviews
cpa-partners.js 271 kB 13 [emitted] cpa-partners
prices.js 274 kB 14 [emitted] prices
partner.js 293 kB 15 [emitted] partner
contact.js 269 kB 19 [emitted] contact
simple-page.js 267 kB 20 [emitted] simple-page
...
Running "handlebars:compile" (handlebars) task
>> 1 file created.
...
Running "dom_templates:compile" (dom_templates) task
File "./public/dsd/js/templates.html.js" created.
...
Asset Size Chunks Chunk Names
steps.js 8.98 kB 23 [emitted] steps
blog-list.js 123 kB 4 [emitted] blog-list
new-home.js 21.7 kB 5 [emitted] new-home
statistic.js 8.01 kB 15 [emitted] statistic
common.js 2.9 MB 46 [emitted] common
Done, without errors.
$ docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./zf user-default-avatar"
Done!
Если в процессе выполнения инструкций что-то пойдет не по плану, то в деталях можно будет увидеть ошибку, например:
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...
HEAD is now at 9f157903fd Merge branch 'docker' of ssh://gitlab.lc:23/develop/ed into docker
Checking out 9f157903 as docker...
Skipping Git submodules setup
$ cp -u .env.develop .env
$ time docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "composer install --no-dev"
The WS_PORT variable is not set. Defaulting to a blank string.
The Compose file './docker/docker-compose-build.yml' is invalid because:
services.websocket.ports is invalid: Invalid port ":", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ERROR: Build failed: exit code 1
В предложенном варианте инструкций для сборки проекта есть как минимум два проблемных момента: во-первых, файлы созданные на этом этапе (например, роуты public/dsd/js/utils/routes.js
) не передаются на следующий этап GitLab CI; во-вторых, 7-8 минут для сборки это достаточно много.
В следующей статье мы разберемся с этими недостатками и устраним их.