เจเจธ เจคเฉฑเจฅ เจฆเฉ เจฌเจพเจตเจเฉเจฆ เจเจฟ เจนเจฐ เจเฉเจ เจเฉฐเจเฉ เจคเจฐเฉเจนเจพเจ เจเจพเจฃเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจนเจพเจกเฉ เจธเฉเจซเจเจตเฉเจ เจฐ เจฆเฉ เจเจพเจเจ เจเจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจ เจคเฉ เจเจผเจฐเฉเจฐเฉ เจนเฉ, เจ เจคเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจเจธเจจเฉเฉฐ เจฒเฉฐเจฌเฉ เจธเจฎเฉเจ เจคเฉเจ เจเจชเจฃเฉ เจเจช เจนเฉ เจเจฐ เจฐเจนเฉ เจนเจจ, เจนเฉเจฌเจฐ เจฆเฉ เจตเจฟเจธเจผเจพเจฒเจคเจพ เจตเจฟเฉฑเจ เจ เจเจฟเจนเฉ เจชเฉเจฐเจธเจฟเฉฑเจง เจเจคเจชเจพเจฆเจพเจ เจฆเฉ เจธเฉเจฎเฉเจฒ เจจเฉเฉฐ เจธเจฅเจพเจชเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ เจตเฉ เจตเจฟเจ เฉฐเจเจจ เจจเจนเฉเจ เจธเฉเฅค เจเจน เจธเจฅเจพเจจ (เจธเจพเจกเจพ เจฎเจจเจชเจธเฉฐเจฆ) GitLab เจ เจคเฉ JUnitเฅค เจเจ เจเจธ เจชเจพเฉเฉ เจจเฉเฉฐ เจญเจฐเฉเจ!
เจเจพเจฃ-เจชเจเจพเจฃ
เจชเจนเจฟเจฒเจพเจ, เจฎเฉเจจเฉเฉฐ เจเฉเจ เจธเฉฐเจฆเจฐเจญ เจฆเฉเจฃ เจฆเจฟเจ:
- เจเจฟเจเจเจเจฟ เจธเจพเจกเฉเจเจ เจธเจพเจฐเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจเฉเจฌเจฐเจจเฉเจเจธ 'เจคเฉ เจเฉฑเจฒเจฆเฉเจเจ เจนเจจ, เจ เจธเฉเจ เจเจเจฟเจค เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ 'เจคเฉ เจเฉเจธเจเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฌเจพเจฐเฉ เจตเจฟเจเจพเจฐ เจเจฐเจพเจเจเฉเฅค
- เจ
เจธเฉเจเจฌเจฒเฉ เจ
เจคเฉ เจคเฉเจจเจพเจคเฉ เจฒเจ เจ
เจธเฉเจ เจตเจฐเจคเจฆเฉ เจนเจพเจ
werf (เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจนเจฟเฉฑเจธเฉ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ, เจเจธเจฆเจพ เจเจชเจฃเฉ เจเจช เจนเฉ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจนเฉเจฒเจฎ เจธเจผเจพเจฎเจฒ เจนเฉ)เฅค - เจฎเฉเจ เจเฉเจธเจเจพเจ เจฆเฉ เจ เจธเจฒ เจฐเจเจจเจพ เจฆเฉ เจตเฉเจฐเจตเจฟเจเจ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจเจพเจตเจพเจเจเจพ: เจธเจพเจกเฉ เจเฉเจธ เจตเจฟเฉฑเจ, เจเจฒเจพเจเฉฐเจ เจเฉเจฆ เจเฉเจธเจ เจฒเจฟเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจ เจธเฉเจ เจธเจฟเจฐเจซ เจเจนเจจเจพเจ เจฆเฉ เจธเจผเฉเจฐเฉเจเจค เจจเฉเฉฐ เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจเจฆเฉ เจนเจพเจ (เจ เจคเฉ เจ เจญเฉเจฆ เจฆเฉ เจฌเฉเจจเจคเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจ เจจเฉเจธเจพเจฐเฉ เจฐเจฟเจชเฉเจฐเจ เจฆเฉ เจฎเฉเจเฉเจฆเจเฉ)เฅค
เจเจพเจฐเจตเจพเจเจเจ เจฆเจพ เจเจฎ เจเฉเจฐเจฎ เจเจฟเจนเฉ เจเจฟเจนเจพ เจฆเจฟเจเจพเจ เจฆเฉเจตเฉเจเจพ?
- เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฌเจฃเจพเจเจฃเจพ - เจ เจธเฉเจ เจเจธ เจชเฉเจพเจ เจฆเฉ เจตเจฐเจฃเจจ เจจเฉเฉฐ เจเฉฑเจก เจฆเฉเจตเจพเจเจเฉเฅค
- เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจฒเฉฑเจธเจเจฐ เจฆเฉ เจเฉฑเจ เจตเฉฑเจเจฐเฉ เจจเฉเจฎเจธเจชเฉเจธ เจตเจฟเฉฑเจ เจคเฉเจจเจพเจค เจเจฐเฉ เจ เจคเฉ เจเจพเจเจ เจธเจผเฉเจฐเฉ เจเจฐเฉเฅค
- เจเจฒเจพเจคเจฎเจ เจเฉเจเจผเจพเจ เจฆเฉ เจเฉเจ เจเจฐเจจเจพ เจ เจคเฉ GitLab เจจเจพเจฒ JUnit เจฐเจฟเจชเฉเจฐเจเจพเจ เจจเฉเฉฐ เจชเจพเจฐเจธ เจเจฐเจจเจพเฅค
- เจชเจนเจฟเจฒเจพเจ เจฌเจฃเจพเจเจ เจจเจพเจฎ-เจธเจฅเจพเจจ เจฎเจฟเจเจพเจเจฃเจพเฅค
เจนเฉเจฃ - เจฒเจพเจเฉ เจเจฐเจจ เจฒเจ!
เจตเจฟเจตเจธเจฅเจพ
เจเจฟเฉฑเจเจฒเจพเจฌ เจธเฉ.เจเจ.
เจเจ เจเฉฑเจ เจเฉเจเฉเฉ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเฉเจ .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
โ เจเฉเจธเจเจพเจ เจ
เจคเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจธเจฐเฉเจคเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฒเจ เจเจธเจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจธเฉเจเฉเจฌเฉฑเจง เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ เจธเจชเฉฑเจธเจผเจเฉเจเจฐเจจ เจตเฉเจเฉ:
{{- 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}
) เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจฐเฉเจฒ เจเจเจ เจเจฐเฉ:
- ConfigMap เจเฉเจธเจ เจธเจเฉเจฐเจฟเจชเจ เจฆเฉ เจจเจพเจฒ;
- เจ
เฉฑเจฏเฉเจฌ เจชเฉเจก เจฆเฉ เจตเจฐเจฃเจจ เจ
เจคเฉ เจจเจฟเจฐเจงเจพเจฐเจค เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจฆเฉ เจจเจพเจฒ
command
, เจเฉ เจธเจฟเจฐเจซ เจเฉเจธเจ เจเจฒเจพเจเจเจฆเจพ เจนเฉ; - เจชเฉเจตเฉ เจ เจคเฉ เจชเฉเจตเฉเจธเฉ, เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจธเจ เจกเฉเจเจพ เจธเจเฉเจฐ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจฆเฉ เจจเจพเจฒ เจธเจผเฉเจฐเฉเจเจคเฉ เจธเจฅเจฟเจคเฉ เจตเฉฑเจฒ เจงเจฟเจเจจ เจฆเจฟเจ if
เจฎเฉเจจเฉเจซเฉเจธเจ เจฆเฉ เจธเจผเฉเจฐเฉ เจตเจฟเฉฑเจ - เจเจธเจฆเฉ เจ
เจจเฉเจธเจพเจฐ, เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจจเจพเจฒ เจนเฉเจฒเจฎ เจเจพเจฐเจ เจฆเฉเจเจ เจนเฉเจฐ YAML เจซเจพเจเจฒเจพเจ เจจเฉเฉฐ เจฒเจชเฉเจเจฟเจ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจเจฒเจเจพ เจกเจฟเจเจผเจพเจเจจ เจคเจพเจ เจเฉ เจเจน เจเฉเจธเจเจฟเฉฐเจ เจฆเฉเจฐเจพเจจ เจคเจพเจเจจเจพเจค เจจเจพ เจนเฉเจฃเฅค เจเฉ เจเจฟ เจนเฉ:
{{- if ne .Values.global.run_tests "yes" }}
---
ั ะดััะณะพะน ัะผะปะธะบ
{{- end }}
เจชเจฐ, เจเฉเจเจฐ เจเฉเจธเจ เจเฉเจ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจฒเฉเฉ เจนเฉ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, Redis, RabbitMQ, Mongo, PostgreSQL...) - เจเจนเจจเจพเจ เจฆเฉ YAML เจนเฉ เจธเจเจฆเฉ เจนเจจ เจจเจพ เจฌเฉฐเจฆ เจเจฐ เจฆเจฟเจ. เจเจนเจจเจพเจ เจจเฉเฉฐ เจเฉฑเจ เจเฉเจธเจ เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจ เจตเฉ เจคเฉเจจเจพเจค เจเจฐเฉ... เจเจนเจจเจพเจ เจจเฉเฉฐ เจ เจจเฉเจเฉเจฒ เจฌเจฃเจพเจ เจเจฟเจตเฉเจ เจคเฉเจธเฉเจ เจ เฉเจ เจธเจฎเจเจฆเฉ เจนเฉ, เจฌเฉเจธเจผเจเฅค
เจ เฉฐเจคเจฎ เจเฉเจน
เจเจฟเจเจเจเจฟ เจ
เจธเฉเจเจฌเจฒเฉ เจ
เจคเฉ เจคเฉเจจเจพเจคเฉ เจนเฉเจฃ เจฒเจ เจตเจฐเจซ เจตเจฐเจเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจธเจฟเจฐเจซ เจฌเจฟเจฒเจก เจธเจฐเจตเจฐ 'เจคเฉ (เจเจฟเจเจฒเจฌ-เจฐเจจเจฐ เจฆเฉ เจจเจพเจฒ), เจ
เจคเฉ เจเฉเจธเจเจพเจ เจตเจพเจฒเจพ เจชเฉเจก เจฎเจพเจธเจเจฐ 'เจคเฉ เจฒเจพเจเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฑเจ เจกเจพเจเจฐเฉเจเจเจฐเฉ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเจตเฉเจเฉเฅค /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
เจเฉเจ เจตเฉ เจเจฟเจเจฒเฉเจฌ-เจฐเจจเจฐ 'เจคเฉ เจธเจฟเฉฑเจงเฉ NFS เจธเจผเฉเจ เจฐ เจฌเจฃเจพเจเจฃ, เจ เจคเฉ เจซเจฟเจฐ เจเจธเจจเฉเฉฐ เจชเฉเจกเจพเจ เจตเจฟเฉฑเจ เจฎเจพเจเจเจ เจเจฐเจจ เจคเฉเจ เจฎเจจเฉเจนเจพ เจเจฐเจฆเจพ เจนเฉเฅค
เจเจฟเฉฑเจชเจฃเฉ
เจคเฉเจธเฉเจ เจธเจผเจพเจเจฆ เจชเฉเฉฑเจ เจฐเจนเฉ เจนเฉเจตเฉเจเฉ เจเจฟ เจเฉ เจคเฉเจธเฉเจ เจธเจผเฉเฉฑเจฒ เจฐเจจเจฐ 'เจคเฉ เจธเจฟเฉฑเจงเฉ เจเฉเจธเจเจพเจ เจจเจพเจฒ เจธเจเฉเจฐเจฟเจชเจ เจเจฒเจพ เจธเจเจฆเฉ เจนเฉ เจคเจพเจ เจจเฉเจเจฐเฉ เจฌเจฃเจพ เจเฉ เจนเจฐ เจเฉเจเจผ เจจเฉเฉฐ เจเจฟเจเจ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจฌเจฃเจพเจ? เจเจตเจพเจฌ เจฌเจนเฉเจค เจฎเจพเจฎเฉเจฒเฉ เจนเฉ ...
เจเฉเจ เจเฉเจธเจเจพเจ เจจเฉเฉฐ เจเจน เจชเฉเจธเจผเจเฉ เจเจฐเจจ เจฒเจ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ (MongoDB, RabbitMQ, PostgreSQL, เจเจฆเจฟ) เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ เจเจฟ เจเจน เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจฆเฉ เจนเจจเฅค เจ เจธเฉเจ เจเฉเจธเจเจฟเฉฐเจ เจจเฉเฉฐ เจเจเฉเจเฉเจฐเจฟเจค เจฌเจฃเจพเจเจเจฆเฉ เจนเจพเจ - เจเจธ เจชเจนเฉเฉฐเจ เจจเจพเจฒ, เจ เจเจฟเจนเฉเจเจ เจตเจพเจงเฉ เจเจเจพเจเจเจ เจจเฉเฉฐ เจธเจผเจพเจฎเจฒ เจเจฐเจจเจพ เจเจธเจพเจจ เจนเฉ เจเจพเจเจฆเจพ เจนเฉเฅค เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจ เจธเฉเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเจพเจ เจฎเจฟเจเจฐเฉ เจคเฉเจจเจพเจคเฉ เจชเจนเฉเฉฐเจ (เจญเจพเจตเฉเจ NFS เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ, เจกเจพเจเจฐเฉเจเจเจฐเฉเจเจ เจฆเฉ เจตเจพเจงเฉ เจฎเจพเจเจเจเจฟเฉฐเจ)เฅค
เจเจธ เจฆเจพ เจจเจคเฉเจเจพ
เจเจฆเฉเจ เจ เจธเฉเจ เจคเจฟเจเจฐ เจเฉเจคเฉ เจธเฉฐเจฐเจเจจเจพ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจฆเฉ เจนเจพเจ เจคเจพเจ เจ เจธเฉเจ เจเฉ เจฆเฉเจเจพเจเจเฉ?
เจฐเจฒเฉเจตเฉเจ เจฆเฉ เจฌเฉเจจเจคเฉ เจเจธเจฆเฉ เจจเจตเฉเจจเจคเจฎ เจชเจพเจเจชเจฒเจพเจเจจ เจตเจฟเฉฑเจ เจเฉฑเจฒ เจฐเจนเฉ เจเฉเจธเจเจพเจ เจฒเจ เจธเฉฐเจเฉเจช เจ เฉฐเจเฉเฉ เจฆเจฟเจเจพเจเจเฉ:
เจตเฉเจฐเจตเจฟเจเจ เจฒเจ เจนเจฐเฉเจ เจเจฒเจคเฉ เจจเฉเฉฐ เจเฉฑเจฅเฉ เจเจฒเจฟเฉฑเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ:
NB: เจงเจฟเจเจจ เจฆเฉเจฃ เจตเจพเจฒเฉ เจชเจพเจ เจ เจเจน เจจเฉเจเจฟเจธ เจเจฐเจจเจเฉ เจเจฟ เจ
เจธเฉเจ เจเฉฑเจ NodeJS เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจเจพเจเจ เจเจฐ เจฐเจนเฉ เจนเจพเจ, เจ
เจคเฉ เจธเจเฉเจฐเฉเจจเจธเจผเฉเจเจธ เจตเจฟเฉฑเจ - .NET... เจนเฉเจฐเจพเจจ เจจเจพ เจนเฉเจตเฉ: เจฌเจธ เจเจน เจนเฉ เจเจฟ เจฒเฉเจ เจจเฉเฉฐ เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจชเจนเจฟเจฒเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจเจพเจเจ เจตเจฟเฉฑเจ เจเฉเจ เจเจฒเจคเฉ เจจเจนเฉเจ เจชเจพเจ เจเจ, เจชเจฐ เจเจน เจฆเฉเจเฉ เจตเจฟเฉฑเจ เจชเจพเจ เจเจ เจธเจจเฅค
เจธเจฟเฉฑเจเจพ
เจเจฟเจตเฉเจ เจเจฟ เจคเฉเจธเฉเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเฉ, เจเฉเจ เจตเฉ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจนเฉเจ เจนเฉ!
เจธเจฟเจงเจพเจเจคเจ เจคเฉเจฐ 'เจคเฉ, เจเฉเจเจฐ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจธเจผเฉเฉฑเจฒ เจเฉเจฒเฉเจเจเจฐ เจนเฉ เจ
เจคเฉ เจเจน เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ, เจชเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจฌเจฐเจจเฉเจเจธ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ, เจคเจพเจ เจเจธ เจจเจพเจฒ เจเฉเจธเจเจฟเฉฐเจ เจจเฉเฉฐ เจเฉเฉเจจเจพ เจเฉฑเจฅเฉ เจฆเฉฑเจธเฉ เจเจ เจจเจพเจฒเฉเจ เจตเฉ เจธเฉเจเจพ เจเฉฐเจฎ เจนเฉเจตเฉเจเจพเฅค เจ
เจคเฉ เจตเจฟเฉฑเจ
PS
เจธเจพเจกเฉ เจฌเจฒเฉเจ 'เจคเฉ เจตเฉ เจชเฉเฉเจนเฉ:
- ยซ
เจเฉเจฌเจฐเจจเฉเจเจธ เจ เจคเฉ เจเจฟเจเจฒเฉเจฌ (เจธเจฎเฉเจเจฟเจ เจ เจคเฉ เจตเฉเจกเฉเจ เจฐเจฟเจชเฉเจฐเจ) เจฆเฉ เจจเจพเจฒ เจตเจงเฉเจ CI/CD เจ เจญเจฟเจเจธ "; - ยซ
GitLab CI เจตเจฟเฉฑเจ เจเจธเจเจฎ เจตเจฐเจเจซเจฒเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจธเฉเจเจพเจ "; - ยซ
เจเจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจ เจจเจฟเจฐเฉฐเจคเจฐ เจเจเฉเจเจฐเจฃ เจ เจคเฉ เจกเจฟเจฒเฉเจตเจฐเฉ เจฒเจ GitLab CI ".
เจธเจฐเฉเจค: www.habr.com