Quamvis omnes probe probe noverint quod programmata tua tentantes magnum et necessarium sit, et multi automatice eam diu fecerint, in magnitudine Habr non fuit una recipe ad constituendum complexionem talis popularis productorum in hoc angulus sicut (noster ventus) GitLab et JUnit. Lacunam hanc impleamus!
Introductory
Primum, ut demus aliquem contextum;
Cum omnes applicationes nostrae in Kubernetes currunt, probationes currentes considerabimus de infrastructura convenienti.
Ad ecclesiam et instruere utimur werf * (per terminos infrastructuras, hoc etiam automatice significat Helm involvi).
Non ingrediar in singula actualis creationis testium: in casu nostro, cliens ipse probat se scribens, et nos tantum incussum (et praesentiam debitae relationis in rogatione merge).
Quid erit generalis series actionum simile?
Ad applicationem aedificationis - descriptionem huius scaenae omittemus.
Explica applicationem ad spatium spatii separati Botri Kubernetarum et tentationis initium.
Quaerendo artificia et parsing JUnit refert cum GitLab.
Deletis antea spatiis nominalibus creatum est.
Nunc - ad exsecutionem!
tionibus
C. GitLab
Sit scriptor satus cum fragmento .gitlab-ci.yamlest, qui applicationes et cursus probat explicandi describit. Enumeratio satis voluminosa evasit, ita cum commentis satis suppleta est;
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
Kubernetes
Nunc in indicem .helm/templates YAML faciamus cum Job - tests-job.yaml — currere probationes et facultates quibus Kubernetes indiget. Vide explicationes post enumerationem:
Quales opes? in hac configuratione descriptus? Cum disponimus, singula nomina spatii ad propositum creamus (hoc in "indicio est" .gitlab-ci.yaml - tests-${CI_COMMIT_REF_SLUG}) Et volvuntur eum:
ConfigMap cum test script;
Job descriptione vasculi praefinitum directivum commandquae mox probat;
PV et PVC, quae te condere testi data .
Attende ad condicionem introductoriam cum if in principio manifesti - proinde alia YAML tabulae chartulae Helm cum applicatione involvenda sunt novis consilio ita ut in probatione non instruantur. Ille est:
{{- if ne .Values.global.run_tests "yes" }}
---
я другой ямлик
{{- end }}
Sed si probat infrastructure aliqua eget (exempli gratia Redis, RabbitMQ, Mongo, PostgreSQL...) - possunt esse eorum YAMLs non averte. Eas in ambitus quoque enucleando explicas... componit, ut tibi videbitur, nimirum.
ultima tactus
Quod ecclesiam et instruere utens werf operatur in nunc tantum in servo constructo (cum gitlab-cursore), et vasculum cum probatis in dominum immittitur, opus directorium creare /mnt/tests dominum et da cursori; exempli gratia per NFS. Singula exempla cum explanationibus reperiri possunt K8s documenta.
Nemo vetat facere NFS cursorem directe participare in gitlab, et deinde in siliquas ascendere.
illud
Quaeris cur inpedias omnia creando Iob si simpliciter currere potes scripturam cum probationibus directe in testa cursoris? Responsum est leve...
Nonnullae probationes accessum requirunt ad infrastructuram (MongoDB, RabbitMQ, PostgreSQL, etc.) ad comprobandum se recte operari. Tentantes unitatem facimus - cum hac accessione facile fit huiusmodi additamenta includere. Adde quod hoc obtinemus vexillum accessum instruere (etiamsi NFS utens, additis directoriis escendendis).
exitum
Quid videbimus cum figurationem praeparatam applicabimus?
In merge petitionem summatim mutant pro probationibus currunt in pipelino recentissimo ostendet:
Quisque error hic deprimi potest ad singula:
NB: Attentus lector animadvertet nos applicationem NodeJS tentare, et in eenshotsscray - .NET... Nolite mirari: iustum est quod, dum articulum paramus, nulli errores in probatione primae applicationis inveniuntur, sed illi. in alio reperti sunt.
conclusio,
Ut vides, nihil complicatum!
Principio, si concham collectorem iam habes et facit, sed Kubernetes non indiges, experimento magis simplicior erit quam hic descriptus. Et in GitLab CI documenta exempla invenies pro Ruby, Vade, Gradle, Maven et nonnullis aliis.