Ho sa tsotellehe taba ea hore motho e mong le e mong o tseba hantle hore ho hlahloba software ea hau ho bohlokoa ebile hoa hlokahala, 'me ba bangata ba' nile ba e etsa ka mokhoa o ikemetseng ka nako e telele, boholo ba Habr ho ne ho se na mokhoa o le mong oa ho theha motsoako oa lihlahisoa tse joalo tse ratoang ka ho fetisisa. niche ena e le (eo re e ratang) GitLab le JUnit. Ha re tlatse sekheo sena!
Selelekela
Pele, e re ke fane ka moelelo oa taba:
Kaha lits'ebetso tsohle tsa rona li sebetsa ho Kubernetes, re tla nahana ka liteko tsa ho etsa liteko lits'ebetsong tse nepahetseng.
Bakeng sa ho kopanya le ho tsamaisa re sebelisa werf (mabapi le likarolo tsa motheo, sena se boetse se bolela hore Helm e ameha).
Nke ke ka kena lintlheng tsa pōpo ea 'nete ea liteko: molemong oa rona, moreki o ngola liteko ka boeena,' me re netefatsa feela ho qala ha bona (le ho ba teng ha tlaleho e lumellanang le kopo ea ho kopanya).
Tatelano e akaretsang ya diketso e tla shebahala jwang?
Ho aha kopo - re tla siea tlhaloso ea sethala sena.
Kenya kopo sebakeng se arohaneng sa mabitso sa sehlopha sa Kubernetes 'me u qale ho etsa liteko.
Ho batla lintho tsa khale le ho qolla litlaleho tsa JUnit ka GitLab.
Ho hlakola sebaka sa mabitso se entsoeng pele.
Joale - ho kenya ts'ebetsong!
phetoho
GitLab CI
Ha re qaleng ka sekhechana .gitlab-ci.yaml, e hlalosang ho tsamaisa kopo le ho etsa liteko. Lethathamo le ile la bonahala le le ngata haholo, kahoo le ile la tlatselletsoa ka botlalo ka litlhaloso:
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
Hona joale bukeng .helm/templates ha re theheng YAML ka Jobo - tests-job.yaml - ho etsa liteko le lisebelisoa tsa Kubernetes tseo e li hlokang. Sheba litlhaloso ka mor'a ho thathamisa:
Ke lisebelisoa tsa mofuta ofe e hlalositsoe tlhophisong ee? Ha re tsamaisa, re theha sebaka se ikhethileng sa mabitso bakeng sa morero (sena se bontšitsoe ho .gitlab-ci.yaml - tests-${CI_COMMIT_REF_SLUG}) ebe o e phutha:
ConfigMap ka mongolo oa tlhahlobo;
Jobo ka tlhaloso ea pod le taelo e boletsoeng command, e tsamaisang liteko feela;
PV le PVC, e u lumellang ho boloka data ea liteko.
Ela hloko boemo ba selelekela ka if qalong ea pontšo - ka hona, lifaele tse ling tsa YAML tsa chate ea Helm e nang le ts'ebeliso li tlameha ho phutheloa ka hare kgutlela morao moralo e le hore li se ke tsa sebelisoa nakong ea tlhahlobo. Ke hore:
{{- if ne .Values.global.run_tests "yes" }}
---
я другой ямлик
{{- end }}
Leha ho le joalo, haeba liteko li hloka lisebelisoa tse itseng (mohlala, Redis, RabbitMQ, Mongo, PostgreSQL...) - YAML ea bona e ka ba ha koala. Li kenye sebakeng sa liteko hape ... ho li lokisa kamoo u bonang ho loketse, ehlile.
Tšoaro ea ho qetela
Hobane ho kopanya le ho tsamaisa ho sebelisa werf mesebetsi hajoale feela ho seva sa kaho (e nang le gitlab-runner), 'me pod e nang le liteko e hlahisoa ho monghali, o tla hloka ho theha bukana. /mnt/tests holim'a monga eona, 'me u e fe semathi. mohlala, ka NFS. Mohlala o qaqileng o nang le litlhaloso o ka fumanoa ho Litokomane tsa K8s.
Ha ho motho ea thibelang ho etsa karolo ea NFS ka kotloloho ho gitlab-runner, ebe o e kenya ka har'a li-pods.
mantsoe
U ka 'na ua botsa hore na ke hobane'ng ha u thatafatsa ntho e' ngoe le e 'ngoe ka ho theha Mosebetsi haeba u ka khona ho tsamaisa sengoloa ka liteko ka kotloloho ho semathi sa khetla? Karabo e nyane haholo ...
Liteko tse ling li hloka ho fihlella lisebelisoa tsa motheo (MongoDB, RabbitMQ, PostgreSQL, joalo-joalo) ho netefatsa hore li sebetsa ka nepo. Re etsa tlhahlobo e kopane - ka mokhoa ona, ho ba bonolo ho kenyelletsa mekhatlo e joalo e eketsehileng. Ho phaella ho sena, re fumana e tloaelehileng mokhoa oa phepelo (leha o sebelisa NFS, ho hlophisoa ho eketsehileng ha li-directory).
sephetho
Re tla bona eng ha re sebelisa tlhophiso e lokiselitsoeng?
Kopo ea ho kopanya e tla bonts'a kakaretso ea lipalo-palo tsa liteko tsa morao-rao:
Phoso e 'ngoe le e 'ngoe e ka tlanya mona ho fumana lintlha:
NB: 'Mali ea hlokolosi o tla hlokomela hore re ntse re leka kopo ea NodeJS, le li-screenshots - .NET... U se ke ua hlolloa: ke feela hore ha u ntse u lokisetsa sehlooho sena, ha ho liphoso tse fumanoeng ha ho hlahlojoa kopo ea pele, empa ba li ile tsa fumanoa ho e 'ngoe.
fihlela qeto e
Joalokaha u ka bona, ha ho letho le rarahaneng!
Ha e le hantle, haeba u se u ntse u e-na le pokello ea likhetla 'me e sebetsa, empa ha u hloke Kubernetes, ho kenyelletsa tlhahlobo ho eona e tla ba mosebetsi o bonolo le ho feta o hlalositsoeng mona. Mme ka hare Litokomane tsa GitLab CI u tla fumana mehlala ea Ruby, Go, Gradle, Maven le ba bang.