в GitLab

GitLab CI: Часть 7, этап test в .gitlab-ci.yml


Продолжаем цикл статей о настройке процесса continuous integration в GitLab — теперь, благодаря использованию артефактов, мы можем передать на этап тестирования все файлы, созданные на этапе сборки проекта.

Давайте разберемся с этапом тестирования в GitLab CI на примере phpmetrics — инструмента для визуализации качества кода!

В специальном файле .gitlab-ci.yml, который находится в корне проекта, инструкции для этапа тестирования будут выглядеть следующим образом:

...
testing:
  stage: test
  dependencies:
  - compile
  script:
    - docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./bin/phpmetrics \"./\"  --exclude=\"node_modules|bin|log|temp|var|vendor|public|www|tests\" --report-html=./build"
  artifacts:
    paths:
    - build/all.html
    - build/complexity.html
    - build/coupling.html
    - build/css/
    - build/images/
    - build/index.html
    - build/js/
    - build/loc.html
    - build/oop.html
    - build/panel.html
    - build/relations.html
    - build/violations.html
    when: on_success
    expire_in: 1h
  only:
    - develop
    - docker
...

Здесь уже много знакомых нам секций и ключевых слов, которые мы рассматривали ранее. Единственное, что мы еще не встречали — секция dependencies (зависимости). В этой секции следует указывать с каких заданий брать артефакты (как раз в прошлой статье мы создавали артефакты для задания compile из этапа build).

Так как анализатор кода phpmetrics в процессе выполнения также создает свои файлы, которые нужно передавать на следующие этапы GitLab CI, мы воспользуемся артефактами и здесь.

Самый первый запуск этапа тестирования прошел неудачно, eсли посмотреть подробности, то причину найти легко:

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...
Removing .env
Removing .happypack/
Removing bin/
Removing node_modules/
Removing public/default_img/user/en/
Removing public/default_img/user/ru/
Removing public/dsd/css/style.css
Removing public/dsd/css/style.css.map
Removing public/dsd/js/bundles/
Removing public/dsd/js/templates.hbs.js
Removing public/dsd/js/templates.html.js
Removing public/dsd/js/utils/routes.js
Removing public/dsd/mix/tmp-pages-bundle/
Removing public/dsl/css/
Removing public/dsl/js/bundles/
Removing public/dsm/css/ltr-style.css
Removing public/dsm/css/ltr-style.css.map
Removing public/dsm/css/rtl-style.css
Removing public/dsm/css/rtl-style.css.map
Removing public/dsm/js/main-build.js
Removing public/dsm/js/main-build.js.map
Removing public/vendor/
Removing vendor/
HEAD is now at c48c8ebbba Update .gitlab-ci.yml
From http://gitlab.lc:10087/develop/ed
* [new branch]            cherry-pick-0b7d95a9 -> origin/cherry-pick-0b7d95a9
Checking out c48c8ebb as docker...
Skipping Git submodules setup
Downloading artifacts for compile (1665)...
Downloading artifacts from coordinator... ok        id=1665 responseStatus=200 OK token=vYmjzKY8
$ docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./bin/phpmetrics \"./\"  --exclude=\"node_modules|bin|log|temp|var|vendor|public|www|tests\" --report-html=./build"
sh: 1: ./bin/phpmetrics: not found
ERROR: Build failed: exit code 1

После того, как причина была устранена, этап тестирования выполнился успешно, а подробности выполнения выглядели так:

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...
Removing .env
Removing .happypack/
Removing bin/
Removing node_modules/
Removing public/default_img/user/en/
Removing public/default_img/user/ru/
Removing public/dsd/css/style.css
Removing public/dsd/css/style.css.map
Removing public/dsd/js/bundles/
Removing public/dsd/js/templates.hbs.js
Removing public/dsd/js/templates.html.js
Removing public/dsd/js/utils/routes.js
Removing public/dsd/mix/tmp-pages-bundle/
Removing public/dsl/css/
Removing public/dsl/js/bundles/
Removing public/dsm/css/ltr-style.css
Removing public/dsm/css/ltr-style.css.map
Removing public/dsm/css/rtl-style.css
Removing public/dsm/css/rtl-style.css.map
Removing public/dsm/js/main-build.js
Removing public/dsm/js/main-build.js.map
Removing public/vendor/
Removing vendor/
HEAD is now at 635e14c14a Merge branch 'develop' into 'develop'
Checking out 635e14c1 as develop...
Skipping Git submodules setup
Downloading artifacts for compile (2609)...
Downloading artifacts from coordinator... ok        id=2609 responseStatus=200 OK token=ERugScWJ
$ docker-compose -f docker/docker-compose-build.yml exec --user www-data -T workspace sh -c "./bin/phpmetrics \"./\"  --exclude=\"node_modules|bin|log|temp|var|vendor|public|www|tests\" --report-html=./build"
   0/2634 [>---------------------------]   0% < 1 sec
 263/2634 [==>-------------------------]   9% 9 secs
 526/2634 [=====>----------------------]  19% 9 secs
 789/2634 [========>-------------------]  29% 14 secs
1052/2634 [===========>----------------]  39% 22 secs
1315/2634 [=============>--------------]  49% 26 secs
1578/2634 [================>-----------]  59% 34 secs
1841/2634 [===================>--------]  69% 38 secs
2104/2634 [======================>-----]  79% 43 secs
2367/2634 [=========================>--]  89% 49 secs
2630/2634 [===========================>]  99% 56 secs
2634/2634 [============================] 100% 56 secsLOC
   Lines of code                               147800
   Logical lines of code                       90246
   Comment lines of code                       57645
   Average volume                              430.79
   Average comment weight                      32.05
   Average intelligent content                 32.05
   Logical lines of code by class              52
   Logical lines of code by method             13

Object oriented programming
   Classes                                     1751
   Interface                                   361
   Methods                                     7194
   Methods by class                            4.11
   Lack of cohesion of methods                 1.27
   Average afferent coupling                   2.6
   Average efferent coupling                   4.7
   Average instability                         0.69

Complexity
   Average Cyclomatic complexity by class      3.34
   Average Relative system complexity          230.73
   Average Difficulty                          4.91

Bugs
   Average bugs by class                       0.14
   Average defects by class (Kan)              0.4

Violations
   Critical                                    0
   Error                                       65
   Warning                                     207
   Information                                 124

HTML report generated in "./build" directory

Done
Uploading artifacts...
build/all.html: found 1 matching files            
build/complexity.html: found 1 matching files     
build/coupling.html: found 1 matching files       
build/css/: found 4 matching files                
build/images/: found 3 matching files             
build/index.html: found 1 matching files          
build/js/: found 7 matching files                 
build/loc.html: found 1 matching files            
build/oop.html: found 1 matching files            
build/panel.html: found 1 matching files          
build/relations.html: found 1 matching files      
build/violations.html: found 1 matching files     
Uploading artifacts to coordinator... ok            id=2610 responseStatus=201 Created token=uv5PAJbp
Build succeeded

Данный этап занял чуть больше минуты (01:14). После успешного тестирования кода самое время приступить к сборке образа для деплоя — этим мы и займемся в следующей статье.

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

  1. Какие варианты просмотра полученных html-отчетов, может есть какой-то плагин для gitlab предусматривающий это?

    • Плагинов для гитлаба нет, результаты можно простотреть прямо в логе выполнения задачи (не очень удобно). В своем примере я генерирую отчеты и складываю их в каталог build, так они попадают в docker-образ с исходниками. После деплоя такого образа, результаты можно смотреть прямо в браузере…

      В последней версии гитлаб вроде как добавили возможность скачивать артефакты работ (отчеты это и есть артефакты работы test) — сам еще не проверял, но можно эти отчеты скачать нажатием на кнопку и открыть в любом браузере