JUnit เปƒเบ™ GitLab CI เบเบฑเบš Kubernetes

เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ—เบธเบเบ„เบปเบ™เบฎเบนเป‰เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบงเปˆเบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบŠเบญเบšเปเบงเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™เปเบฅเบฐเบˆเปเบฒเป€เบ›เบฑเบ™, เปเบฅเบฐเบซเบผเบฒเบเบ„เบปเบ™เป„เบ”เป‰เป€เบฎเบฑเบ”เบกเบฑเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™, เปƒเบ™เบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เปƒเบซเบเปˆเบ‚เบญเบ‡ Habr เบšเปเปˆเบกเบตเบชเบนเบ”เบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ—เบตเปˆเบ™เบดเบเบปเบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™. niche เบ™เบตเป‰เป€เบ›เบฑเบ™ ( favorite เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ) GitLab เปเบฅเบฐ JUnit . เปƒเบซเป‰เบ•เบทเปˆเบกเบŠเปˆเบญเบ‡เบซเบงเปˆเบฒเบ‡เบ™เบตเป‰!

JUnit เปƒเบ™ GitLab CI เบเบฑเบš Kubernetes

เปเบ™เบฐเบ™เปเบฒ

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปƒเบซเป‰เบšเบฒเบ‡เบชเบฐเบžเบฒเบšเบเบฒเบ™:

  • เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ—เบธเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™ Kubernetes, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเปˆเบ™เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก.
  • เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบšเปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ werf (เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡, เบ™เบตเป‰เบเบฑเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ Helm เบกเบตเบชเปˆเบงเบ™เบฎเปˆเบงเบกเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”).
  • เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบˆเบดเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš: เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบฅเบนเบเบ„เป‰เบฒเบ‚เบฝเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ (เปเบฅเบฐเบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบฅเบงเบก).


เบฅเปเบฒเบ”เบฑเบšเบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เบเบฐเบ—เปเบฒเบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเปเบ™เบงเปƒเบ”?

  1. เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ - เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบปเบเป€เบงเบฑเป‰เบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰.
  2. เบ™เบณเปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป„เบ›เบชเบนเปˆ namespace เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ‚เบญเบ‡เบเบธเปˆเบก Kubernetes เปเบฅเบฐเป€เบฅเบตเปˆเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.
  3. เบ„เบปเป‰เบ™เบซเบฒเบชเบดเปˆเบ‡เบ›เบญเบก เปเบฅเบฐเบงเบดเป€เบ„เบฒเบฐเบฅเบฒเบเบ‡เบฒเบ™ JUnit เบ”เป‰เบงเบ GitLab.
  4. เบเบฒเบ™เบฅเบถเบš namespace เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบเปˆเบญเบ™เปœเป‰เบฒเบ™เบตเป‰.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ - เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”!

เบเบฒเบ™เบ›เบฑเบš

GitLab CI

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบŠเบดเป‰เบ™เบชเปˆเบงเบ™ .gitlab-ci.yaml, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเปˆเบ™. เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเป€เบ›เบฑเบ™ voluminous, เบชเบฐเบ™เบฑเป‰เบ™เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบเบญเบšเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เบเบฑเบšเบ„เปเบฒเป€เบซเบฑเบ™:

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

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต .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 }}

เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ›เบฐเป€เบžเบ”เปƒเบ” เบญเบฐเบ—เบดเบšเบฒเบเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰เบšเป? เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบชเป‰เบฒเบ‡ namespace เป€เบ›เบฑเบ™โ€‹เป€เบญโ€‹เบเบฐโ€‹เบฅเบฑเบโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™ (เบญเบฑเบ™โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบฅเบฐโ€‹เบšเบธโ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹ .gitlab-ci.yaml - tests-${CI_COMMIT_REF_SLUG}) เปเบฅเบฐโ€‹เบกเป‰เบงเบ™โ€‹เบกเบฑเบ™โ€‹เบญเบญเบโ€‹:

  1. ConfigMap เบเบฑเบš script เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš;
  2. เบงเบฝเบเป€เบฎเบฑเบ”เบ‡เบฒเบ™เบ—เปเบฒ เบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบเบฑเบเปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰ command, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเปเบฅเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš;
  3. PV เปเบฅเบฐ PVC, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.

เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเบเบฑเบš if เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡ manifest - เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก, เป„เบŸเบฅเปŒ YAML เบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Helm เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบซเปเปˆเบขเบนเปˆเปƒเบ™. เบ”เป‰เบฒเบ™เบซเบฅเบฑเบ‡ เบเบฒเบ™เบญเบญเบเปเบšเบšเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบžเบงเบเบกเบฑเบ™เบ–เบทเบเบ™เบณเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš. เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™:

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

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš เบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡ (เบ•เบปเบงเบขเปˆเบฒเบ‡, Redis, RabbitMQ, Mongo, PostgreSQL...) - YAMLs เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™. เบšเปเปˆ เบ›เบดเบ”. เบ™เบณเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™... เบเบฒเบ™เบ›เบฑเบšเบžเบงเบเบกเบฑเบ™เบ•เบฒเบกเบ—เบตเปˆเป€เบˆเบปเป‰เบฒเป€เบซเบฑเบ™เบงเปˆเบฒเป€เปเบฒเบฐเบชเบปเบก, เปเบ™เปˆเบ™เบญเบ™.

เบเบฒเบ™เบชเปเบฒเบžเบฑเบ”เบชเบธเบ”เบ—เป‰เบฒเบ

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบเบฒเบ™เบ›เบฐเบเบญเบšเปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ werf เป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ เบžเบฝเบ‡เปเบ•เปˆ เปƒเบ™เป€เบŠเบตเบšเป€เบงเบตเบชเป‰เบฒเบ‡ (เบเบฑเบš gitlab-runner), เปเบฅเบฐเบเบฑเบเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™เปเบกเปˆเบšเบปเบ”, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต. /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 เป‚เบ”เบเบเบปเบ‡เปƒเบ™ gitlab-runner, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบเบฑเบ.

ะŸั€ะธะผะตั‡ะฐะฝะธะต

เป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบ–เบฒเบกเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบชเบฑเบšเบชเบปเบ™เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡ Job เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เปเบฅเปˆเบ™เบชเบฐเบ„เบฃเบดเบšเบ”เป‰เบงเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเบเบปเบ‡เปƒเบชเปˆ shell runner? เบ„เปเบฒเบ•เบญเบšเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ ...

เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™ (MongoDB, RabbitMQ, PostgreSQL, เปเบฅเบฐเบญเบทเปˆเบ™เป†) เป€เบžเบทเปˆเบญเบเบงเบ”เบชเบญเบšเบงเปˆเบฒเบžเบงเบเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบ›เบฑเบ™เป€เบญเบเบฐเบžเบฒเบš - เบ”เป‰เบงเบเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบฅเบงเบกเป€เบญเบปเบฒเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง. เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบˆเบฐเปƒเบŠเป‰ NFS, เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป€เบžเบตเปˆเบกเป€เบ•เบตเบก).

เบœเบปเบ™

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™เบซเบเบฑเบ‡เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบเบฝเบกเป„เบงเป‰?

เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบฅเบงเบกเบเบฑเบ™เบˆเบฐเบชเบฐเปเบ”เบ‡เบชเบฐเบ–เบดเบ•เบดเบชเบฐเบซเบผเบธเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™เบ—เปเปˆเบซเบฅเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡เบกเบฑเบ™:

JUnit เปƒเบ™ GitLab CI เบเบฑเบš Kubernetes

เปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบชเบฒเบกเบฒเบ”เบ„เบฅเบดเบเบ—เบตเปˆเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”:

JUnit เปƒเบ™ GitLab CI เบเบฑเบš Kubernetes

NB: เบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบตเปˆเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบ—เบปเบ”เบชเบญเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ NodeJS, เปเบฅเบฐเปƒเบ™ screenshots - .NET ... เบšเปเปˆเบ•เป‰เบญเบ‡เปเบ›เบเปƒเบˆ: เบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบงเปˆเบฒเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฐเบเบฝเบกเบšเบปเบ”เบ„เบงเบฒเบก, เบšเปเปˆเบžเบปเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เปเบ•เปˆเบžเบงเบเป€เบ‚เบปเบฒ เป„เบ”เป‰เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เบญเบทเปˆเบ™.

เบชเบฐเบซเบฅเบธเบš

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเป€เบซเบฑเบ™, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบชเบฑเบšเบชเบปเบ™!

เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ•เบปเบงเป€เบเบฑเบšเปเบเบฐเปเบฅเป‰เบงเปเบฅเบฐเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เปเบ•เปˆเบ—เปˆเบฒเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ Kubernetes, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบ•เบดเบ”เบขเบนเปˆเบเบฑเบšเบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบเบงเปˆเบฒเบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เปเบฅเบฐเปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™ GitLab CI เป€เบˆเบปเป‰เบฒเบˆเบฐเบžเบปเบšเป€เบซเบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบš Ruby, Go, Gradle, Maven เปเบฅเบฐเบญเบทเปˆเบ™เป†เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡.

PS

เบญเปˆเบฒเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™ blog เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™