в GitLab

GitLab CI: Часть 5, этап build в .gitlab-ci.yml (первый подход)


В предыдущей статье цикла о настройке 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 минут для сборки это достаточно много.

В следующей статье мы разберемся с этими недостатками и устраним их.

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