Die Github Workflow Connection
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 workflow2# ...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 called2 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.yml3 secrets: inherit4 permissions:5 contents: write6 packages: write7 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: write10 packages: write11 12jobs:13 release-please:14 runs-on: ubuntu-latest15 outputs:16 release_created: ${{ steps.release.outputs.release_created }}17 steps:18 - uses: google-github-actions/release-please-action@v319 id: release20 with:21 release-type: node22 package-name: '@sushidev-team/best-repo-ever'23 24 prod-deploy:25 uses: ./.github/workflows/docker-publish-prod.yml26 needs: [release-please]27 secrets: inherit28 permissions:29 contents: read30 packages: write31 id-token: write32 if: ${{ needs.release-please.outputs.release_created }}