ನಿಮ್ಮ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುವುದು ಮುಖ್ಯ ಮತ್ತು ಅವಶ್ಯಕವಾಗಿದೆ ಎಂದು ಎಲ್ಲರಿಗೂ ಚೆನ್ನಾಗಿ ತಿಳಿದಿದೆ ಮತ್ತು ಅನೇಕರು ದೀರ್ಘಕಾಲದವರೆಗೆ ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮಾಡುತ್ತಿದ್ದಾರೆ ಎಂಬ ವಾಸ್ತವದ ಹೊರತಾಗಿಯೂ, ಹಬರ್ನ ವಿಶಾಲತೆಯಲ್ಲಿ ಅಂತಹ ಜನಪ್ರಿಯ ಉತ್ಪನ್ನಗಳ ಸಂಯೋಜನೆಯನ್ನು ಸ್ಥಾಪಿಸಲು ಒಂದೇ ಒಂದು ಪಾಕವಿಧಾನ ಇರಲಿಲ್ಲ. ಈ ಗೂಡು (ನಮ್ಮ ನೆಚ್ಚಿನ) GitLab ಮತ್ತು JUnit . ಈ ಅಂತರವನ್ನು ತುಂಬೋಣ!
ಪರಿಚಯಾತ್ಮಕ
ಮೊದಲಿಗೆ, ನಾನು ಕೆಲವು ಸನ್ನಿವೇಶವನ್ನು ನೀಡುತ್ತೇನೆ:
ನಮ್ಮ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಕುಬರ್ನೆಟ್ಸ್ನಲ್ಲಿ ಚಾಲನೆಯಾಗುವುದರಿಂದ, ಸೂಕ್ತವಾದ ಮೂಲಸೌಕರ್ಯದಲ್ಲಿ ಪರೀಕ್ಷೆಗಳನ್ನು ನಡೆಸುವುದನ್ನು ನಾವು ಪರಿಗಣಿಸುತ್ತೇವೆ.
ಜೋಡಣೆ ಮತ್ತು ನಿಯೋಜನೆಗಾಗಿ ನಾವು ಬಳಸುತ್ತೇವೆ werf (ಮೂಲಸೌಕರ್ಯ ಘಟಕಗಳ ವಿಷಯದಲ್ಲಿ, ಇದು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹೆಲ್ಮ್ ತೊಡಗಿಸಿಕೊಂಡಿದೆ ಎಂದರ್ಥ).
ಪರೀಕ್ಷೆಗಳ ನಿಜವಾದ ರಚನೆಯ ವಿವರಗಳಿಗೆ ನಾನು ಹೋಗುವುದಿಲ್ಲ: ನಮ್ಮ ಸಂದರ್ಭದಲ್ಲಿ, ಕ್ಲೈಂಟ್ ಸ್ವತಃ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯುತ್ತಾರೆ, ಮತ್ತು ನಾವು ಅವರ ಉಡಾವಣೆಯನ್ನು ಮಾತ್ರ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುತ್ತೇವೆ (ಮತ್ತು ವಿಲೀನ ವಿನಂತಿಯಲ್ಲಿ ಅನುಗುಣವಾದ ವರದಿಯ ಉಪಸ್ಥಿತಿ).
ಕ್ರಿಯೆಗಳ ಸಾಮಾನ್ಯ ಅನುಕ್ರಮವು ಹೇಗಿರುತ್ತದೆ?
ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಮಿಸುವುದು - ನಾವು ಈ ಹಂತದ ವಿವರಣೆಯನ್ನು ಬಿಟ್ಟುಬಿಡುತ್ತೇವೆ.
ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಕುಬರ್ನೆಟ್ಸ್ ಕ್ಲಸ್ಟರ್ನ ಪ್ರತ್ಯೇಕ ನೇಮ್ಸ್ಪೇಸ್ಗೆ ನಿಯೋಜಿಸಿ ಮತ್ತು ಪರೀಕ್ಷೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ.
GitLab ನೊಂದಿಗೆ ಕಲಾಕೃತಿಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ ಮತ್ತು JUnit ವರದಿಗಳನ್ನು ಪಾರ್ಸಿಂಗ್ ಮಾಡಲಾಗುತ್ತಿದೆ.
ಹಿಂದೆ ರಚಿಸಲಾದ ನೇಮ್ಸ್ಪೇಸ್ ಅನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ.
ಈಗ - ಅನುಷ್ಠಾನಕ್ಕೆ!
ಹೊಂದಾಣಿಕೆ
ಗಿಟ್ಲ್ಯಾಬ್ ಸಿಐ
ಒಂದು ತುಣುಕಿನೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸೋಣ .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 - ಪರೀಕ್ಷೆಗಳನ್ನು ನಡೆಸಲು ಮತ್ತು ಅದಕ್ಕೆ ಅಗತ್ಯವಿರುವ ಕುಬರ್ನೆಟ್ಸ್ ಸಂಪನ್ಮೂಲಗಳು. ಪಟ್ಟಿ ಮಾಡಿದ ನಂತರ ವಿವರಣೆಗಳನ್ನು ನೋಡಿ:
ಯಾವ ರೀತಿಯ ಸಂಪನ್ಮೂಲಗಳು ಈ ಸಂರಚನೆಯಲ್ಲಿ ವಿವರಿಸಲಾಗಿದೆಯೇ? ನಿಯೋಜಿಸುವಾಗ, ನಾವು ಯೋಜನೆಗಾಗಿ ಅನನ್ಯ ನೇಮ್ಸ್ಪೇಸ್ ಅನ್ನು ರಚಿಸುತ್ತೇವೆ (ಇದನ್ನು ಸೂಚಿಸಲಾಗಿದೆ .gitlab-ci.yaml - tests-${CI_COMMIT_REF_SLUG}) ಮತ್ತು ಅದನ್ನು ಹೊರತೆಗೆಯಿರಿ:
ಕಾನ್ಫಿಗ್ಮ್ಯಾಪ್ ಪರೀಕ್ಷಾ ಲಿಪಿಯೊಂದಿಗೆ;
ಜಾಬ್ ಪಾಡ್ನ ವಿವರಣೆ ಮತ್ತು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ನಿರ್ದೇಶನದೊಂದಿಗೆ command, ಇದು ಕೇವಲ ಪರೀಕ್ಷೆಗಳನ್ನು ನಡೆಸುತ್ತದೆ;
PV ಮತ್ತು PVC, ಇದು ಪರೀಕ್ಷಾ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
ಇದರೊಂದಿಗೆ ಪರಿಚಯಾತ್ಮಕ ಸ್ಥಿತಿಗೆ ಗಮನ ಕೊಡಿ if ಮ್ಯಾನಿಫೆಸ್ಟ್ನ ಆರಂಭದಲ್ಲಿ - ಅದರ ಪ್ರಕಾರ, ಅಪ್ಲಿಕೇಶನ್ನೊಂದಿಗೆ ಹೆಲ್ಮ್ ಚಾರ್ಟ್ನ ಇತರ YAML ಫೈಲ್ಗಳನ್ನು ಸುತ್ತಿಡಬೇಕು ರಿವರ್ಸ್ ಅವರು ಪರೀಕ್ಷೆಯ ಸಮಯದಲ್ಲಿ ನಿಯೋಜಿಸಲ್ಪಡುವುದಿಲ್ಲ ಆದ್ದರಿಂದ ವಿನ್ಯಾಸ. ಅದು:
{{- if ne .Values.global.run_tests "yes" }}
---
я другой ямлик
{{- end }}
ಆದಾಗ್ಯೂ, ಪರೀಕ್ಷೆಗಳ ವೇಳೆ ಕೆಲವು ಮೂಲಭೂತ ಸೌಕರ್ಯಗಳ ಅಗತ್ಯವಿದೆ (ಉದಾಹರಣೆಗೆ, Redis, RabbitMQ, Mongo, PostgreSQL...) - ಅವರ YAML ಗಳು ಆಗಿರಬಹುದು ಕೇವಲ ಆರಿಸು. ಅವುಗಳನ್ನು ಪರೀಕ್ಷಾ ಪರಿಸರಕ್ಕೆ ನಿಯೋಜಿಸಿ... ನಿಮಗೆ ಸರಿಹೊಂದುವಂತೆ ಅವುಗಳನ್ನು ಸರಿಹೊಂದಿಸಿ, ಸಹಜವಾಗಿ.
ಅಂತಿಮ ಟಚ್
ಏಕೆಂದರೆ ಸದ್ಯಕ್ಕೆ werf ಕೆಲಸಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಜೋಡಣೆ ಮತ್ತು ನಿಯೋಜನೆ ಮಾತ್ರ ಬಿಲ್ಡ್ ಸರ್ವರ್ನಲ್ಲಿ (ಗಿಟ್ಲ್ಯಾಬ್-ರನ್ನರ್ನೊಂದಿಗೆ), ಮತ್ತು ಪರೀಕ್ಷೆಗಳೊಂದಿಗೆ ಪಾಡ್ ಅನ್ನು ಮಾಸ್ಟರ್ನಲ್ಲಿ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತದೆ, ನೀವು ಡೈರೆಕ್ಟರಿಯನ್ನು ರಚಿಸಬೇಕಾಗುತ್ತದೆ /mnt/tests ಮಾಸ್ಟರ್ ಮೇಲೆ ಮತ್ತು ಓಟಗಾರನಿಗೆ ನೀಡಿ, ಉದಾಹರಣೆಗೆ, NFS ಮೂಲಕ. ವಿವರಣೆಗಳೊಂದಿಗೆ ವಿವರವಾದ ಉದಾಹರಣೆಯನ್ನು ಕಾಣಬಹುದು K8s ದಸ್ತಾವೇಜನ್ನು.
ಗಿಟ್ಲ್ಯಾಬ್-ರನ್ನರ್ನಲ್ಲಿ ನೇರವಾಗಿ ಎನ್ಎಫ್ಎಸ್ ಹಂಚಿಕೆಯನ್ನು ಮಾಡುವುದನ್ನು ಯಾರೂ ನಿಷೇಧಿಸುವುದಿಲ್ಲ ಮತ್ತು ನಂತರ ಅದನ್ನು ಪಾಡ್ಗಳಲ್ಲಿ ಆರೋಹಿಸುವುದಿಲ್ಲ.
ಹೇಳಿಕೆಯನ್ನು
ನೀವು ಶೆಲ್ ರನ್ನರ್ನಲ್ಲಿ ನೇರವಾಗಿ ಪರೀಕ್ಷೆಗಳೊಂದಿಗೆ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಚಲಾಯಿಸಬಹುದಾದರೆ, ಉದ್ಯೋಗವನ್ನು ರಚಿಸುವ ಮೂಲಕ ಎಲ್ಲವನ್ನೂ ಏಕೆ ಸಂಕೀರ್ಣಗೊಳಿಸಬೇಕು ಎಂದು ನೀವು ಕೇಳಬಹುದು? ಉತ್ತರವು ತುಂಬಾ ಕ್ಷುಲ್ಲಕವಾಗಿದೆ ...
ಕೆಲವು ಪರೀಕ್ಷೆಗಳು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಲು ಮೂಲಸೌಕರ್ಯಕ್ಕೆ (MongoDB, RabbitMQ, PostgreSQL, ಇತ್ಯಾದಿ) ಪ್ರವೇಶದ ಅಗತ್ಯವಿರುತ್ತದೆ. ನಾವು ಪರೀಕ್ಷೆಯನ್ನು ಏಕೀಕೃತಗೊಳಿಸುತ್ತೇವೆ - ಈ ವಿಧಾನದೊಂದಿಗೆ, ಅಂತಹ ಹೆಚ್ಚುವರಿ ಘಟಕಗಳನ್ನು ಸೇರಿಸುವುದು ಸುಲಭವಾಗುತ್ತದೆ. ಇದರ ಜೊತೆಗೆ, ನಾವು ಪಡೆಯುತ್ತೇವೆ ಪ್ರಮಾಣಿತ ನಿಯೋಜನೆ ವಿಧಾನ (NFS ಅನ್ನು ಬಳಸುತ್ತಿದ್ದರೂ ಸಹ, ಡೈರೆಕ್ಟರಿಗಳ ಹೆಚ್ಚುವರಿ ಆರೋಹಣ).
ಪರಿಣಾಮವಾಗಿ
ನಾವು ಸಿದ್ಧಪಡಿಸಿದ ಸಂರಚನೆಯನ್ನು ಅನ್ವಯಿಸಿದಾಗ ನಾವು ಏನು ನೋಡುತ್ತೇವೆ?
ವಿಲೀನ ವಿನಂತಿಯು ಅದರ ಇತ್ತೀಚಿನ ಪೈಪ್ಲೈನ್ನಲ್ಲಿ ನಡೆಯುವ ಪರೀಕ್ಷೆಗಳಿಗೆ ಸಾರಾಂಶ ಅಂಕಿಅಂಶಗಳನ್ನು ತೋರಿಸುತ್ತದೆ:
ಪ್ರತಿಯೊಂದು ದೋಷವನ್ನು ವಿವರಗಳಿಗಾಗಿ ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಬಹುದು:
NB: ನಾವು ನೋಡ್ಜೆಎಸ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುತ್ತಿದ್ದೇವೆ ಮತ್ತು ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳಲ್ಲಿ - .NET... ಆಶ್ಚರ್ಯಪಡಬೇಡಿ: ಲೇಖನವನ್ನು ಸಿದ್ಧಪಡಿಸುವಾಗ, ಮೊದಲ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುವಾಗ ಯಾವುದೇ ದೋಷಗಳು ಕಂಡುಬಂದಿಲ್ಲ ಎಂದು ಗಮನ ಸೆಳೆಯುವ ಓದುಗರು ಗಮನಿಸುತ್ತಾರೆ, ಆದರೆ ಅವುಗಳು ಇನ್ನೊಂದರಲ್ಲಿ ಕಂಡುಬಂದಿವೆ.
ತೀರ್ಮಾನಕ್ಕೆ
ನೀವು ನೋಡುವಂತೆ, ಏನೂ ಸಂಕೀರ್ಣವಾಗಿಲ್ಲ!
ತಾತ್ವಿಕವಾಗಿ, ನೀವು ಈಗಾಗಲೇ ಶೆಲ್ ಸಂಗ್ರಾಹಕವನ್ನು ಹೊಂದಿದ್ದರೆ ಮತ್ತು ಅದು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದ್ದರೆ, ಆದರೆ ನಿಮಗೆ ಕುಬರ್ನೆಟ್ಸ್ ಅಗತ್ಯವಿಲ್ಲ, ಅದಕ್ಕೆ ಪರೀಕ್ಷೆಯನ್ನು ಲಗತ್ತಿಸುವುದು ಇಲ್ಲಿ ವಿವರಿಸಿದ್ದಕ್ಕಿಂತ ಸರಳವಾದ ಕಾರ್ಯವಾಗಿದೆ. ಮತ್ತು ಒಳಗೆ GitLab CI ದಸ್ತಾವೇಜನ್ನು ನೀವು ರೂಬಿ, ಗೋ, ಗ್ರೇಡಲ್, ಮಾವೆನ್ ಮತ್ತು ಇತರ ಕೆಲವು ಉದಾಹರಣೆಗಳನ್ನು ಕಾಣಬಹುದು.