Praxis: Build-Ergebnisse aufbewahren, veröffentlichen und versionieren

Artefaktverwaltung

Ein Job-Artefakt überträgt ein Build-Ergebnis zwischen Jobs. Ein versioniertes Paket bietet eine bestimmte Version zum Download, auch nachdem temporäre Job-Artefakte abgelaufen sind.

Ein kleines Build-Ergebnis erzeugen und aufbewahren

Für die Übung wird ein separates, geklontes Projekt mit aktivierter Package Registry, Berechtigung zum Pushen von Tags und einem Docker- oder Kubernetes-Runner benötigt. Veröffentlichung und Download finden innerhalb dieses Projekts statt. Ersetzen Sie dessen .gitlab-ci.yml durch:

stages:
  - build
  - test
  - publish

build:
  stage: build
  image: alpine:3.22
  script:
    - mkdir -p build dist
    - printf '%s\n' "$CI_COMMIT_SHA" > build/commit.txt
    - tar -czf dist/build.tar.gz -C build commit.txt
    - cd dist && sha256sum build.tar.gz > SHA256SUMS
  artifacts:
    name: "build-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA"
    paths:
      - dist/
    expire_in: 1 day
    access: developer

verify:
  stage: test
  image: alpine:3.22
  needs:
    - job: build
      artifacts: true
  script:
    - cd dist && sha256sum -c SHA256SUMS
    - tar -xzf build.tar.gz
    - test "$(cat commit.txt)" = "$CI_COMMIT_SHA"

publish:
  stage: publish
  image: alpine:3.22
  needs:
    - job: build
      artifacts: true
    - job: verify
      artifacts: false
  rules:
    - if: '$CI_COMMIT_TAG'
  before_script:
    - apk add --no-cache curl
  script:
    - |
      for file in build.tar.gz SHA256SUMS; do
        curl --fail-with-body \
          --header "JOB-TOKEN: $CI_JOB_TOKEN" \
          --upload-file "dist/$file" \
          "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/course-build/$CI_COMMIT_TAG/$file"
      done
  1. Die Konfiguration committen und auf einen Branch pushen. Prüfen, ob build und verify erfolgreich sind und publish fehlt.
  2. Das Artefaktarchiv des Jobs build herunterladen. Darin dist/build.tar.gz und dist/SHA256SUMS suchen. Der Job verify prüft die Prüfsumme und den Quell-Commit im Tarball.
  3. Die Ablaufangabe auf der Jobseite ablesen. Unter Settings > CI/CD > Artifacts die Keep-latest-Einstellung prüfen. Sie kann Artefakte über expire_in hinaus erhalten, ebenso die Auswahl Keep auf einer Jobseite.

Erwartetes Ergebnis sind ein benanntes Artefakt mit Ablaufregel und eine erfolgreiche Prüfsummenprüfung. Die Regel wird jetzt geprüft; die Löschung erfolgt später und asynchron.

Zwei Versionen veröffentlichen und herunterladen

Versehen Sie im Projektklon den geprüften Commit mit einem Tag und pushen Sie diesen:

git tag v0.1.0
git push origin v0.1.0
  1. Die Tag-Pipeline öffnen und prüfen, ob alle drei Jobs erfolgreich sind.
  2. Unter Deploy > Package registry das Paket course-build, Version v0.1.0, öffnen.
  3. build.tar.gz und SHA256SUMS über die Paketseite in ein neues, leeres Verzeichnis herunterladen. Darin ausführen:
sha256sum -c SHA256SUMS
tar -xzf build.tar.gz
cat commit.txt

Unter macOS lautet der erste Befehl shasum -a 256 -c SHA256SUMS. Erwartet wird build.tar.gz: OK. Vergleichen Sie commit.txt mit der vollständigen Commit-SHA für v0.1.0 unter Code > Tags.

Wechseln Sie zurück in den Projektklon. Erzeugen Sie einen zweiten Commit ohne Änderung an der Anwendung und veröffentlichen Sie ihn unter einem neuen Tag:

git commit --allow-empty -m "chore: prepare v0.2.0"
git push
git tag v0.2.0
git push origin v0.2.0

Wiederholen Sie Download und Prüfung für v0.2.0 in einem weiteren leeren Verzeichnis. Beide Versionen müssen verfügbar bleiben, die Prüfsummenprüfung bestehen und unterschiedliche Commit-SHAs enthalten, die ihren Tags entsprechen.

Der Upload verwendet das vordefinierte CI_JOB_TOKEN. Verwenden Sie jedes Versionstag für genau eine Veröffentlichung. Paketbereinigung und Ablauf von Job-Artefakten haben getrennte Regeln.

Die GitLab-Dokumentationen zu Job-Artefakten und der Generic Package Registry erläutern Aufbewahrung und Authentifizierung.

Nutzen Sie Job-Artefakte für temporäre Übergaben in der Pipeline. Veröffentlichen Sie Ergebnisse mit Quell-Commit und Prüfsumme, wenn eine stabile Version benötigt wird.

Check

Vorschlag zur Antwort
Die Keep-latest-Einstellung oder die Auswahl Keep kann es erhalten. Außerdem läuft die Bereinigung asynchron. Die Ablaufzeit allein bestimmt daher nicht, wann das Artefakt verschwindet.
Vorschlag zur Antwort
Nein. Es unterliegt weiterhin der Aufbewahrung von Job-Artefakten. Der Publish-Job lädt Dateien in einen versionierten Pfad der Package Registry mit eigenem Lebenszyklus hoch.