Ҷустуҷӯи артефактҳо ва таҳлили гузоришҳои JUnit бо GitLab.
Нест кардани фазои номҳои қаблан сохташуда.
Акнун - ба амал!
танзим
GitLab CI
Биёед бо як порча оғоз кунем .gitlab-ci.yaml, ки ҷойгиркунии барнома ва санҷишҳоро тавсиф мекунад. Рӯйхат хеле калон буд, бинобар ин он бо шарҳҳо пурра карда шуд:
variables:
# объявляем версию werf, которую собираемся использовать
WERF_VERSION: "1.0 beta"
.base_deploy: &base_deploy
script:
# создаем namespace в K8s, если его нет
- kubectl --context="${WERF_KUBE_CONTEXT}" get ns ${CI_ENVIRONMENT_SLUG} || kubectl create ns ${CI_ENVIRONMENT_SLUG}
# загружаем werf и деплоим — подробнее об этом см. в документации
# (https://werf.io/how_to/gitlab_ci_cd_integration.html#deploy-stage)
- type multiwerf && source <(multiwerf use ${WERF_VERSION})
- werf version
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- werf deploy --stages-storage :local
--namespace ${CI_ENVIRONMENT_SLUG}
--set "global.commit_ref_slug=${CI_COMMIT_REF_SLUG:-''}"
# передаем переменную `run_tests`
# она будет использоваться в рендере Helm-релиза
--set "global.run_tests=${RUN_TESTS:-no}"
--set "global.env=${CI_ENVIRONMENT_SLUG}"
# изменяем timeout (бывают долгие тесты) и передаем его в релиз
--set "global.ci_timeout=${CI_TIMEOUT:-900}"
--timeout ${CI_TIMEOUT:-900}
dependencies:
- Build
.test-base: &test-base
extends: .base_deploy
before_script:
# создаем директорию для будущего отчета, исходя из $CI_COMMIT_REF_SLUG
- mkdir /mnt/tests/${CI_COMMIT_REF_SLUG} || true
# вынужденный костыль, т.к. GitLab хочет получить артефакты в своем build-dir’е
- mkdir ./tests || true
- ln -s /mnt/tests/${CI_COMMIT_REF_SLUG} ./tests/${CI_COMMIT_REF_SLUG}
after_script:
# после окончания тестов удаляем релиз вместе с Job’ом
# (и, возможно, его инфраструктурой)
- type multiwerf && source <(multiwerf use ${WERF_VERSION})
- werf version
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- werf dismiss --namespace ${CI_ENVIRONMENT_SLUG} --with-namespace
# мы разрешаем падения, но вы можете сделать иначе
allow_failure: true
variables:
RUN_TESTS: 'yes'
# задаем контекст в werf
# (https://werf.io/how_to/gitlab_ci_cd_integration.html#infrastructure)
WERF_KUBE_CONTEXT: 'admin@stage-cluster'
tags:
# используем раннер с тегом `werf-runner`
- werf-runner
artifacts:
# требуется собрать артефакт для того, чтобы его можно было увидеть
# в пайплайне и скачать — например, для более вдумчивого изучения
paths:
- ./tests/${CI_COMMIT_REF_SLUG}/*
# артефакты старше недели будут удалены
expire_in: 7 day
# важно: эти строки отвечают за парсинг отчета GitLab’ом
reports:
junit: ./tests/${CI_COMMIT_REF_SLUG}/report.xml
# для упрощения здесь показаны всего две стадии
# в реальности же у вас их будет больше — как минимум из-за деплоя
stages:
- build
- tests
build:
stage: build
script:
# сборка — снова по документации по werf
# (https://werf.io/how_to/gitlab_ci_cd_integration.html#build-stage)
- type multiwerf && source <(multiwerf use ${WERF_VERSION})
- werf version
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- werf build-and-publish --stages-storage :local
tags:
- werf-runner
except:
- schedules
run tests:
<<: *test-base
environment:
# "сама соль" именования namespace’а
# (https://docs.gitlab.com/ce/ci/variables/predefined_variables.html)
name: tests-${CI_COMMIT_REF_SLUG}
stage: tests
except:
- schedules
Кубернитель
Ҳоло дар директория .helm/templates биёед YAML-ро бо Айюб созем - tests-job.yaml - барои иҷро кардани санҷишҳо ва захираҳои Kubernetes, ки ба он ниёз доранд. Пас аз рӯйхат ба тавзеҳот нигаред:
Диққат ба ҳолати муқаддимавӣ бо if дар оғози манифест - мувофиқан, дигар файлҳои YAML диаграммаи Helm бо ариза бояд печонида шаванд баръакс тарҳрезӣ кунед, то онҳо ҳангоми санҷиш ҷойгир нашаванд. Яъне:
{{- if ne .Values.global.run_tests "yes" }}
---
я другой ямлик
{{- end }}
Бо вуҷуди ин, агар санҷишҳо баъзе инфраструктураро талаб мекунанд (масалан, Redis, RabbitMQ, Mongo, PostgreSQL...) - YAML-ҳои онҳо метавонанд не хомӯш кардан. Онҳоро дар муҳити озмоишӣ низ ҷойгир кунед ... онҳоро мувофиқи он, ки шумо мувофиқед, танзим кунед, албатта.
Дастрасии ниҳоӣ
Зеро монтаж ва ҷойгиркунӣ бо истифода аз корҳои werf ҳоло танҳо дар сервери созанда (бо gitlab-runner) ва pod бо санҷишҳо дар усто оғоз карда мешавад, шумо бояд директория эҷод кунед /mnt/tests бар усто ва ба даванда бидеҳ, масалан, тавассути NFS. Намунаи муфассалро бо тавзеҳот дар зер пайдо кардан мумкин аст Ҳуҷҷатҳои K8s.
Ҳар як хаторо барои тафсилот дар ин ҷо зер кардан мумкин аст:
NB: Хонандаи бодиққат пай хоҳад бурд, ки мо як барномаи NodeJS-ро санҷида истодаем ва дар скриншотҳо - .NET... Ҳайрон нашавед: ҳамчун як қисми омодасозии мақола дар санҷиши барномаи аввал ягон хатогӣ пайдо нашуд, вале онхо дар дигар чо пайдо шуданд.
хулоса
Тавре ки шумо мебинед, ҳеҷ чиз мураккаб нест!
Аслан, агар шумо аллакай коллектори снаряд дошта бошед ва он кор мекунад, аммо ба шумо Kubernetes лозим нест, замима кардани санҷиш ба он вазифаи боз ҳам соддатар аз дар ин ҷо тавсифшуда хоҳад буд. Ва дар Ҳуҷҷатҳои GitLab CI шумо мисолҳоро барои Ruby, Go, Gradle, Maven ва баъзеи дигар хоҳед ёфт.