Dieser Artikel richtet sich sowohl an Tester als auch an Entwickler, ist jedoch besonders für Automatisierer von Interesse, die mit dem Problem konfrontiert sind, GitLab CI/CD für integrierte Tests unter unzureichenden infrastrukturellen Ressourcen und/oder dem Fehlen einer Container-Orchestrierungsplattform einzurichten. Ich werde erklären, wie man das Bereitstellen von Testumgebungen mit Docker Compose auf einem einzigen GitLab Shell Runner einrichtet, sodass sich die laufenden Services bei der Bereitstellung mehrerer Umgebungen nicht gegenseitig stören.
Inhalt
Voraussetzungen
In meiner Praxis kam es häufig vor, dass ich das integrierte Testen in Projekten 'reparieren' musste. Dabei ist oft das größte Problem die CI-Pipeline, in der die Integrationstests des entwickelten Service(s) in der Dev-/Stage-Umgebung durchgeführt werden. Dies führte zu zahlreichen Problemen:
- Wegen Fehlern in einem bestimmten Dienst während der Integrationstestphase kann der Teststand durch fehlerhafte Daten beschädigt werden. Es gab Fälle, in denen das Senden einer Anfrage mit fehlerhaftem JSON-Format den Dienst zum Abstürzen brachte, was den Stand vollständig in einen nicht funktionierenden Zustand versetzte.
- Die Leistung des Teststandes kann mit zunehmenden Testdaten langsamer werden. Ich denke, es ist nicht notwendig, ein Beispiel für das Bereinigen/Zurücksetzen der Datenbank zu beschreiben. In meiner Praxis habe ich kein Projekt erlebt, bei dem dieser Prozess reibungslos ablief.
- Es besteht das Risiko, die Funktionsfähigkeit des Teststandes bei der Prüfung allgemeiner Systemeinstellungen zu beeinträchtigen. Zum Beispiel user/group/password/application policy.
- Testdaten von automatisierten Tests stören manuelle Tester.
Manche werden sagen, dass gute automatisierte Tests ihre Daten nach der Nutzung bereinigen sollten. Ich habe Argumente dagegen:
- Dynamische Stände sind äußerst benutzerfreundlich.
- Nicht jeder Gegenstand kann über die API aus dem System gelöscht werden. Zum Beispiel ist der Aufruf zur Löschung eines Objekts nicht implementiert, da er der Geschäftlogik widerspricht.
- Bei der Erstellung eines Objekts über die API können eine Vielzahl von Metadaten generiert werden, deren Löschung problematisch ist.
- Wenn Tests untereinander abhängen, wird der Prozess der Datenbereinigung nach der Ausführung der Tests zur echten Plage.
- Zusätzliche (und meiner Meinung nach ungerechtfertigte) Aufrufe an die API.
- Und das Hauptargument: wenn Testdaten direkt aus der Datenbank bereinigt werden. Das wird zu einem echten PK/FK-Zirkus! Von den Entwicklern hört man: „Ich habe nur die Tabelle hinzugefügt/entfernt/umbenannt, warum sind dann 100500 Integrationstests betroffen?“
Meiner Meinung nach ist die optimale Lösung eine dynamische Umgebung.
- Viele nutzen docker-compose zum Starten von Testumgebungen, aber nur wenige verwenden docker-compose bei der Durchführung von Integrationstests in CI/CD. Dabei lasse ich Kubernetes, Swarm und andere Container-Orchestrierungsplattformen außen vor. Nicht in jedem Unternehmen sind diese vorhanden. Wäre es nicht gut, wenn die docker-compose.yml universell wäre?
- Selbst wenn wir unseren eigenen QA-Runner haben, wie sorgen wir dafür, dass die über docker-compose gestarteten Services sich nicht gegenseitig behindern?
- Wie sammelt man die Logs der getesteten Services?
- Wie reinigt man den Runner?
Ich habe einen eigenen GitLab-Runner für meine Projekte, und mit diesen Fragen bin ich bei der Entwicklung konfrontiert worden für . Genauer gesagt, beim Start von Integrationstests. Hier werden wir diese Fragen mit Beispielen aus diesem Projekt klären.
GitLab Shell Runner
Für den Runner empfehle ich eine Linux-VM mit 4 vCPU, 4 GB RAM und 50 GB HDD.
Im Internet gibt es sehr viele Informationen zur Einrichtung von gitlab-runner, deswegen hier nur die Kurzfassung:
- Greifen Sie per SSH auf die Maschine zu.
Wenn Sie weniger als 8 GB RAM haben, empfehle ich , damit der OOM-Killer nicht eingreift und uns Aufgaben aufgrund von RAM-Mangel beendet. Dies kann passieren, wenn mehr als 5 Aufgaben gleichzeitig gestartet werden. Die Aufgaben werden langsamer bearbeitet, aber stabil.
Beispiel mit OOM-Killer:
Wenn Sie in den Logs der Aufgabe sehen:
bash: Zeile 82: 26474 Getötet, führen Sie einfach auf dem Runner aus:sudo dmesg | grep 26474[26474] 1002 26474 1061935 123806 339 0 0 java Out of Memory: Prozess 26474 (java) wurde beendet oder ein Kindopfer geopfert. Prozess 26474 (java) mit total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kB wurde getötet.Und wenn die Anzeige ungefähr so aussieht, fügen Sie entweder Swap hinzu oder erhöhen Sie den RAM.
- Installieren Sie , , , make.
- Fügen Sie den Benutzer
gitlab-runnerzur Gruppe hinzu.dockersudo groupadd docker sudo usermod -aG docker gitlab-runner - gitlab-runner.
Öffnen Sie die Datei zur Bearbeitung
/etc/gitlab-runner/config.tomlund fügen Sie hinzuconcurrent=20 [[runners]] request_concurrency = 10Das ermöglicht das gleichzeitige Ausführen von Aufgaben auf einem Runner. Detailliertere Informationen finden Sie hier. .
Wenn Sie eine leistungsstärkere Maschine haben, zum Beispiel 8 vCPU und 16 GB RAM, können diese Zahlen mindestens um das Doppelte erhöht werden. Doch das hängt davon ab, was genau auf diesem Runner ausgeführt wird und in welcher Menge.
Das ist ausreichend.
Vorbereitung der docker-compose.yml
Die Hauptaufgabe besteht darin, eine universelle docker-compose.yml zu erstellen, die Entwickler und Tester sowohl lokal als auch im CI-Pipeline nutzen können.
Zuerst erstellen wir einzigartige Servicenamen für das CI. Eine der einzigartigen Variablen in GitLab CI ist die Variable CI_JOB_ID. Wenn wir angeben container_name mit dem Wert "service-${CI_JOB_ID:-local}", dann gilt:
- wenn
CI_JOB_IDWenn nicht in den Umgebungsvariablen definiert,
wird der Servicename seinservice-local - wenn
CI_JOB_IDWenn in den Umgebungsvariablen definiert (zum Beispiel 123),
wird der Servicename seinservice-123
Als Nächstes erstellen wir ein gemeinsames Netzwerk für die gestarteten Dienste. Dies gibt uns Netzwerkteilung, wenn mehrere Testumgebungen ausgeführt werden.
networks:
default:
external:
name: service-network-${CI_JOB_ID:-local}Das ist der erste Schritt zum Erfolg =)
Ein Beispiel meiner docker-compose.yml mit Kommentaren
version: "3"
# Für das ordnungsgemäße Funktionieren von web (php) und fmt ist es nötig,
# dass die Container gemeinsam ausführbare Inhalte haben.
# In unserem Fall ist das Verzeichnis /var/www/testrail
volumes:
static-content:
# Isolierung der Umgebung auf Netzwerkebene
networks:
default:
external:
name: testrail-network-${CI_JOB_ID:-local}
services:
db:
image: mysql:5.7.22
# Jeder container_name enthält ${CI_JOB_ID:-local}
container_name: "testrail-mysql-${CI_JOB_ID:-local}"
environment:
MYSQL_HOST: db
MYSQL_DATABASE: mydb
MYSQL_ROOT_PASSWORD: 1234
SKIP_GRANT_TABLES: 1
SKIP_NETWORKING: 1
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- default
migration:
image: registry.gitlab.com/touchbit/image/testrail/migration:latest
container_name: "testrail-migration-${CI_JOB_ID:-local}"
links:
- db
depends_on:
- db
networks:
- default
fpm:
image: registry.gitlab.com/touchbit/image/testrail/fpm:latest
container_name: "testrail-fpm-${CI_JOB_ID:-local}"
volumes:
- static-content:/var/www/testrail
links:
- db
networks:
- default
web:
image: registry.gitlab.com/touchbit/image/testrail/web:latest
container_name: "testrail-web-${CI_JOB_ID:-local}"
# Wenn die Variablen TR_HTTP_PORT oder TR_HTTPS_PORTS nicht definiert sind,
# wird der Dienst auf den Ports 80 bzw. 443 gestartet.
ports:
- ${TR_HTTP_PORT:-80}:80
- ${TR_HTTPS_PORT:-443}:443
volumes:
- static-content:/var/www/testrail
links:
- db
- fpm
networks:
- defaultBeispiel für den lokalen Start
docker-compose -f docker-compose.yml up -d
Starte testrail-mysql-local ... erledigt
Starte testrail-migration-local ... erledigt
Starte testrail-fpm-local ... erledigt
Erstelle testrail-web-local ... erledigtAber es ist nicht so einfach, einen CI-Betrieb zu starten.
Vorbereitung des Makefile
Ich benutze Makefile, da es sehr praktisch sowohl für die lokale Umgebungsverwaltung als auch in CI ist. Nachfolgend Inline-Kommentare.
# У меня в проектах все вспомогательные вещи лежат в директории `.indirect`,
# в том числе и `docker-compose.yml`
# Использовать bash с опцией pipefail
# pipefail - фейлит выполнение пайпа, если команда выполнилась с ошибкой
SHELL=/bin/bash -o pipefail
# Останавливаем контейнеры и удаляем сеть
docker-kill:
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm network-$${CI_JOB_ID:-testrail} || true
# Предварительно выполняем docker-kill
docker-up: docker-kill
# Создаем сеть для окружения
docker network create network-$${CI_JOB_ID:-testrail}
# Забираем последние образы из docker-registry
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml pull
# Запускаем окружение
# force-recreate - принудительное пересоздание контейнеров
# renew-anon-volumes - не использовать volumes предыдущих контейнеров
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
# Ну и, на всякий случай, вывести что там у нас в принципе запущено на машинке
docker ps
# Коллектим логи сервисов
docker-logs:
mkdir ./logs || true
docker logs testrail-web-$${CI_JOB_ID:-local} >& logs/testrail-web.log
docker logs testrail-fpm-$${CI_JOB_ID:-local} >& logs/testrail-fpm.log
docker logs testrail-migration-$${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-$${CI_JOB_ID:-local} >& logs/testrail-mysql.log
# Очистка раннера
docker-clean:
@echo Останавливаем все testrail-контейнеры
docker kill $$(docker ps --filter=name=testrail -q) || true
@echo Очистка докер контейнеров
docker rm -f $$(docker ps -a -f --filter=name=testrail status=exited -q) || true
@echo Очистка dangling образов
docker rmi -f $$(docker images -f "dangling=true" -q) || true
@echo Очистка testrail образов
docker rmi -f $$(docker images --filter=reference='registry.gitlab.com/touchbit/image/testrail/*' -q) || true
@echo Очистка всех неиспользуемых volume
docker volume rm -f $$(docker volume ls -q) || true
@echo Очистка всех testrail сетей
docker network rm $(docker network ls --filter=name=testrail -q) || true
docker ps
Wir überprüfen.
make docker-up
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
Beende testrail-web-local ... erledigt
Beende testrail-fpm-local ... erledigt
Beende testrail-mysql-local ... erledigt
docker network rm network-${CI_JOB_ID:-testrail} || true
netwerk-testrail
docker network create network-${CI_JOB_ID:-testrail}
d2ec063324081c8bbc1b08fd92242c2ea59d70cf4025fab8efcbc5c6360f083f
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Lade db ... erledigt
Lade migration ... erledigt
Lade fpm ... erledigt
Lade web ... erledigt
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Erstelle testrail-mysql-local ... erledigt
Erstelle testrail-fpm-local ... erledigt
Erstelle testrail-migration-local ... erledigt
Erstelle testrail-web-local ... erledigt
docker ps
CONTAINER-ID PORTS NAMES
a845d3cb0e5a 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp testrail-web-local
19d8ef001398 9000/tcp testrail-fpm-local
e28840a2369c 3306/tcp, 33060/tcp testrail-migration-local
0e7900c23f37 3306/tcp testrail-mysql-local
make docker-logs
$ make docker-logs
mkdir ./logs || true
mkdir: Kann Verzeichnis ‘./logs’ nicht erstellen: Verzeichnis existiert
docker logs testrail-web-${CI_JOB_ID:-local} > logs/testrail-web.log
docker logs testrail-fpm-${CI_JOB_ID:-local} > logs/testrail-fpm.log
docker logs testrail-migration-${CI_JOB_ID:-local} > logs/testrail-migration.log
docker logs testrail-mysql-${CI_JOB_ID:-local} > logs/testrail-mysql.log
Vorbereitung der .gitlab-ci.yml
Ausführung der Integrationstests
Integration:
stage: test
tags:
- my-shell-runner
before_script:
# Authentifizierung im Repository
- docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
# Generierung pseudouniquier TR_HTTP_PORT und TR_HTTPS_PORT
- export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
- export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
# Verzeichnis mit der Auftrags-ID erstellen
- mkdir ${CI_JOB_ID}
# Kopieren Sie unsere docker-compose.yml in das erstellte Verzeichnis
# um einen anderen Kontext für jede Aufgabe zu haben
- cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
script:
# Unsere Umgebung hochfahren
- make docker-up
# Führen Sie Tests mit der ausführbaren JAR aus (ich mache das so)
- java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
# oder im Container
- docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
after_script:
# Logs sammeln
- make docker-logs
# Umgebung anhalten
- make docker-kill
artifacts:
# Logs speichern
when: always
paths:
- logs
expire_in: 30 TageDurch das Starten eines solchen Jobs wird das Verzeichnis logs in den Artefakten die Protokolle der Dienste und Tests enthalten. Dies ist besonders praktisch im Falle von Fehlern. Jeder Test, der parallel läuft, schreibt sein eigenes Protokoll, aber darüber werde ich gesondert berichten.

Bereinigung des Runners
Die Aufgabe wird nur nach Zeitplan ausgeführt.
stufen:
- bereinigen
- bauen
- testen
Bereinigen Runner:
stufe: bereinigen
nur:
- zeitpläne
tags:
- mein-shell-runner
skript:
- make docker-cleanDann gehen wir in unser GitLab-Projekt -> CI/CD -> Zeitpläne -> Neuer Zeitplan und fügen einen neuen Zeitplan hinzu.
Ergebnis
Wir starten 4 Aufgaben in GitLab CI.
In den Protokollen der letzten Aufgabe mit den Integrationstests sehen wir Container von verschiedenen Aufgaben.
CONTAINER ID NAMEN
c6b76f9135ed testrail-web-204645172
01d303262d8e testrail-fpm-204645172
2cdab1edbf6a testrail-migration-204645172
826aaf7c0a29 testrail-mysql-204645172
6dbb3fae0322 testrail-web-204645084
3540f8d448ce testrail-fpm-204645084
70fea72aa10d testrail-mysql-204645084
d8aa24b2892d testrail-web-204644881
6d4ccd910fad testrail-fpm-204644881
685d8023a3ec testrail-mysql-204644881
1cdfc692003a testrail-web-204644793
6f26dfb2683e testrail-fpm-204644793
029e16b26201 testrail-mysql-204644793
c10443222ac6 testrail-web-204567103
04339229397e testrail-fpm-204567103
6ae0accab28d testrail-mysql-204567103
b66b60d79e43 testrail-web-204553690
033b1f46afa9 testrail-fpm-204553690
a8879c5ef941 testrail-mysql-204553690
069954ba6010 testrail-web-204553539
ed6b17d911a5 testrail-fpm-204553539
1a1eed057ea0 testrail-mysql-204553539Detailiertes Protokoll
$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
WARNUNG! Die Verwendung von --password über die CLI ist unsicher. Verwenden Sie --password-stdin.
WARNUNG! Ihr Passwort wird unverschlüsselt in /home/gitlab-runner/.docker/config.json gespeichert.
Konfigurieren Sie einen Anmeldehelfer, um diese Warnung zu entfernen. Siehe
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Anmeldung erfolgreich
$ export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
$ export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
$ mkdir ${CI_JOB_ID}
$ cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm testrail-network-${CI_JOB_ID:-local} || true
Fehler: Solches Netzwerk existiert nicht: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Web wird heruntergeladen ... erledigt
FPM wird heruntergeladen ... erledigt
Migration wird heruntergeladen ... erledigt
DB wird heruntergeladen ... erledigt
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Erstelle Volume "204645172_static-content" mit dem Standardtreiber
Erstelle testrail-mysql-204645172 ...
Erstelle testrail-mysql-204645172 ... erledigt
Erstelle testrail-migration-204645172 ... erledigt
Erstelle testrail-fpm-204645172 ... erledigt
Erstelle testrail-web-204645172 ... erledigt
docker ps
CONTAINER-ID IMAGE BEFEHL ERSTELLT STATUS PORTS NAME
c6b76f9135ed registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor 13 Sekunden Hoch 1 Sekunden 0.0.0.0:51148->80/tcp, 0.0.0.0:25426->443/tcp testrail-web-204645172
01d303262d8e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor 16 Sekunden Hoch 13 Sekunden 9000/tcp testrail-fpm-204645172
2cdab1edbf6a registry.gitlab.com/touchbit/image/testrail/migration:latest "docker-entrypoint.s…" vor 16 Sekunden Hoch 13 Sekunden 3306/tcp, 33060/tcp testrail-migration-204645172
826aaf7c0a29 mysql:5.7.22 "docker-entrypoint.s…" vor 18 Sekunden Hoch 16 Sekunden 3306/tcp testrail-mysql-204645172
6dbb3fae0322 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor 36 Sekunden Hoch 22 Sekunden 0.0.0.0:44202->80/tcp, 0.0.0.0:20151->443/tcp testrail-web-204645084
3540f8d448ce registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor 38 Sekunden Hoch 35 Sekunden 9000/tcp testrail-fpm-204645084
70fea72aa10d mysql:5.7.22 "docker-entrypoint.s…" vor 40 Sekunden Hoch 37 Sekunden 3306/tcp testrail-mysql-204645084
d8aa24b2892d registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor etwa einer Minute Hoch 53 Sekunden 0.0.0.0:31103->80/tcp, 0.0.0.0:43872->443/tcp testrail-web-204644881
6d4ccd910fad registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor etwa einer Minute Hoch etwa eine Minute 9000/tcp testrail-fpm-204644881
685d8023a3ec mysql:5.7.22 "docker-entrypoint.s…" vor etwa einer Minute Hoch etwa eine Minute 3306/tcp testrail-mysql-204644881
1cdfc692003a registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor etwa einer Minute Hoch etwa eine Minute 0.0.0.0:44752->80/tcp, 0.0.0.0:23540->443/tcp testrail-web-204644793
6f26dfb2683e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor etwa einer Minute Hoch etwa eine Minute 9000/tcp testrail-fpm-204644793
029e16b26201 mysql:5.7.22 "docker-entrypoint.s…" vor etwa einer Minute Hoch etwa eine Minute 3306/tcp testrail-mysql-204644793
c10443222ac6 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor 5 Stunden Hoch 5 Stunden 0.0.0.0:57123->80/tcp, 0.0.0.0:31657->443/tcp testrail-web-204567103
04339229397e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor 5 Stunden Hoch 5 Stunden 9000/tcp testrail-fpm-204567103
6ae0accab28d mysql:5.7.22 "docker-entrypoint.s…" vor 5 Stunden Hoch 5 Stunden 3306/tcp testrail-mysql-204567103
b66b60d79e43 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor 5 Stunden Hoch 5 Stunden 0.0.0.0:56321->80/tcp, 0.0.0.0:58749->443/tcp testrail-web-204553690
033b1f46afa9 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor 5 Stunden Hoch 5 Stunden 9000/tcp testrail-fpm-204553690
a8879c5ef941 mysql:5.7.22 "docker-entrypoint.s…" vor 5 Stunden Hoch 5 Stunden 3306/tcp testrail-mysql-204553690
069954ba6010 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon of…" vor 5 Stunden Hoch 5 Stunden 0.0.0.0:32869->80/tcp, 0.0.0.0:16066->443/tcp testrail-web-204553539
ed6b17d911a5 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoi…" vor 5 Stunden Hoch 5 Stunden 9000/tcp testrail-fpm-204553539
1a1eed057ea0 mysql:5.7.22 "docker-entrypoint.s…" vor 5 Stunden Hoch 5 Stunden 3306/tcp testrail-mysql-204553539Alle Aufgaben wurden erfolgreich abgeschlossen
Die Artefakte der Aufgabe enthalten Protokolle von Diensten und Tests
Es sieht alles gut aus, aber es gibt einen Haken. Der Pipeline kann während der Ausführung von Integrationstests zwangsweise abgebrochen werden, und in diesem Fall werden die gestarteten Container nicht gestoppt. Ab und zu muss der Runner gereinigt werden. Leider hat die Aufgabe zur Nachbearbeitung in GitLab CE immer noch den Status
Aber wir haben die Möglichkeit, die Aufgabe nach Zeitplan zu starten, und niemand hindert uns daran, sie manuell zu starten.
Gehen wir zu unserem Projekt -> CI/CD -> Zeitpläne und starten wir die Aufgabe Clean runner
Insgesamt:
- Wir haben einen Shell-Runner.
- Es gibt keine Konflikte zwischen Aufgaben und Umgebung.
- Wir haben parallele Ausführungen von Aufgaben mit Integrationstests.
- Integrationstests können sowohl lokal als auch in einem Container ausgeführt werden.
- Die Protokolle von Diensten und Tests werden gesammelt und an der Pipeline-Aufgabe angehängt.
- Es gibt die Möglichkeit, den Runner von alten Docker-Images zu bereinigen.
Einrichtungszeit — ca. 2 Stunden.
Das ist alles. Ich freue mich auf Ihr Feedback.
Quelle: habr.com
