เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ GitLab CI เชฎเชพเช‚ JUnit

เช เชนเช•เซ€เช•เชค เชนเซ‹เชตเชพ เช›เชคเชพเช‚ เช•เซ‡ เชฆเชฐเซ‡เช• เชตเซเชฏเช•เซเชคเชฟ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชœเชพเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเชพ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช…เชจเซ‡ เช†เชตเชถเซเชฏเช• เช›เซ‡, เช…เชจเซ‡ เช˜เชฃเชพ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชคเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡, เชนเซ‡เชฌเชฐเชจเซ€ เชตเชฟเชถเชพเชณเชคเชพเชฎเชพเช‚ เช†เชตเชพ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เช‰เชคเซเชชเชพเชฆเชจเซ‹เชจเชพ เชธเช‚เชฏเซ‹เชœเชจเชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชชเชฃ เชฐเซ‡เชธเซ€เชชเซ€ เชจเชนเซ‹เชคเซ€. (เช…เชฎเชพเชฐเชพ เชฎเชจเชชเชธเช‚เชฆ) GitLab เช…เชจเซ‡ JUnit เชคเชฐเซ€เช•เซ‡ เช† เชตเชฟเชถเชฟเชทเซเชŸ. เชšเชพเชฒเซ‹ เช† เช…เช‚เชคเชฐ เชญเชฐเซ€เช!

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ GitLab CI เชฎเชพเช‚ JUnit

เชชเชฐเชฟเชšเชฏ

เชชเซเชฐเชฅเชฎ, เชฎเชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชธเช‚เชฆเชฐเซเชญ เช†เชชเชตเชพ เชฆเซ‹:

  • เช…เชฎเชพเชฐเซ€ เชฌเชงเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เชšเชพเชฒเชคเซ€ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ เชฏเซ‹เช—เซเชฏ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชชเชฐ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชตเชฟเชšเชพเชฐเซ€เชถเซเช‚.
  • เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช เชตเชฐเซเชซ (เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เช˜เชŸเช•เซ‹เชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚, เช†เชจเซ‹ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชฐเซเชฅ เช เชชเชฃ เชฅเชพเชฏ เช›เซ‡ เช•เซ‡ เชนเซ‡เชฒเซเชฎ เชธเชพเชฎเซ‡เชฒ เช›เซ‡).
  • เชนเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซ€ เชตเชพเชธเซเชคเชตเชฟเช• เชฐเชšเชจเชพเชจเซ€ เชตเชฟเช—เชคเซ‹เชฎเชพเช‚ เชœเชˆเชถ เชจเชนเซ€เช‚: เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช•เซเชฒเชพเชฏเช‚เชŸ เชชเซ‹เชคเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฒเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ เช…เชฎเซ‡ เชซเช•เซเชค เชคเซ‡เชฎเชจเชพ เชฒเซ‹เช‚เชšเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ€เช เช›เซ€เช (เช…เชจเซ‡ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เช…เชนเซ‡เชตเชพเชฒเชจเซ€ เชนเชพเชœเชฐเซ€).


เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เชธเชพเชฎเชพเชจเซเชฏ เช•เซเชฐเชฎ เช•เซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชถเซ‡?

  1. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเชตเซ€ - เช…เชฎเซ‡ เช† เชคเชฌเช•เซเช•เชพเชจเชพ เชตเชฐเซเชฃเชจเชจเซ‡ เช›เซ‹เชกเซ€ เชฆเชˆเชถเซเช‚.
  2. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเชพ เช…เชฒเช— เชจเซ‡เชฎเชธเซเชชเซ‡เชธ เชชเชฐ เชœเชฎเชพเชตเซ‹ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชถเชฐเซ‚ เช•เชฐเซ‹.
  3. เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชถเซ‹เชง เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช เช…เชจเซ‡ GitLab เชธเชพเชฅเซ‡ JUnit เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธเชจเซเช‚ เชชเชฆเชšเซเช›เซ‡เชฆเชจ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ€เช.
  4. เช…เช—เชพเช‰ เชฌเชจเชพเชตเซ‡เชฒ เชจเซ‡เชฎเชธเซเชชเซ‡เชธ เช•เชพเชขเซ€ เชจเชพเช–เชตเซเช‚.

เชนเชตเซ‡ - เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฎเชพเชŸเซ‡!

เช—เซ‹เช เชตเชฃ

เช—เชฟเชŸเชฒเซ‡เชฌ เชธเซ€.เช†เชˆ.

เชšเชพเชฒเซ‹ เชเช• เชŸเซเช•เชกเซ‹ เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เช•เชฐเซ€เช .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}) เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฐเซ‹เชฒ เช†เช‰เชŸ เช•เชฐเซ‹:

  1. ConfigMap เชŸเซ‡เชธเซเชŸ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡;
  2. เชœเซ‹เชฌ เชชเซ‹เชกเชจเชพ เชตเชฐเซเชฃเชจ เช…เชจเซ‡ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชจเชฟเชฐเซเชฆเซ‡เชถ เชธเชพเชฅเซ‡ command, เชœเซ‡ เชซเช•เซเชค เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชšเชฒเชพเชตเซ‡ เช›เซ‡;
  3. เชชเซ€เชตเซ€ เช…เชจเซ‡ เชชเซ€เชตเซ€เชธเซ€, เชœเซ‡ เชคเชฎเชจเซ‡ เชŸเซ‡เชธเซเชŸ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชธเชพเชฅเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชธเซเชฅเชฟเชคเชฟ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ‹ if เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ - เชคเชฆเชจเซเชธเชพเชฐ, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชพเชฅเซ‡ เชนเซ‡เชฒเซเชฎ เชšเชพเชฐเซเชŸเชจเซ€ เช…เชจเซเชฏ YAML เชซเชพเช‡เชฒเซ‹ เช†เชตเชฐเชฟเชค เชนเซ‹เชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชตเชฟเชชเชฐเซ€เชค เชกเชฟเชเชพเช‡เชจ เชœเซ‡เชฅเซ€ เชคเซ‡เช“ เชชเชฐเซ€เช•เซเชทเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชคเซˆเชจเชพเชค เชจ เชฅเชพเชฏ. เชคเซ‡ เชœ:

{{- if ne .Values.global.run_tests "yes" }}
---
ั ะดั€ัƒะณะพะน ัะผะปะธะบ
{{- end }}

เชœเซ‹ เช•เซ‡, เชœเซ‹ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช…เชฎเซเช• เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, Redis, RabbitMQ, Mongo, PostgreSQL...) - เชคเซ‡เชฎเชจเชพ YAML เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เชจเชฅเซ€ เชฌเช‚เชง เช•เชฐเซ‹ เชคเซ‡เชฎเชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชชเชฃ เช—เซ‹เช เชตเซ‹... เช…เชฒเชฌเชคเซเชค, เชคเชฎเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฒเชพเช—เซ‡ เชคเซ‡เชฎ เชคเซ‡เชฎเชจเซ‡ เชธเชฎเชพเชฏเซ‹เชœเชฟเชค เช•เชฐเซ‹.

เช…เช‚เชคเชฟเชฎ เชธเซเชชเชฐเซเชถ

เช•เชพเชฐเชฃ เช•เซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เชœเชฎเชพเชตเชŸ เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡ เชตเชฐเซเชซ เชตเชฐเซเช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเชพเชคเซเชฐ เชฌเชฟเชฒเซเชก เชธเชฐเซเชตเชฐ เชชเชฐ (เช—เซ€เชŸเชฒเซ‡เชฌ-เชฐเชจเชฐ เชธเชพเชฅเซ‡), เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชธเชพเชฅเซ‡เชจเซ‹ เชชเซ‹เชก เชฎเชพเชธเซเชŸเชฐ เชชเชฐ เชฒเซ‹เช‚เชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเชฎเชพเชฐเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ /mnt/tests เชฎเชพเชธเซเชŸเชฐ เชชเชฐ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฐเชจเชฐเชจเซ‡ เช†เชชเซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, NFS เชฆเซเชตเชพเชฐเชพ. เชธเซเชชเชทเซเชŸเชคเชพ เชธเชพเชฅเซ‡เชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เช‰เชฆเชพเชนเชฐเชฃ เช†เชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ K8s เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ.

เชชเชฐเชฟเชฃเชพเชฎ เช† เชนเชถเซ‡:

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 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹, เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชจเซเช‚ เชตเชงเชพเชฐเชพเชจเซเช‚ เชฎเชพเช‰เชจเซเชŸเชฟเช‚เช—).

เชชเชฐเชฟเชฃเชพเชฎ

เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเซ‡เชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชฒเชพเช—เซ เช•เชฐเซ€เชถเซเช‚ เชคเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชถเซเช‚ เชœเซ‹เชถเซเช‚?

เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชคเซ‡เชจเซ€ เชจเชตเซ€เชจเชคเชฎ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚ เชšเชพเชฒเชคเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฎเชพเชŸเซ‡ เชธเชพเชฐเชพเช‚เชถเชจเชพ เช†เช‚เช•เชกเชพ เชฌเชคเชพเชตเชถเซ‡:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ GitLab CI เชฎเชพเช‚ JUnit

เชฆเชฐเซ‡เช• เชญเซ‚เชฒ เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡ เช…เชนเซ€เช‚ เช•เซเชฒเชฟเช• เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ GitLab CI เชฎเชพเช‚ JUnit

NB: เชธเชšเซ‡เชค เชตเชพเชšเช• เชœเซ‹เชถเซ‡ เช•เซ‡ เช…เชฎเซ‡ เชจเซ‹เชกเชœเซ‡เชเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช, เช…เชจเซ‡ เชธเซเช•เซเชฐเซ€เชจเชถเซ‹เชŸเชฎเชพเช‚ - .NET... เช†เชถเซเชšเชฐเซเชฏ เชชเชพเชฎเชถเซ‹ เชจเชนเซ€เช‚: เชฒเซ‡เช–เชจเซ€ เชคเซˆเชฏเชพเชฐเซ€เชจเชพ เชญเชพเช—เชฐเซ‚เชชเซ‡, เชชเซเชฐเชฅเชฎ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃเชฎเชพเช‚ เช•เซ‹เชˆ เชญเซ‚เชฒเซ‹ เชฎเชณเซ€ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เช“ เชฌเซ€เชœเชพเชฎเชพเช‚ เชฎเชณเซ€ เช†เชตเซเชฏเชพ เชนเชคเชพ.

เชจเชฟเชทเซเช•เชฐเซเชท

เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เช•เช‚เชˆ เชœเชŸเชฟเชฒ เชจเชฅเซ€!

เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชถเซ‡เชฒ เช•เชฒเซ‡เช•เซเชŸเชฐ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเชพเชฐเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชคเซ‹ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชœเซ‹เชกเชตเซเช‚ เช เช…เชนเซ€เช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชธเชฐเชณ เช•เชพเชฐเซเชฏ เชนเชถเซ‡. เช…เชจเซ‡ เชฎเชพเช‚ GitLab CI เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชคเชฎเชจเซ‡ เชฐเซ‚เชฌเซ€, เช—เซ‹, เช—เซเชฐเซ‡เชกเชฒ, เชฎเชพเชตเซ‡เชจ เช…เชจเซ‡ เช…เชจเซเชฏ เช•เซ‡เชŸเชฒเชพเช• เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชฎเชณเชถเซ‡.

PS

เช…เชฎเชพเชฐเชพ เชฌเซเชฒเซ‹เช— เชชเชฐ เชชเชฃ เชตเชพเช‚เชšเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹