Kubernetes рд╕рдВрдЧ GitLab CI рдорд╛ JUnit

рдпрд╕ рддрдереНрдпрдХреЛ рдмрд╛рд╡рдЬреБрдж рд╕рдмреИрд▓рд╛рдИ рд░рд╛рдореНрд░рд░реА рдерд╛рд╣рд╛ рдЫ рдХрд┐ рддрдкрд╛рдИрдВрдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░рдХреЛ рдкрд░реАрдХреНрд╖рдг рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд░ рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдзреЗрд░реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдЧрд░реНрджреИ рдЖрдПрдХрд╛ рдЫрдиреН, Habr рдХреЛ рд╡рд┐рд╢рд╛рд▓рддрд╛рдорд╛ рддреНрдпрд╣рд╛рдБ рддреНрдпрд╕реНрддрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрддреНрдкрд╛рджрдирд╣рд░реВрдХреЛ рд╕рдВрдпреЛрдЬрди рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рдПрдХрд▓ рдиреБрд╕реНрдЦрд╛ рдерд┐рдПрдиред рдпреЛ рдЖрд▓рд╛ (рд╣рд╛рдореНрд░реЛ рдордирдкрд░реНрдиреЗ) GitLab рд░ JUnit рдХреЛ рд░реВрдкрдорд╛ред рдпреЛ рдЦрд╛рд▓реА рдард╛рдЙрдБ рднрд░реМрдВ!

Kubernetes рд╕рдВрдЧ GitLab CI рдорд╛ JUnit

рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ

рдкрд╣рд┐рд▓реЗ, рдорд▓рд╛рдИ рдХреЗрд╣рд┐ рд╕рдиреНрджрд░реНрдн рджрд┐рдиреБрд╣реЛрд╕реН:

  • рд╣рд╛рдореНрд░рд╛ рд╕рдмреИ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВ Kubernetes рдорд╛ рдЪрд▓реНрдиреЗ рднрдПрдХреЛрд▓реЗ, рд╣рд╛рдореА рдЙрдкрдпреБрдХреНрдд рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдорд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдЙрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреЗрдЫреМрдВред
  • рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рд╡рд╛рдл (рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдШрдЯрдХрд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдпрд╕рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд░реНрде рд╣реЛ рдХрд┐ рд╣реЗрд▓рдо рд╕рдВрд▓рдЧреНрди рдЫ)ред
  • рдо рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд░реНрдЬрдирд╛рдХреЛ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдорд╛ рдЬрд╛рдиреЗрдЫреИрди: рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛рдорд╛, рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдЖрдлреИрдВрд▓реЗ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рд▓реЗрдЦреНрдЫ, рд░ рд╣рд╛рдореА рдХреЗрд╡рд▓ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕реБрд░реБрд╡рд╛рдд (рд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рд░рд┐рдкреЛрд░реНрдЯрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдЫреМрдВред


рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреНрд░рдо рдХрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ?

  1. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ - рд╣рд╛рдореА рдпрд╕ рдЪрд░рдгрдХреЛ рд╡рд┐рд╡рд░рдг рдЫреЛрдбреНрдиреЗрдЫреМрдВред
  2. рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рдЫреБрдЯреНрдЯреИ рдиреЗрдорд╕реНрдкреЗрд╕рдорд╛ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдкрд░реАрдХреНрд╖рдг рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  3. рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЦреЛрдЬреНрджреИ рд░ GitLab рд╕рдБрдЧ JUnit рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдкрд╛рд░реНрд╕ рдЧрд░реНрджреИред
  4. рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдЯрд╛рдЙрдБрджреИред

рдЕрдм - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди!

рд╕рдорд╛рдпреЛрдЬрди

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}) рд░ рдпрд╕рд▓рд╛рдИ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

  1. рдХрдиреНрдлрд┐рдЧрдореНрдпрд╛рдк рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдкрд┐ рд╕рдВрдЧ;
  2. рдХрд╛рдо рдкреЛрдбрдХреЛ рд╡рд┐рд╡рд░рдг рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рд╕рд╛рде command, рдЬрд╕рд▓реЗ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдБрдЫ;
  3. PV рд░ PVC, рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН if рдореНрдпрд╛рдирд┐рдлреЗрд╕реНрдЯрдХреЛ рд╕реБрд░реБрдорд╛ - рддрджрдиреБрд╕рд╛рд░, рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рд╕рд╛рде рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯрдХрд╛ рдЕрдиреНрдп YAML рдлрд╛рдЗрд▓рд╣рд░реВ рдмреЗрд░рд┐рдПрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рдЙрд▓реНрдЯреЛ рдбрд┐рдЬрд╛рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рддрд╛рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рдордпрдорд╛ рддреИрдирд╛рдд рдирд╣реЛрд╕реНред рддреНрдпреЛ рд╣реЛ:

{{- if ne .Values.global.run_tests "yes" }}
---
╤П ╨┤╤А╤Г╨│╨╛╨╣ ╤П╨╝╨╗╨╕╨║
{{- end }}

рдпрджреНрдпрдкрд┐, рдпрджрд┐ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдХреЗрд╣реА рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдЪрд╛рд╣рд┐рдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Redis, RabbitMQ, Mongo, PostgreSQL...) - рддрд┐рдиреАрд╣рд░реВрдХрд╛ YAML рд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреН рдЫреИрди рдмрдиреНрдж рдЧрд░реНрдиреБрд╣реЛрд╕реНред рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН... рддрдкрд╛рдИрдВрд▓реЗ рдЙрдкрдпреБрдХреНрдд рджреЗрдЦреНрдиреБрднрдПрдХреЛ рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдорд╛рдпреЛрдЬрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдЕрдиреНрддрд┐рдо рд╕реНрдкрд░реНрд╢

рдХрд┐рдирднрдиреЗ werf рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рддреИрдирд╛рддреА рдЕрдЭреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ рдорд╛рддреНрд░ рдмрд┐рд▓реНрдб рд╕рд░реНрднрд░рдорд╛ (рдЧрд┐рдЯрд▓реНрдпрд╛рдм-рд░рдирд░рдХреЛ рд╕рд╛рде), рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рд╛рде рдкреЛрдб рдорд╛рд╕реНрдЯрд░рдорд╛ рд╕реБрд░реВ рдЧрд░рд┐рдПрдХреЛ рдЫ, рддрдкрд╛рдИрдВрд▓реЗ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред /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

Gitlab-runner рдорд╛ рд╕рд┐рдзреИ NFS рд╕реЗрдпрд░ рдмрдирд╛рдЙрди, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рдкреЛрдбрдорд╛ рдорд╛рдЙрдиреНрдЯ рдЧрд░реНрди рдХрд╕реИрд▓реЗ рдирд┐рд╖реЗрдз рдЧрд░реНрджреИрдиред

рднрдиреНрдиреБ

рддрдкрд╛рдИрд▓реЗ рд╕реЛрдзрд┐рд░рд╣рдиреБ рднрдПрдХреЛ рд╣реБрдирд╕рдХреНрдЫ рдпрджрд┐ рддрдкрд╛рдИрд▓реЗ рд╕рд┐рдзреИ рд╢реЗрд▓ рд░рдирд░рдорд╛ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рд╛рде рд▓рд┐рдкрд┐ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рд░реЛрдЬрдЧрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рд╕рдмреИ рдХреБрд░рд╛рд▓рд╛рдИ рдХрд┐рди рдЬрдЯрд┐рд▓ рдмрдирд╛рдЙрдиреЗ? рдЬрд╡рд╛рдл рдПрдХрджрдо рдорд╛рдореВрд▓реА рдЫ ...

рдХреЗрд╣реА рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрд▓рд╛рдИ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдорд╛ рдкрд╣реБрдБрдЪ рдЪрд╛рд╣рд┐рдиреНрдЫ (MongoDB, RabbitMQ, PostgreSQL, рдЖрджрд┐) рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫрдиреН рднрдиреЗрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реНрдиред рд╣рд╛рдореА рдкрд░реАрдХреНрд╖рдгрд▓рд╛рдИ рдПрдХреАрдХреГрдд рдмрдирд╛рдЙрдБрдЫреМрдВ - рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рддреНрдпрд╕реНрддрд╛ рдердк рд╕рдВрд╕реНрдерд╛рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреНрдЫред рдпрд╕рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рд╛рдореАрд▓реЗ рдкрд╛рдЙрдБрдЫреМрдВ рдорд╛рдирдХ рддреИрдирд╛рддреА рджреГрд╖реНрдЯрд┐рдХреЛрдг (NFS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рдкрдирд┐, рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдЙрдиреНрдЯрд┐рдЩ)ред

рдкрд░рд┐рдгрд╛рдо

рд╣рд╛рдореАрд▓реЗ рддрдпрд╛рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд▓рд╛рдЧреВ рдЧрд░реНрджрд╛ рд╣рд╛рдореА рдХреЗ рджреЗрдЦреНрдиреЗрдЫреМрдВ?

рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд▓реЗ рдпрд╕рдХреЛ рдкрдЫрд┐рд▓реНрд▓реЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рдЪрд▓рд╛рдЗрдПрдХреЛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рд░рд╛рдВрд╢ рддрдереНрдпрд╛рдЩреНрдХрд╣рд░реВ рджреЗрдЦрд╛рдЙрдиреЗрдЫ:

Kubernetes рд╕рдВрдЧ GitLab CI рдорд╛ JUnit

рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

Kubernetes рд╕рдВрдЧ GitLab CI рдорд╛ JUnit

NB: рдзреНрдпрд╛рди рджрд┐рдПрд░ рдкрд╛рдардХрд▓реЗ рд╣рд╛рдореАрд▓реЗ NodeJS рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИрдЫреМрдВ, рд░ рд╕реНрдХреНрд░рд┐рдирд╕рдЯрд╣рд░реВрдорд╛ - .NET... рдЕрдЪрдореНрдо рдирдорд╛рдиреНрдиреБрд╣реЛрд╕реН: рдпреЛ рдорд╛рддреНрд░ рд╣реЛ рдХрд┐ рд▓реЗрдЦ рддрдпрд╛рд░ рдЧрд░реНрджрд╛, рдкрд╣рд┐рд▓реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджрд╛ рдХреБрдиреИ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд░реЗрдирдиреН, рддрд░ рддрд┐рдиреАрд╣рд░реВ рдЕрд░реНрдХреЛрдорд╛ рднреЗрдЯрд┐рдпреЛред

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдХреЗрд╣рд┐ рдкрдирд┐ рдЬрдЯрд┐рд▓ рдЫреИрди!

рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдЦреЛрд▓ рдХрд▓реЗрдХреНрдЯрд░ рдЫ рд░ рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд░ рддрдкрд╛рдЗрдБрд▓рд╛рдИ Kubernetes рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди, рдпрд╕рдорд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд▓рдЧреНрди рдЧрд░реНрдиреБ рдпрд╣рд╛рдБ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рднрдиреНрджрд╛ рдЕрдЭ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реБрдиреЗрдЫред рд░ рдорд╛ GitLab CI рдХрд╛рдЧрдЬрд╛рдд рддрдкрд╛рдИрдВрд▓реЗ рд░реБрдмреА, рдЧреЛ, рдЧреНрд░реЗрдбрд▓, рдорд╛рднреЗрди рд░ рдХреЗрд╣реА рдЕрдиреНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред

PS

рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди