в GitLab

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


В предыдущей статье из цикла о настройке continuous integration в GitLab мы настроили первую работоспособную версию этапа сборки (build) проекта, однако в ней было два проблемных момента, которые мы подробоно разберем и устраним в данной статье.

Итак, давайте разберемся с кешем и артефактами в GitLab CI!

Чтобы ускорить время сборки проекта, которое в первоначальной реализации составляет 7-8 минут, мы будем использовать кеш. Решить вторую проблему (файлы созданные на этапе сборки не передаются на следующий этап GitLab CI) нам помогут артефакты (artifacts).

Теперь этап сборки проекта с помощью 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"
  cache:
    key: ${CI_COMMIT_REF_NAME}
    paths:
      - node_modules/
      - vendor/
  artifacts:
    paths:
    - vendor/
    - public/dsd/js/utils/routes.js
    - bin/
    - .env
    - public/default_img/user/en/
    - public/default_img/user/ru/
    - public/dsd/css/style.css
    - public/dsd/css/style.css.map
    - public/dsd/mix/tmp-pages-bundle/
    - public/dsd/js/bundles/
    - public/dsd/js/templates.hbs.js
    - public/dsd/js/templates.html.js
    - public/dsl/css/
    - public/dsl/js/bundles/
    - public/dsm/css/ltr-style.css
    - public/dsm/css/ltr-style.css.map
    - public/dsm/css/rtl-style.css
    - public/dsm/css/rtl-style.css.map
    - public/dsm/js/main-build.js
    - public/dsm/js/main-build.js.map
    - public/vendor/
    when: on_success
    expire_in: 1h
  only:
    - develop
    - docker
...

Действия, описанные в секции script остаются точно такими же, как и в предыдущей статье, а вот о секциях cache и artifacts мы поговорим подробнее.

В секции cache мы указываем раннеру кешировать содержимое каталогов node_modules и vendor, причем ключем кеша будет значение переменной CI_COMMIT_REF_NAME — имя ветки, для которой выполняются инструкции GitLab CI. Так как процесс continuous integration у нас настроен только для двух веток (develop и docker), то и кеш у них будет разным.

В секции artifacts мы указываем, что в случае успешного выполнения этапа сборки (build) проекта, необходимо все перечисленные каталоги и файлы сохранить для передачи на следующие этапы continuous integration. Храниться перечисленные файлы будут 1 час, после чего будут автоматически удалены с целью экономии места.

Выполнение инструкций с внесенными изменениями теперь займет менее двух минут (01:53), а детали на вкладке pipelines при успешном завершении будут такими (вывод очень сокращен):

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 635e14c14a Merge branch 'develop' into 'develop'
Checking out 635e14c1 as develop...
Skipping Git submodules setup
Checking cache for develop...
Successfully extracted cache
$ 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
Nothing to install or update
Package egeloen/http-adapter is abandoned, you should avoid using it. Use php-http/httplug instead.
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.
$ docker-compose -f docker/docker-compose-build.yml run -T --rm node sh -c "npm install --production && grunt install-build --no-dev"
Starting application
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?
>> Local Npm module "grunt-svgzr" not found. Is it installed?
>> Local Npm module "grunt-tinypng" 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!
Creating cache develop...
Created cache
Uploading artifacts...
vendor/: found 31919 matching files               
public/dsd/js/utils/routes.js: found 1 matching files
bin/: found 13 matching files                     
.env: found 1 matching files                      
public/default_img/user/en/: found 261 matching files
public/default_img/user/ru/: found 331 matching files
public/dsd/css/style.css: found 1 matching files  
public/dsd/css/style.css.map: found 1 matching files
public/dsd/mix/tmp-pages-bundle/: found 21 matching files
public/dsd/js/bundles/: found 48 matching files   
public/dsd/js/templates.hbs.js: found 1 matching files
public/dsd/js/templates.html.js: found 1 matching files
public/dsl/css/: found 47 matching files          
public/dsl/js/bundles/: found 47 matching files   
public/dsm/css/ltr-style.css: found 1 matching files
public/dsm/css/ltr-style.css.map: found 1 matching files
public/dsm/css/rtl-style.css: found 1 matching files
public/dsm/css/rtl-style.css.map: found 1 matching files
public/dsm/js/main-build.js: found 1 matching files
public/dsm/js/main-build.js.map: found 1 matching files
public/vendor/: found 1146 matching files         
Uploading artifacts to coordinator... ok            id=2609 responseStatus=201 Created token=ERugScWJ
Build succeeded

Особое внимание стоит обратить на последние строки — именно здесь можем увидеть, что все артефакты успешно созданы, загружены и будут использоваться на дальнейших этапах GitLab CI. В следующей статье рассмотрим этап тестирования исходного кода, например с использованием инструмента для визуализации качества кода phpmetrics.

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

    • Здравствуйте, Владимир!
      Вы абсолютно правы, но максимум что предлагают разработчики в таком случае — использовать регулярные выражения, например:

      ...
          paths:
          - target/*.war
      ...

      Официальная документация по артефактам здесь.

      Если вы найдете решение проблемы «динамических» артефактов — буду благодарен, если поделитесь.