āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϏāĻŋāφāχ-āĻ JUnit

āϝāĻĻāĻŋāĻ“ āϏāĻŦāĻžāχ āĻ­āĻžāϞāĻ­āĻžāĻŦ⧇ āϜāĻžāύ⧇ āϝ⧇ āφāĻĒāύāĻžāϰ āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻāĻŦāĻ‚ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ, āĻāĻŦāĻ‚ āĻ…āύ⧇āϕ⧇āχ āĻāϟāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĻā§€āĻ°ā§āϘāĻĻāĻŋāύ āϧāϰ⧇ āĻ•āϰ⧇ āφāϏāϛ⧇, āĻšāĻžāĻŦāϰ⧇āϰ āĻŦāĻŋāĻļāĻžāϞāϤāĻžāϝāĻŧ āĻāχ āϜāĻžāϤ⧀āϝāĻŧ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āĻĒāĻŖā§āϝāϗ⧁āϞāĻŋāϰ āϏāĻ‚āĻŽāĻŋāĻļā§āϰāĻŖ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϰ⧇āϏāĻŋāĻĒāĻŋ āĻ›āĻŋāϞ āύāĻžāĨ¤ (āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻŋāϝāĻŧ) GitLab āĻāĻŦāĻ‚ JUnit āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāχ āϕ⧁āϞ⧁āĻ™ā§āĻ—āĻŋāĨ¤ āĻāϰ āĻāχ āĻļā§‚āĻ¨ā§āϝāĻ¸ā§āĻĨāĻžāύ āĻĒā§‚āϰāĻŖ āĻ•āϰāĻž āϝāĻžāĻ•!

āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϏāĻŋāφāχ-āĻ JUnit

āĻĒāϰāĻŋāϚāĻžāϝāĻŧāĻ•

āĻĒā§āϰāĻĨāĻŽā§‡, āφāĻŽāĻžāϕ⧇ āĻ•āĻŋāϛ⧁ āĻĒā§āϰāϏāĻ™ā§āĻ— āĻĻāĻŋāϤ⧇ āĻĻāĻŋāύ:

  • āϝ⧇āĻšā§‡āϤ⧁ āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϕ⧁āĻŦāĻžāϰāύ⧇āĻŸā§‡ āϚāϞ⧇, āϤāĻžāχ āφāĻŽāϰāĻž āωāĻĒāϝ⧁āĻ•ā§āϤ āĻĒāϰāĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹āϤ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāĻžāϞāĻžāύ⧋āϰ āĻ•āĻĨāĻž āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻŦāĨ¤
  • āϏāĻŽāĻžāĻŦ⧇āĻļ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ werf (āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹āĻ—āϤ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϰ āĻĒāϰāĻŋāĻĒā§āϰ⧇āĻ•ā§āώāĻŋāϤ⧇, āĻāϟāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦā§‹āĻāĻžāϝāĻŧ āϝ⧇ āĻšā§‡āϞāĻŽ āϜāĻĄāĻŧāĻŋāϤ)āĨ¤
  • āφāĻŽāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻĒā§āϰāĻ•ā§ƒāϤ āϏ⧃āĻˇā§āϟāĻŋāϰ āĻŦāĻŋāĻŦāϰāϪ⧇ āϝāĻžāĻŦ āύāĻž: āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āύāĻŋāĻœā§‡āχ āĻĒāϰ⧀āĻ•ā§āώāĻžāϗ⧁āϞāĻŋ āϞ⧇āϖ⧇āύ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āϕ⧇āĻŦāϞ āϤāĻžāĻĻ⧇āϰ āϞāĻžā§āϚ (āĻāĻŦāĻ‚ āĻŽāĻžāĻ°ā§āϜ āĻ…āύ⧁āϰ⧋āϧ⧇ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ⧇āϰ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤāĻŋ) āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻŋāĨ¤


āĻ•āĻ°ā§āĻŽā§‡āϰ āϏāĻžāϧāĻžāϰāĻŖ āĻ•ā§āϰāĻŽ āϕ⧇āĻŽāύ āĻšāĻŦ⧇?

  1. āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻž - āφāĻŽāϰāĻž āĻāχ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž āĻŦāĻžāĻĻ āĻĻ⧇āĻŦāĨ¤
  2. Kubernetes āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āύāĻžāĻŽāĻ¸ā§āĻĨāĻžāύ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύāĨ¤
  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

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 }}

āĻ•āĻŋ āϧāϰāύ⧇āϰ āϏāĻŽā§āĻĒāĻĻ āĻāχ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ? āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āφāĻŽāϰāĻž āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āύāĻ¨ā§āϝ āύāĻžāĻŽāĻ¸ā§āĻĨāĻžāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ (āĻāϟāĻŋ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāϤ āφāϛ⧇ .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 āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ. āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ... āĻ…āĻŦāĻļā§āϝāχ āφāĻĒāύāĻžāϰ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻŽāύ⧇ āĻšāϞ⧇ āϏ⧇āϗ⧁āϞāĻŋ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝ āĻ•āϰ⧁āύ⧎

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻ¸ā§āĻĒāĻ°ā§āĻļ

āĻ•āĻžāϰāĻŖ 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

āϕ⧇āω āϏāϰāĻžāϏāϰāĻŋ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ-āϰāĻžāύāĻžāϰ⧇ āĻāĻ•āϟāĻŋ NFS āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āĻāϟāĻŋāϕ⧇ āĻĒāĻĄāϗ⧁āϞāĻŋāϤ⧇ āĻŽāĻžāωāĻ¨ā§āϟ āĻ•āϰāϤ⧇ āύāĻŋāώ⧇āϧ āĻ•āϰ⧇ āύāĻžāĨ¤

āĻŽāĻ¨ā§āϤāĻŦā§āϝ

āφāĻĒāύāĻŋ āĻšāϝāĻŧāϤ⧋ āϜāĻŋāĻœā§āĻžāĻžāϏāĻž āĻ•āϰāϛ⧇āύ āϝ⧇ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻļ⧇āϞ āϰāĻžāύāĻžāϰ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āϏāĻš āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ āϤāĻŦ⧇ āϕ⧇āύ āĻāĻ•āϟāĻŋ āϚāĻžāĻ•āϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁āϕ⧇ āϜāϟāĻŋāϞ āĻ•āϰāĻŦ⧇āύ? āωāĻ¤ā§āϤāϰāϟāĻž āϖ⧁āĻŦāχ āϤ⧁āĻšā§āĻ›...

āĻ•āĻŋāϛ⧁ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻĒāϰāĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ (MongoDB, RabbitMQ, PostgreSQL, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ) āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āĻ•āĻŋāύāĻž āϤāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āφāĻŽāϰāĻž āĻĒāϰ⧀āĻ•ā§āώāĻžāϕ⧇ āĻāϕ⧀āĻ­ā§‚āϤ āĻ•āϰāĻŋ - āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻāχ āϧāϰāύ⧇āϰ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϏāĻ¤ā§āϤāĻž āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āϏāĻšāϜ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤ āĻāχ āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āφāĻŽāϰāĻž āĻĒ⧇āϤ⧇ āĻŽāĻžāύ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻĒāĻĻā§āϧāϤāĻŋ (āĻāĻŽāύāĻ•āĻŋ NFS āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇āĻ“, āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϰ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻŽāĻžāωāĻ¨ā§āϟāĻŋāĻ‚)āĨ¤

āĻĢāϞ

āφāĻŽāϰāĻž āϝāĻ–āύ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻŦ āϤāĻ–āύ āφāĻŽāϰāĻž āϕ⧀ āĻĻ⧇āĻ–āĻŦ?

āĻŽāĻžāĻ°ā§āϜ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋ āϤāĻžāϰ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻĒāĻžāχāĻĒāϞāĻžāχāύ⧇ āϚāĻžāϞāĻžāύ⧋ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻžāϰāϏāĻ‚āĻ•ā§āώ⧇āĻĒ āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ āĻĻ⧇āĻ–āĻžāĻŦ⧇:

āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϏāĻŋāφāχ-āĻ JUnit

āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ–āĻžāύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇:

āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϏāĻŋāφāχ-āĻ JUnit

NB: āĻŽāύ⧋āϝ⧋āĻ—ā§€ āĻĒāĻžāĻ āĻ• āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāĻŦ⧇āύ āϝ⧇ āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ NodeJS āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻ›āĻŋ, āĻāĻŦāĻ‚ āĻ¸ā§āĻ•ā§āϰāĻŋāύāĻļāϟāϗ⧁āϞāĻŋāϤ⧇ - .NET... āĻ…āĻŦāĻžāĻ• āĻšāĻŦ⧇āύ āύāĻž: āĻāϟāĻŋ āĻ āĻŋāĻ• āϝ⧇ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻĒā§āϰāĻĨāĻŽ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϕ⧋āύāĻ“ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāύāĻŋ, āϤāĻŦ⧇ āϤāĻžāϰāĻž āĻ…āĻ¨ā§āϝāϟāĻŋāϤ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϛ⧇āĨ¤

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻ•āĻŋāϛ⧁āχ āϜāϟāĻŋāϞ!

āύ⧀āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇, āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻļ⧇āϞ āϏāĻ‚āĻ—ā§āϰāĻžāĻšāĻ• āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ•āĻžāϜ āĻ•āϰ⧇ āϤāĻŦ⧇ āφāĻĒāύāĻžāϰ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ, āĻāϟāĻŋāϰ āϏāĻžāĻĨ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻāĻ–āĻžāύ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻšāĻ“āϝāĻŧāĻžāϰ āĻšā§‡āϝāĻŧ⧇ āφāϰāĻ“ āϏāĻšāϜ āĻ•āĻžāϜ āĻšāĻŦ⧇āĨ¤ āĻāĻŦāĻ‚ āĻ­āĻŋāϤāϰ⧇ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϏāĻŋāφāχ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āφāĻĒāύāĻŋ āϰ⧁āĻŦāĻŋ, āĻ—ā§‹, āĻ—ā§āϰ⧇āĻĄāϞ, āĻŽā§āϝāĻžāϭ⧇āύ āĻāĻŦāĻ‚ āφāϰāĻ“ āĻ•āĻŋāϛ⧁ āωāĻĻāĻžāĻšāϰāĻŖ āĻĒāĻžāĻŦ⧇āύāĨ¤

āĻĻā§āϰāĻˇā§āϟāĻŦā§āϝ

āφāĻŽāĻžāĻĻ⧇āϰ āĻŦā§āϞāϗ⧇āĻ“ āĻĒāĻĄāĻŧ⧁āύ:

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster