JUnit ku GitLab CI ndi Kubernetes

Ngakhale kuti aliyense amadziwa bwino kuti kuyesa mapulogalamu anu ndikofunikira komanso kofunikira, ndipo ambiri akhala akuchita izi zokha kwa nthawi yayitali, mukukula kwa Habr kunalibe njira imodzi yopangira kuphatikiza kwazinthu zodziwika bwino. niche iyi monga (yomwe timakonda) GitLab ndi JUnit. Tiyeni tikwaniritse kusiyana kumeneku!

JUnit ku GitLab CI ndi Kubernetes

Chiyambi

Choyamba, ndiloleni ndifotokoze nkhani ina:

  • Popeza ntchito zathu zonse zikuyenda pa Kubernetes, tilingalira zoyeserera pazoyenera.
  • Kupanga ndi kutumiza timagwiritsa ntchito werf (potengera magawo azomangamanga, izi zikutanthauzanso kuti Helm akukhudzidwa).
  • Sindingapite mwatsatanetsatane za kulengedwa kwenikweni kwa mayesero: kwa ife, kasitomala amalemba mayeserowo yekha, ndipo timangotsimikizira kukhazikitsidwa kwawo (ndi kukhalapo kwa lipoti lofanana ndi pempho lophatikizana).


Kodi mndandanda wa zochita uzikhala bwanji?

  1. Kumanga ntchito - tidzasiya kufotokozera kwa gawoli.
  2. Tumizani pulogalamuyi kumalo osiyana a gulu la Kubernetes ndikuyamba kuyesa.
  3. Kusaka zinthu zakale ndikugawa malipoti a JUnit ndi GitLab.
  4. Kuchotsa dzina lopangidwa kale.

Tsopano - kukhazikitsa!

kusintha

GitLab CI

Tiyeni tiyambe ndi chidutswa .gitlab-ci.yaml, yomwe imafotokoza kutumiza ntchitoyo ndikuyesa mayeso. Mindandandayo idakhala yochuluka kwambiri, kotero idawonjezedwa bwino ndi ndemanga:

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

Tsopano mu chikwatu .helm/templates tiyeni tipange YAML ndi Job - tests-job.yaml - kuyendetsa mayeso ndi zida za Kubernetes zomwe zimafunikira. Onani mafotokozedwe pambuyo pa mindandanda:

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

Zida zotani zafotokozedwa mu kasinthidwe aka? Potumiza, timapanga dzina lapadera la polojekitiyi (izi zikuwonetsedwa mu .gitlab-ci.yaml - tests-${CI_COMMIT_REF_SLUG}) ndikutulutsa:

  1. ConfigMap ndi test script;
  2. Job ndi kufotokozera kwa pod ndi malangizo omwe atchulidwa command, zomwe zimangoyendetsa mayeso;
  3. PV ndi PVC, zomwe zimakulolani kusunga deta yoyesera.

Samalani ndi chikhalidwe choyambirira ndi if koyambirira kwa chiwonetserocho - chifukwa chake, mafayilo ena a YAML a Helm chart omwe ali ndi pulogalamuyo ayenera kukulungidwa sintha kupanga kuti asatumizidwe panthawi yoyesedwa. Ndiko kuti:

{{- if ne .Values.global.run_tests "yes" }}
---
я другой ямлик
{{- end }}

Komabe, ngati mayesero amafuna zomanga zina (mwachitsanzo, Redis, RabbitMQ, Mongo, PostgreSQL...) - ma YAML awo akhoza kukhala osati zimitsa. Aperekeni ku malo oyesera komanso ... kuwasintha momwe mukufunira, ndithudi.

Kukhudza komaliza

Chifukwa kusonkhanitsa ndi kutumiza pogwiritsa ntchito ntchito za werf pakadali pano okha pa seva yomanga (yokhala ndi gitlab-runner), ndipo pod yokhala ndi mayeso imayambitsidwa pa mbuye, muyenera kupanga chikwatu. /mnt/tests pa mbuye ndi kuupereka kwa wothamanga, mwachitsanzo, kudzera pa NFS. Chitsanzo mwatsatanetsatane ndi mafotokozedwe angapezeke mu Zithunzi za K8s.

Zotsatira zake zikhala:

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

Palibe amene amaletsa kupanga NFS kugawana mwachindunji pa gitlab-runner, ndiyeno kuyiyika mu ma pod.

ndemanga

Mutha kukhala mukufunsa chifukwa chomwe mukuvutikira chilichonse popanga Job ngati mutha kungoyendetsa script ndi mayeso mwachindunji pa chipolopolo chothamanga? Yankho ndilochepa kwambiri...

Mayesero ena amafunikira mwayi wopeza zomanga (MongoDB, RabbitMQ, PostgreSQL, etc.) kuti zitsimikizire kuti zimagwira ntchito moyenera. Timayesa kukhala ogwirizana - ndi njira iyi, zimakhala zosavuta kuphatikiza mabungwe owonjezera. Kuphatikiza pa izi, timapeza muyezo njira yotumizira (ngakhale mukugwiritsa ntchito NFS, kuyika kowonjezera kwa maupangiri).

chifukwa

Kodi tiwona chiyani tikayika masinthidwe okonzedwa?

Pempho la kuphatikiza liwonetsa ziwerengero zachidule za mayeso omwe akuchitika posachedwa:

JUnit ku GitLab CI ndi Kubernetes

Cholakwika chilichonse chikhoza kudina apa kuti mudziwe zambiri:

JUnit ku GitLab CI ndi Kubernetes

NB: Wowerenga mwachidwi adzawona kuti tikuyesa ntchito ya NodeJS, ndi pazithunzi - .NET... Musadabwe: ndizoti pokonzekera nkhaniyi, palibe zolakwika zomwe zinapezeka poyesa ntchito yoyamba, koma iwo anapezeka mu ena.

Pomaliza

Monga mukuonera, palibe chovuta!

M'malo mwake, ngati muli ndi kale chotolera zipolopolo ndipo imagwira ntchito, koma simukufuna Kubernetes, kuyika kuyesa kwa icho chidzakhala ntchito yosavuta kuposa momwe tafotokozera pano. Ndipo mu Zolemba za GitLab CI mupeza zitsanzo za Ruby, Go, Gradle, Maven ndi ena.

PS

Werenganinso pa blog yathu:

Source: www.habr.com

Kuwonjezera ndemanga