เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตŠเดชเตเดชเด‚ GitLab CI-เดฏเดฟเดฒเต† เดœเต‚เดฃเดฟเดฑเตเดฑเต

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเตเดฐเดงเดพเดจเดตเตเด‚ เด†เดตเดถเตเดฏเดตเตเดฎเดพเดฃเต†เดจเตเดจเต เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚ เดจเดจเตเดจเดพเดฏเดฟ เด…เดฑเดฟเดฏเดพเดฎเต†เด™เตเด•เดฟเดฒเตเด‚, เดชเดฒเดฐเตเด‚ เด‡เดคเต เดตเดณเดฐเต†เด•เตเด•เดพเดฒเดฎเดพเดฏเดฟ เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เดนเดฌเดฑเดฟเดจเตเดฑเต† เดตเดฟเดถเดพเดฒเดคเดฏเดฟเตฝ เด…เดคเตเดคเดฐเด‚ เดœเดจเดชเตเดฐเดฟเดฏ เด‰เตฝเดชเตเดชเดจเตเดจเด™เตเด™เดณเตเดŸเต† เดธเด‚เดฏเต‹เดœเดจเด‚ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดชเดพเดšเด•เด•เตเด•เตเดฑเดฟเดชเตเดชเตเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดฒเตเดฒ. เด‡เดคเต (เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดฟเดฏเดชเตเดชเต†เดŸเตเดŸ) GitLab เด‰เด‚ JUnit เด‰เด‚ เดชเต‹เดฒเต†เดฏเดพเดฃเต. เดจเดฎเตเด•เตเด•เต เดˆ เดตเดฟเดŸเดตเต เดจเดฟเด•เดคเตเดคเดพเด‚!

เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตŠเดชเตเดชเด‚ GitLab CI-เดฏเดฟเดฒเต† เดœเต‚เดฃเดฟเดฑเตเดฑเต

เด†เดฎเตเด–เด‚

เด†เดฆเตเดฏเด‚, เดžเดพเตป เด•เตเดฑเดšเตเดšเต เดธเดจเตเดฆเตผเดญเด‚ เดจเตฝเด•เดŸเตเดŸเต†:

  • เดžเด™เตเด™เดณเตเดŸเต† เดŽเดฒเตเดฒเดพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด‰เดšเดฟเดคเดฎเดพเดฏ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เตพ เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต เดžเด™เตเด™เตพ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด‚.
  • เด…เดธเด‚เดฌเตเดฒเดฟเด•เตเด•เตเด‚ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเตเด‚ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดตเต†เตผเดซเต (เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด‡เดคเต เดธเตเดตเดฏเดฎเต‡เดต เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต เดนเต†เตฝเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดพเดฃเต).
  • เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เดฏเดฅเดพเตผเดคเตเดฅ เดธเตƒเดทเตเดŸเดฟเดฏเตเดŸเต† เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดžเดพเตป เดชเต‹เด•เดฟเดฒเตเดฒ: เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด•เตเดฒเดฏเดจเตเดฑเต เดธเตเดตเดฏเด‚ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดžเด™เตเด™เตพ เด…เดตเดฏเตเดŸเต† เดธเดฎเดพเดฐเด‚เดญเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดฑเดชเตเดชเดพเด•เตเด•เต‚ (เด•เต‚เดŸเดพเดคเต† เดฒเดฏเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ เด…เดจเตเดฌเดจเตเดง เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเดฟเดจเตเดฑเต† เดธเดพเดจเตเดจเดฟเดงเตเดฏเด‚).


เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดชเตŠเดคเตเดตเดพเดฏ เด•เตเดฐเดฎเด‚ เดŽเด™เตเด™เดจเต†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚?

  1. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต - เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดตเดฐเดฃเด‚ เดžเด™เตเด™เตพ เด’เดดเดฟเดตเดพเด•เตเด•เตเด‚.
  2. เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•.
  3. GitLab เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดพเดตเดธเตเดคเตเด•เตเด•เตพเด•เตเด•เดพเดฏเดฟ เดคเดฟเดฐเดฏเตเด•เดฏเตเด‚ เดœเต‚เดฃเดฟเดฑเตเดฑเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  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. เด•เต‹เตบเดซเดฟเด—เตผเดฎเดพเดชเตเดชเต เดŸเต†เดธเตเดฑเตเดฑเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต;
  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-เดฏเดฟเดฒเต† เดœเต‚เดฃเดฟเดฑเตเดฑเต

เด“เดฐเต‹ เดชเดฟเดถเด•เตเด‚ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด‡เดตเดฟเดŸเต† เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเด‚:

เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตŠเดชเตเดชเด‚ GitLab CI-เดฏเดฟเดฒเต† เดœเต‚เดฃเดฟเดฑเตเดฑเต

NB: เดžเด™เตเด™เตพ เด’เดฐเต NodeJS เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเตเด‚ เดธเตเด•เตเดฐเต€เตปเดทเต‹เดŸเตเดŸเตเด•เดณเดฟเตฝ - .NET... เด†เดถเตเดšเดฐเตเดฏเดชเตเดชเต†เดŸเต‡เดฃเตเดŸ: เดฒเต‡เด–เดจเด‚ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด†เดฆเตเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดชเดฟเดถเด•เตเด•เดณเตŠเดจเตเดจเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจ เดตเดพเดฏเดจเด•เตเด•เดพเดฐเตป เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด‚, เดชเด•เตเดทเต‡ เด…เดต เดฎเดฑเตเดฑเตŠเดจเตเดจเดฟเตฝ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด’เดจเตเดจเตเด‚ เดคเดจเตเดจเต†เดฏเดฟเดฒเตเดฒ!

เดคเดคเตเดตเดคเตเดคเดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เด’เดฐเต เดทเต†เตฝ เด•เดณเด•เตเดŸเตผ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ, เด…เดคเดฟเดฒเต‡เด•เตเด•เต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เด…เดฑเตเดฑเดพเดšเตเดšเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด‡เดตเดฟเดŸเต† เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต‡เด•เตเด•เดพเตพ เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดฐเต เดœเต‹เดฒเดฟเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เด’เดชเตเดชเด‚ เด…เด•เดคเตเดคเตเด‚ GitLab CI เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป Ruby, Go, Gradle, Maven เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตเด‚ เดฎเดฑเตเดฑเต เดšเดฟเดฒเดคเดฟเดจเตเด‚ เดจเดฟเด™เตเด™เตพ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเด‚.

เดชเดฟ.เดŽเดธเต

เดžเด™เตเด™เดณเตเดŸเต† เดฌเตเดฒเต‹เด—เดฟเดฒเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด•:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•