குபெர்னெட்டஸுடன் GitLab CI இல் ஜூனிட்

உங்கள் மென்பொருளைச் சோதிப்பது முக்கியமானது மற்றும் அவசியமானது என்பது அனைவருக்கும் நன்றாகத் தெரியும் என்ற போதிலும், பலர் நீண்ட காலமாக தானாகவே அதைச் செய்து வருகின்றனர், ஹப்ரின் பரந்த பரப்பளவில் இதுபோன்ற பிரபலமான தயாரிப்புகளின் கலவையை அமைப்பதற்கான ஒரு செய்முறையும் இல்லை. இந்த முக்கிய இடம் (எங்களுக்கு பிடித்தது) GitLab மற்றும் JUnit . இந்த இடைவெளியை நிரப்புவோம்!

குபெர்னெட்டஸுடன் GitLab CI இல் ஜூனிட்

அறிமுகம்

முதலில், சில சூழலைக் கொடுக்கிறேன்:

  • எங்கள் பயன்பாடுகள் அனைத்தும் குபெர்னெட்டஸில் இயங்குவதால், பொருத்தமான உள்கட்டமைப்பில் சோதனைகளை நடத்துவதை நாங்கள் பரிசீலிப்போம்.
  • சட்டசபை மற்றும் வரிசைப்படுத்தலுக்கு நாங்கள் பயன்படுத்துகிறோம் வெர்ஃப் (உள்கட்டமைப்பு கூறுகளின் அடிப்படையில், இது தானாகவே ஹெல்ம் ஈடுபட்டுள்ளது என்று அர்த்தம்).
  • சோதனைகளின் உண்மையான உருவாக்கம் பற்றிய விவரங்களுக்கு நான் செல்லமாட்டேன்: எங்கள் விஷயத்தில், வாடிக்கையாளர் சோதனைகளை தானே எழுதுகிறார், மேலும் அவற்றின் வெளியீட்டை மட்டுமே நாங்கள் உறுதிசெய்கிறோம் (மேலும் ஒன்றிணைப்பு கோரிக்கையில் தொடர்புடைய அறிக்கையின் இருப்பு).


செயல்களின் பொதுவான வரிசை எப்படி இருக்கும்?

  1. பயன்பாட்டை உருவாக்குதல் - இந்த கட்டத்தின் விளக்கத்தை நாங்கள் தவிர்க்கிறோம்.
  2. குபெர்னெட்ஸ் கிளஸ்டரின் தனி பெயர்வெளியில் பயன்பாட்டைப் பயன்படுத்தவும் மற்றும் சோதனையைத் தொடங்கவும்.
  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 - சோதனைகள் மற்றும் அதற்குத் தேவையான குபெர்னெட்ஸ் வளங்களை இயக்க. பட்டியலுக்குப் பிறகு விளக்கங்களைப் பார்க்கவும்:

{{- 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 ஐப் பயன்படுத்தினாலும், கோப்பகங்களின் கூடுதல் ஏற்றம்).

விளைவாக

தயாரிக்கப்பட்ட கட்டமைப்பைப் பயன்படுத்தும்போது நாம் எதைப் பார்ப்போம்?

ஒன்றிணைப்பு கோரிக்கையானது அதன் சமீபத்திய பைப்லைனில் இயங்கும் சோதனைகளுக்கான சுருக்கமான புள்ளிவிவரங்களைக் காண்பிக்கும்:

குபெர்னெட்டஸுடன் GitLab CI இல் ஜூனிட்

ஒவ்வொரு பிழையையும் விவரங்களுக்கு இங்கே கிளிக் செய்யலாம்:

குபெர்னெட்டஸுடன் GitLab CI இல் ஜூனிட்

NB: நாம் ஒரு NodeJS பயன்பாட்டைச் சோதித்து வருகிறோம் என்பதையும், ஸ்கிரீன்ஷாட்களில் - .NET... ஆச்சரியப்பட வேண்டாம்: கட்டுரையைத் தயாரிக்கும் போது, ​​முதல் பயன்பாட்டைச் சோதித்ததில் பிழைகள் எதுவும் காணப்படவில்லை என்பதை கவனமுள்ள வாசகர் கவனிப்பார். மற்றொன்றில் காணப்பட்டன.

முடிவுக்கு

நீங்கள் பார்க்க முடியும் என, சிக்கலான எதுவும் இல்லை!

கொள்கையளவில், உங்களிடம் ஏற்கனவே ஷெல் சேகரிப்பான் இருந்தால் அது வேலை செய்கிறது, ஆனால் உங்களுக்கு குபெர்னெட்ஸ் தேவையில்லை, அதனுடன் சோதனையை இணைப்பது இங்கே விவரிக்கப்பட்டுள்ளதை விட எளிமையான பணியாக இருக்கும். மற்றும் உள்ளே GitLab CI ஆவணங்கள் ரூபி, கோ, கிரேடில், மேவன் மற்றும் சிலவற்றிற்கான உதாரணங்களை நீங்கள் காணலாம்.

சோசலிஸ்ட் கட்சி

எங்கள் வலைப்பதிவிலும் படிக்கவும்:

ஆதாரம்: www.habr.com

கருத்தைச் சேர்