рдпрд╕ рддрдереНрдпрдХреЛ рдмрд╛рд╡рдЬреБрдж рд╕рдмреИрд▓рд╛рдИ рд░рд╛рдореНрд░рд░реА рдерд╛рд╣рд╛ рдЫ рдХрд┐ рддрдкрд╛рдИрдВрдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░рдХреЛ рдкрд░реАрдХреНрд╖рдг рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд░ рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдзреЗрд░реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдЧрд░реНрджреИ рдЖрдПрдХрд╛ рдЫрдиреН, Habr рдХреЛ рд╡рд┐рд╢рд╛рд▓рддрд╛рдорд╛ рддреНрдпрд╣рд╛рдБ рддреНрдпрд╕реНрддрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрддреНрдкрд╛рджрдирд╣рд░реВрдХреЛ рд╕рдВрдпреЛрдЬрди рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рдПрдХрд▓ рдиреБрд╕реНрдЦрд╛ рдерд┐рдПрдиред рдпреЛ рдЖрд▓рд╛ (рд╣рд╛рдореНрд░реЛ рдордирдкрд░реНрдиреЗ) GitLab рд░ JUnit рдХреЛ рд░реВрдкрдорд╛ред рдпреЛ рдЦрд╛рд▓реА рдард╛рдЙрдБ рднрд░реМрдВ!
рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ
рдкрд╣рд┐рд▓реЗ, рдорд▓рд╛рдИ рдХреЗрд╣рд┐ рд╕рдиреНрджрд░реНрдн рджрд┐рдиреБрд╣реЛрд╕реН:
- рд╣рд╛рдореНрд░рд╛ рд╕рдмреИ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВ Kubernetes рдорд╛ рдЪрд▓реНрдиреЗ рднрдПрдХреЛрд▓реЗ, рд╣рд╛рдореА рдЙрдкрдпреБрдХреНрдд рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдорд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдЙрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреЗрдЫреМрдВред
- рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ
рд╡рд╛рдл (рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдШрдЯрдХрд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдпрд╕рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд░реНрде рд╣реЛ рдХрд┐ рд╣реЗрд▓рдо рд╕рдВрд▓рдЧреНрди рдЫ)ред - рдо рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд░реНрдЬрдирд╛рдХреЛ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдорд╛ рдЬрд╛рдиреЗрдЫреИрди: рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛рдорд╛, рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдЖрдлреИрдВрд▓реЗ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рд▓реЗрдЦреНрдЫ, рд░ рд╣рд╛рдореА рдХреЗрд╡рд▓ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕реБрд░реБрд╡рд╛рдд (рд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рд░рд┐рдкреЛрд░реНрдЯрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдЫреМрдВред
рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреНрд░рдо рдХрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ?
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ - рд╣рд╛рдореА рдпрд╕ рдЪрд░рдгрдХреЛ рд╡рд┐рд╡рд░рдг рдЫреЛрдбреНрдиреЗрдЫреМрдВред
- рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рдЫреБрдЯреНрдЯреИ рдиреЗрдорд╕реНрдкреЗрд╕рдорд╛ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдкрд░реАрдХреНрд╖рдг рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
- рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЦреЛрдЬреНрджреИ рд░ GitLab рд╕рдБрдЧ JUnit рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдкрд╛рд░реНрд╕ рдЧрд░реНрджреИред
- рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдЯрд╛рдЙрдБрджреИред
рдЕрдм - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди!
рд╕рдорд╛рдпреЛрдЬрди
GitLab рд╕реАрдЖрдИ
рдПрдХ рдЯреБрдХреНрд░рд╛ рд╕рдВрдЧ рд╕реБрд░реБ рдЧрд░реМрдВ .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 eq .Values.global.run_tests "yes" }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: tests-script
data:
tests.sh: |
echo "======================"
echo "${APP_NAME} TESTS"
echo "======================"
cd /app
npm run test:ci
cp report.xml /app/test_results/${CI_COMMIT_REF_SLUG}/
echo ""
echo ""
echo ""
chown -R 999:999 /app/test_results/${CI_COMMIT_REF_SLUG}
---
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Chart.Name }}-test
annotations:
"helm.sh/hook": post-install,post-upgrade
"helm.sh/hook-weight": "2"
"werf/watch-logs": "true"
spec:
activeDeadlineSeconds: {{ .Values.global.ci_timeout }}
backoffLimit: 1
template:
metadata:
name: {{ .Chart.Name }}-test
spec:
containers:
- name: test
command: ['bash', '-c', '/app/tests.sh']
{{ tuple "application" . | include "werf_container_image" | indent 8 }}
env:
- name: env
value: {{ .Values.global.env }}
- name: CI_COMMIT_REF_SLUG
value: {{ .Values.global.commit_ref_slug }}
- name: APP_NAME
value: {{ .Chart.Name }}
{{ tuple "application" . | include "werf_container_env" | indent 8 }}
volumeMounts:
- mountPath: /app/test_results/
name: data
- mountPath: /app/tests.sh
name: tests-script
subPath: tests.sh
tolerations:
- key: dedicated
operator: Exists
- key: node-role.kubernetes.io/master
operator: Exists
restartPolicy: OnFailure
volumes:
- name: data
persistentVolumeClaim:
claimName: {{ .Chart.Name }}-pvc
- name: tests-script
configMap:
name: tests-script
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Chart.Name }}-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
storageClassName: {{ .Chart.Name }}-{{ .Values.global.commit_ref_slug }}
volumeName: {{ .Values.global.commit_ref_slug }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.global.commit_ref_slug }}
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 10Mi
local:
path: /mnt/tests/
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kube-master
persistentVolumeReclaimPolicy: Delete
storageClassName: {{ .Chart.Name }}-{{ .Values.global.commit_ref_slug }}
{{- end }}
рдХрд╕реНрддреЛ рдХрд┐рд╕рд┐рдордХреЛ рд╕реНрд░реЛрддрд╕рд╛рдзрди рдпреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ? рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрджрд╛, рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рд╕реНрдерд╛рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ (рдпреЛ рдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫ .gitlab-ci.yaml
- tests-${CI_COMMIT_REF_SLUG}
) рд░ рдпрд╕рд▓рд╛рдИ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
- рдХрдиреНрдлрд┐рдЧрдореНрдпрд╛рдк рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдкрд┐ рд╕рдВрдЧ;
- рдХрд╛рдо рдкреЛрдбрдХреЛ рд╡рд┐рд╡рд░рдг рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рд╕рд╛рде
command
, рдЬрд╕рд▓реЗ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдБрдЫ; - PV рд░ PVC, рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред
рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН if
рдореНрдпрд╛рдирд┐рдлреЗрд╕реНрдЯрдХреЛ рд╕реБрд░реБрдорд╛ - рддрджрдиреБрд╕рд╛рд░, рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рд╕рд╛рде рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрдХрд╛ рдЕрдиреНрдп YAML рдлрд╛рдЗрд▓рд╣рд░реВ рдмреЗрд░рд┐рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рдЙрд▓реНрдЯреЛ рдбрд┐рдЬрд╛рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рддрд╛рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рдордпрдорд╛ рддреИрдирд╛рдд рдирд╣реЛрд╕реНред рддреНрдпреЛ рд╣реЛ:
{{- if ne .Values.global.run_tests "yes" }}
---
╤П ╨┤╤А╤Г╨│╨╛╨╣ ╤П╨╝╨╗╨╕╨║
{{- end }}
рдпрджреНрдпрдкрд┐, рдпрджрд┐ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдХреЗрд╣реА рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдЪрд╛рд╣рд┐рдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Redis, RabbitMQ, Mongo, PostgreSQL...) - рддрд┐рдиреАрд╣рд░реВрдХрд╛ YAML рд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреН рдЫреИрди рдмрдиреНрдж рдЧрд░реНрдиреБрд╣реЛрд╕реНред рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН... рддрдкрд╛рдИрдВрд▓реЗ рдЙрдкрдпреБрдХреНрдд рджреЗрдЦреНрдиреБрднрдПрдХреЛ рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдорд╛рдпреЛрдЬрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рдЕрдиреНрддрд┐рдо рд╕реНрдкрд░реНрд╢
рдХрд┐рдирднрдиреЗ werf рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рддреИрдирд╛рддреА рдЕрдЭреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ рдорд╛рддреНрд░ рдмрд┐рд▓реНрдб рд╕рд░реНрднрд░рдорд╛ (рдЧрд┐рдЯрд▓реНрдпрд╛рдм-рд░рдирд░рдХреЛ рд╕рд╛рде), рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рд╛рде рдкреЛрдб рдорд╛рд╕реНрдЯрд░рдорд╛ рд╕реБрд░реВ рдЧрд░рд┐рдПрдХреЛ рдЫ, рддрдкрд╛рдИрдВрд▓реЗ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред /mnt/tests
рдорд╛рд╕реНрдЯрд░рдорд╛ рд░ рдзрд╛рд╡рдХрд▓рд╛рдИ рджрд┐рдиреБрд╣реЛрд╕реН, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, NFS рдорд╛рд░реНрдлрддред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕рд╣рд┐рддрдХреЛ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдгрдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ
рдкрд░рд┐рдгрд╛рдо рд╣реБрдиреЗрдЫ:
user@kube-master:~$ cat /etc/exports | grep tests
/mnt/tests IP_gitlab-builder/32(rw,nohide,insecure,no_subtree_check,sync,all_squash,anonuid=999,anongid=998)
user@gitlab-runner:~$ cat /etc/fstab | grep tests
IP_kube-master:/mnt/tests /mnt/tests nfs4 _netdev,auto 0 0
Gitlab-runner рдорд╛ рд╕рд┐рдзреИ NFS рд╕реЗрдпрд░ рдмрдирд╛рдЙрди, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рдкреЛрдбрдорд╛ рдорд╛рдЙрдиреНрдЯ рдЧрд░реНрди рдХрд╕реИрд▓реЗ рдирд┐рд╖реЗрдз рдЧрд░реНрджреИрдиред
рднрдиреНрдиреБ
рддрдкрд╛рдИрд▓реЗ рд╕реЛрдзрд┐рд░рд╣рдиреБ рднрдПрдХреЛ рд╣реБрдирд╕рдХреНрдЫ рдпрджрд┐ рддрдкрд╛рдИрд▓реЗ рд╕рд┐рдзреИ рд╢реЗрд▓ рд░рдирд░рдорд╛ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рд╛рде рд▓рд┐рдкрд┐ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рд░реЛрдЬрдЧрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рд╕рдмреИ рдХреБрд░рд╛рд▓рд╛рдИ рдХрд┐рди рдЬрдЯрд┐рд▓ рдмрдирд╛рдЙрдиреЗ? рдЬрд╡рд╛рдл рдПрдХрджрдо рдорд╛рдореВрд▓реА рдЫ ...
рдХреЗрд╣реА рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрд▓рд╛рдИ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдорд╛ рдкрд╣реБрдБрдЪ рдЪрд╛рд╣рд┐рдиреНрдЫ (MongoDB, RabbitMQ, PostgreSQL, рдЖрджрд┐) рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫрдиреН рднрдиреЗрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реНрдиред рд╣рд╛рдореА рдкрд░реАрдХреНрд╖рдгрд▓рд╛рдИ рдПрдХреАрдХреГрдд рдмрдирд╛рдЙрдБрдЫреМрдВ - рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рддреНрдпрд╕реНрддрд╛ рдердк рд╕рдВрд╕реНрдерд╛рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреНрдЫред рдпрд╕рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рд╛рдореАрд▓реЗ рдкрд╛рдЙрдБрдЫреМрдВ рдорд╛рдирдХ рддреИрдирд╛рддреА рджреГрд╖реНрдЯрд┐рдХреЛрдг (NFS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рдкрдирд┐, рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдЙрдиреНрдЯрд┐рдЩ)ред
рдкрд░рд┐рдгрд╛рдо
рд╣рд╛рдореАрд▓реЗ рддрдпрд╛рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд▓рд╛рдЧреВ рдЧрд░реНрджрд╛ рд╣рд╛рдореА рдХреЗ рджреЗрдЦреНрдиреЗрдЫреМрдВ?
рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд▓реЗ рдпрд╕рдХреЛ рдкрдЫрд┐рд▓реНрд▓реЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рдЪрд▓рд╛рдЗрдПрдХреЛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рд░рд╛рдВрд╢ рддрдереНрдпрд╛рдЩреНрдХрд╣рд░реВ рджреЗрдЦрд╛рдЙрдиреЗрдЫ:
рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:
NB: рдзреНрдпрд╛рди рджрд┐рдПрд░ рдкрд╛рдардХрд▓реЗ рд╣рд╛рдореАрд▓реЗ NodeJS рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИрдЫреМрдВ, рд░ рд╕реНрдХреНрд░рд┐рдирд╕рдЯрд╣рд░реВрдорд╛ - .NET... рдЕрдЪрдореНрдо рдирдорд╛рдиреНрдиреБрд╣реЛрд╕реН: рдпреЛ рдорд╛рддреНрд░ рд╣реЛ рдХрд┐ рд▓реЗрдЦ рддрдпрд╛рд░ рдЧрд░реНрджрд╛, рдкрд╣рд┐рд▓реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджрд╛ рдХреБрдиреИ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд░реЗрдирдиреН, рддрд░ рддрд┐рдиреАрд╣рд░реВ рдЕрд░реНрдХреЛрдорд╛ рднреЗрдЯрд┐рдпреЛред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдХреЗрд╣рд┐ рдкрдирд┐ рдЬрдЯрд┐рд▓ рдЫреИрди!
рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдЦреЛрд▓ рдХрд▓реЗрдХреНрдЯрд░ рдЫ рд░ рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд░ рддрдкрд╛рдЗрдБрд▓рд╛рдИ Kubernetes рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди, рдпрд╕рдорд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд▓рдЧреНрди рдЧрд░реНрдиреБ рдпрд╣рд╛рдБ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рднрдиреНрджрд╛ рдЕрдЭ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реБрдиреЗрдЫред рд░ рдорд╛
PS
рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:
- ┬л
Kubernetes рд░ GitLab (рд╕рдореАрдХреНрд╖рд╛ рд░ рднрд┐рдбрд┐рдпреЛ рд░рд┐рдкреЛрд░реНрдЯ) рд╕рдВрдЧ рдЙрддреНрддрдо CI/CD рдЕрднреНрдпрд╛рд╕рд╣рд░реВ ┬╗; - ┬л
GitLab CI рдорд╛ рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕реБрдЭрд╛рд╡рд╣рд░реВ ┬╗; - ┬л
рдЙрддреНрдкрд╛рджрдирдорд╛ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд░ рд╡рд┐рддрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ GitLab CI "ред
рд╕реНрд░реЛрдд: www.habr.com