Wie kann ich Artefakte an eine andere Stufe weitergeben?

106

Ich möchte GitLab CI mit der Datei .gitlab-ci.yml verwenden, um verschiedene Phasen mit separaten Skripten auszuführen. In der ersten Phase wird ein Werkzeug erstellt, das in einer späteren Phase zur Durchführung von Tests verwendet werden muss. Ich habe das generierte Tool als Artefakt deklariert.

Wie kann ich dieses Tool in einem späteren Job ausführen? Was ist der richtige Pfad und welche Dateien werden sich um ihn herum befinden?

In der ersten Phase werden beispielsweise Artefakte / bin / TestTool / TestTool.exe erstellt, und dieses Verzeichnis enthält andere erforderliche Dateien (DLLs und andere). Meine .gitlab-ci.yml-Datei sieht folgendermaßen aus:

releasebuild:
  script:
    - chcp 65001
    - build.cmd
  stage: build
  artifacts:
    paths:
      - artifacts/bin/TestTool/

systemtests:
  script:
    - chcp 65001
    - WHAT TO WRITE HERE?
  stage: test

Der Build und die Tests werden unter Windows ausgeführt, wenn dies relevant ist.

ygoe
quelle

Antworten:

102

Verwenden Sie dependencies. Mit dieser Konfigurationstestphase werden die nicht verfolgten Dateien heruntergeladen, die während der Erstellungsphase erstellt wurden:

build:
  stage: build
  artifacts:
    untracked: true
  script:
    - ./Build.ps1

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1
user1495793
quelle
9
Endlich hat es funktioniert! Der entscheidende Punkt hierbei ist, dass Abhängigkeiten zusammen mit Artefakten verwendet werden sollten. Nur die enthaltenen Artefakte würden in der nachfolgenden Phase zum Verzehr verfügbar sein. Seien Sie natürlich konservativ in Bezug auf das, was hochgeladen wird. Ich würde sagen, benutze expire_in. Andernfalls könnten wir viel Speicherplatz verschwenden. Diese Artefakte werden im Build-Job / Stadium / Schritt in gitlab hochgeladen und im Test heruntergeladen.
Ravikanth
18
Müssen Sie wirklich Abhängigkeiten verwenden? In der Gitlab-Dokumentation heißt es Note that artifacts from all previous stages are passed by default.. Die Frage ist, wann Sie Abhängigkeiten verwenden müssen.
2
Die Dokumentation klärt dies ziemlich gut auf: docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox
3
@ Josef Artefakte aus allen vorherigen Phasen werden standardmäßig übergeben (nicht aus den vorherigen Jobs)
Vivek
1
@Josef, wenn Sie nicht alle Artefakte aus allen vorherigen Phasen für den aktuellen Job benötigen. Angenommen, Sie haben 10 GB Binärdateien in der Build-Phase generiert, aber in Ihrer letzten Phase werden nur einige E-Mails über den erfolgreichen Build gesendet. Sie müssen nicht alle 10 GB für diesen Job herunterladen
Ezh,
48

Da Artefakte aus allen vorherigen Stufen standardmäßig übergeben werden, müssen wir nur Stufen in der richtigen Reihenfolge definieren. Bitte versuchen Sie das folgende Beispiel, um das Verständnis zu verbessern.

image: ubuntu:18.04

stages:
  - build_stage
  - test_stage
  - deploy_stage

build:
  stage: build_stage
  script:
    - echo "building..." >> ./build_result.txt
  artifacts:
    paths:
    - build_result.txt
    expire_in: 1 week

unit_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt unittest_result.txt
    - echo "unit testing..." >> ./unittest_result.txt
  artifacts:
    paths:
    - unittest_result.txt
    expire_in: 1 week

integration_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt integration_test_result.txt
    - echo "integration testing..." >> ./integration_test_result.txt
  artifacts:
    paths:
    - integration_test_result.txt
    expire_in: 1 week

deploy:
  stage: deploy_stage
  script:
    - ls
    - cat build_result.txt
    - cat unittest_result.txt
    - cat integration_test_result.txt

Geben Sie hier die Bildbeschreibung ein

Und um Artefakte zwischen Jobs in verschiedenen Phasen zu übergeben, können wir Abhängigkeiten zusammen mit Artefakten verwenden , um die Artefakte zu übergeben, wie im Dokument beschrieben .

Und noch ein einfacheres Beispiel:

image: ubuntu:18.04

build:
  stage: build
  script:
    - echo "building..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

unit_test:
  stage: test
  script:
    - ls
    - cat result.txt
    - echo "unit testing..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

deploy:
  stage: deploy
  script:
    - ls
    - cat result.txt
Chuan
quelle
Sehr klare Erklärung, danke. Wenn eine Stufe ein Artefakt mit demselben Namen wie ein Artefakt aus einer vorherigen Stufe benennt, wird das ursprüngliche Artefakt überschrieben?
Michael Osofsky
1
@MichaelOsofsky Sie können das Artefakt mit demselben Namen benennen. Das ursprüngliche Artefakt wird nicht von dem Artefakt der nächsten Stufe mit demselben Namen überschrieben. Die nächste Stufe lädt nur das Artefakt von der vorherigen Stufe herunter, es ist eine Kopie davon. Ich benenne sie im Beispiel anders, hauptsächlich weil Unit-Test und Integration parallel ausgeführt werden. Wenn wir den .eg-Integrationstestjob entfernen, werden alle Jobs nacheinander ausgeführt, und wir können für alle Artefakte denselben Namen ohne Verwirrung verwenden. Zu Ihrer Information, ich aktualisiere die Antwort mit einem weiteren Beispiel.
Chuan
In Ihrem Beispiel sehen Sie, dass Sie an result.txt anhängen. Wenn Sie result.txt im Job unit_test überschrieben haben, gehe ich davon aus, dass die Jobbereitstellung niemals Zugriff auf den Inhalt von result.txt aus dem Jobbuild haben würde. Ich möchte nur sicherstellen, dass ich diese Art von Fehler in meinen Skripten niemals verursache.
Michael Osofsky
1
Laut Protokoll wird in der Bereitstellungsphase sowohl result.txt aus der Build- als auch aus der Testphase heruntergeladen, in der späteren Phase wird jedoch die vorherige Phase überschrieben.
Chuan
1
Übrigens, das ursprüngliche Artefakt wird nicht berührt und steht immer zum Herunterladen von CI / CD -> Pipelines zur Verfügung. Klicken Sie dann rechts auf die Dropdown-Schaltfläche für Artefakte. Sie finden alle Artefakte aller Stufen.
Chuan