JUnit muGitLab CI ine Kubernetes

Pasinei nekuti munhu wese anonyatsoziva kuti kuyedza software yako kwakakosha uye kwakakosha, uye vazhinji vanga vachizviita otomatiki kwenguva yakareba, muhukuru hwaHabr pakanga pasina kana imwe nzira yekumisikidza musanganiswa wezvigadzirwa zvakakurumbira zvakadaro. iyi niche se (yedu yatinoda) GitLab uye JUnit. Ngatizadze mukaha uyu!

JUnit muGitLab CI ine Kubernetes

Nhanganyaya

Kutanga, regai ndipe mamwe mamiriro ezvinhu:

  • Sezvo zvese zvedu zvikumbiro zvichimhanya paKubernetes, isu tichafunga nezvekumhanyisa bvunzo pazvivakwa zvakakodzera.
  • Kuunganidza uye kutumira tinoshandisa werf (maererano nezvikamu zvezvivakwa, izvi zvakare zvinoreva kuti Helm inobatanidzwa).
  • Ini handisi kuzopinda muzvinyorwa zvekusikwa chaiko kwebvunzo: mune yedu, mutengi anonyora bvunzo iye pachake, uye isu tinongoona kutangwa kwavo (uye kuvapo kweinoenderana mushumo mukusanganisa chikumbiro).


Ko kutevedzana kwezviito kuchaita sei?

  1. Kuvaka iyo application - isu tichasiya tsananguro yeiyi nhanho.
  2. Isa iyo application kune yakaparadzana namespace yeKubernetes cluster uye tanga kuyedza.
  3. Kutsvaga zvigadzirwa uye kupatsanura JUnit mishumo neGitLab.
  4. Kudzima zita rakambogadzirwa.

Iye zvino - kuita!

kuchinja

GitLab CI

Ngatitange nechidimbu .gitlab-ci.yaml, iyo inotsanangura kuendesa application uye kumhanya bvunzo. Rondedzero yacho yakazove yakawanda, saka yakanyatsowedzerwa nekutaura:

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

Iye zvino mune dhairekitori .helm/templates ngatigadzire YAML neJobho - tests-job.yaml - kumhanyisa bvunzo uye zviwanikwa zveKubernetes zvaanoda. Ona tsananguro mushure mekunyora:

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

Zvishandiso rudzii inotsanangurwa mukugadzirisa uku? Kana tichiendesa, tinogadzira yakasarudzika namespace yepurojekiti (izvi zvinoratidzwa mukati .gitlab-ci.yaml - tests-${CI_COMMIT_REF_SLUG}) uye bvisa:

  1. ConfigMap ne test script;
  2. basa ine tsananguro yepodhi uye chirevo chakataurwa command, iyo inongomhanyisa miedzo;
  3. PV uye PVC, izvo zvinokutendera kuti uchengete data rebvunzo.

Nyatsoteerera mamiriro ekutanga ne if pakutanga kwemanifest - saizvozvo, mamwe mafaera eYAML eHelm chati ane application anofanirwa kuputirwa mukati reverse dhizaini kuitira kuti vasazoiswa panguva yekuyedzwa. Ndiko kuti:

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

Zvisinei, kana miedzo zvinoda zvimwe zvivakwa (semuenzaniso, Redis, RabbitMQ, Mongo, PostgreSQL...) - YAML yavo inogona kwete dzima. Vaise munzvimbo yekuedza zvakare ... kugadzirisa sezvaunoona zvakakodzera, hongu.

kubata kwekupedzisira

Nokuti kusangana uye kutumira uchishandisa werf inoshanda ikozvino chete pane yekuvaka server (ine gitlab-runner), uye iyo pod ine bvunzo inotangwa pane tenzi, iwe uchafanirwa kugadzira dhairekitori. /mnt/tests pana tenzi ugoipa kumumhanyi. semuenzaniso, kuburikidza neNFS. Muenzaniso wakadzama une tsananguro unogona kuwanikwa mukati K8s zvinyorwa.

Mhedzisiro ichava:

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

Hapana anorambidza kugadzira iyo NFS kugovera zvakananga pane gitlab-runner, wozoiisa mumapods.

taura pfungwa

Iwe unogona kunge uchibvunza kuti sei uchiomesera zvese nekugadzira Jobho kana iwe uchikwanisa kungomhanyisa script nemiedzo yakananga pane shell runner? Mhinduro yacho idiki...

Mimwe bvunzo inoda kuwanikwa kune zvivakwa (MongoDB, RabbitMQ, PostgreSQL, nezvimwewo) kuratidza kuti inoshanda nemazvo. Isu tinoita kuti kuyedzwa kwakabatana - neiyi nzira, zvinova nyore kusanganisa akadai mamwe masangano. Mukuwedzera kune izvi, tinowana muyero deployment approach (kunyangwe uchishandisa NFS, kuwedzera kukwira kwemadhairekitori).

mugumisiro

Tichaonei kana tikashandisa gadziriro yakagadzirirwa?

Chikumbiro chekubatanidza chicharatidza pfupiso nhamba dzebvunzo dzinoitwa mupombi yayo yazvino:

JUnit muGitLab CI ine Kubernetes

Kukanganisa kwega kwega kunogona kudzvanywa pano kuti uwane ruzivo:

JUnit muGitLab CI ine Kubernetes

NB: Muverengi anoteerera achacherechedza kuti tiri kuedza kushandiswa kweNodeJS, uye mune zvidzitiro - .NET... Usashamisika: ndezvokuti panguva yekugadzirira chinyorwa, hapana zvikanganiso zvakawanikwa mukuedza kushandiswa kwekutanga, asi ivo. vakawanikwa mune imwe.

mhedziso

Sezvauri kuona, hapana chakaoma!

Muchidimbu, kana uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchitora goko uye rwunoshanda, asi iwe haudi Kubernetes, kubatanidza kuyedzwa kwariri richave rakatopusa basa pane rinotsanangurwa pano. Uye mu GitLab CI zvinyorwa iwe uchawana mienzaniso yeRuby, Go, Gradle, Maven nevamwe vamwe.

PS

Verenga zvakare pablog yedu:

Source: www.habr.com

Voeg