Wir entwickeln moderne Web Applikationen und bieten erstklassigen Kunden Support

IN LI TW

Die Github Workflow Connection

29. Februar 2024
Development

Komplexe Workflows sollten handlebar bleiben und mit einer klaren Übersicht auch ein Jahr später noch klar verständlich und für Personen die neu ins Projekt zustoßen so zugänglich wie möglich sein.

Die Kapselung von Workflows in einzelne getrennte Schritte (single purpose) hat neben der besseren Übersicht außerdem den Vorteil, dass die Actions spezifisch getriggert werden können - beispielsweise das Erstellen der aktuellen Paketversion.

Funktionsweise

Um einen anderen Workflow aus der Action zu triggern kann der entsprechende Workflow sowohl in einem öffentlich zugänglichen Repository liegen, aber auch im selben Repository, in dem die referenzierende Action geschrieben wird.

Das kann wie folgt aussehen:

1name: Job that calls another workflow
2# ...
3 
4jobs:
5 best-job:
6 uses: ./.github/workflows/other-job.yml
7 # ...

Unter uses wird hierbei ein Workflow YAML file verlinkt, das beim Ausführen des Jobs “best-job” getriggert wird. Wichtig ist dabei, dass der verlinkte Workflow einen Trigger für diese Aktion beinhaltet:

1name: Job that is being called
2 
3on:
4 workflow_call:

Permissions

Falls der verlinkte Workflow Permissions benötigt um seine Jobs auszuführen, gibt es die Möglichkeit, diese über ein permissions Attribut zu übergeben. Auch notwendige Secrets können aus dem initialen Workflow abgeleitet werden - siehe secrets:

1best-job:
2 uses: ./.github/workflows/other-job.yml
3 secrets: inherit
4 permissions:
5 contents: write
6 packages: write
7 id-token: write

Real world example

Interessant wird das alles zusätzlich ab dem Zeitpunkt, wo Workflows variabel ausgeführt werden sollen, je nach Eintreffen von Bedingungen. Im folgenden Beispiel wird ein Production Deployment Workflow aufgerufen, wenn ein von release-please generierter Release PR gemerged wird. Anhand vom Output des ersten Jobs wird erkenntlich gemacht, ob in diesem Fall ein Release erfolgreich erstellt wurde und dementsprechend ein Deployment angestoßen.

1name: Release Please
2on:
3 push:
4 branches:
5 - main
6 
7permissions:
8 contents: write
9 pull-requests: write
10 packages: write
11 
12jobs:
13 release-please:
14 runs-on: ubuntu-latest
15 outputs:
16 release_created: ${{ steps.release.outputs.release_created }}
17 steps:
18 - uses: google-github-actions/release-please-action@v3
19 id: release
20 with:
21 release-type: node
22 package-name: '@sushidev-team/best-repo-ever'
23 
24 prod-deploy:
25 uses: ./.github/workflows/docker-publish-prod.yml
26 needs: [release-please]
27 secrets: inherit
28 permissions:
29 contents: read
30 packages: write
31 id-token: write
32 if: ${{ needs.release-please.outputs.release_created }}