Bedingtes Abbrechen von Jobs in GitHub Actions

Vermeidung doppelter Ausführungen von Jobs durch bedingtes Abbrechen in GitHub Actions. Beispiele für Build- und Release-Workflows.

Etjen Delilovic, 16.09.2024

Bedingtes Abbrechen von Jobs in GitHub Actions

In diesem Blogpost wird gezeigt, wie bedingtes Abbrechen von Jobs in GitHub Actions implementiert werden kann. Dies ist besonders nützlich, um doppelte Ausführungen von Jobs zu vermeiden, beispielsweise bei einem Tag-Release.

Beispiel: Build Workflow

Im folgenden Beispiel wird ein Build-Workflow gezeigt, der nur ausgeführt wird, wenn es sich nicht um einen Tag-Release handelt. Dies wird durch folgende Bedingung erreicht:

if: ${{ !startsWith(github.ref, 'refs/tags/') }}

Und hier der gesamte Workflow:

name: Build Workflow

on: [ push ]

jobs:
  backend-build:
    runs-on: ubuntu-latest
    if: ${{ !startsWith(github.ref, 'refs/tags/') }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: Build with Gradle
        run: |
          cd backend
          ./gradlew build          

Beispiel: Release Workflow

Im Release-Workflow wird die Bedingung umgekehrt, sodass die Jobs nur bei einem Tag-Release ausgeführt werden.

name: Release Workflow

on:
  push:
    tags:
      - 'v*.*.*'

jobs:
  backend-release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: Build with Gradle
        run: |
          cd backend
          ./gradlew build          

      - name: Extract version from tag
        id: extract_version
        run: |
          version=${GITHUB_REF#refs/tags/backend-v}
          echo "::set-output name=version::$version"          

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Deploy to Docker Hub
        uses: docker/build-push-action@v6
        with:
          context: ./backend
          file: ./Dockerfile
          push: true
          tags: |
            trx-base/backend:latest
            trx-base/backend:${{ steps.extract_version.outputs.version }}            

Fazit

Durch die Verwendung von bedingten Ausdrücken in GitHub Actions kann sichergestellt werden, dass bestimmte Jobs nur unter bestimmten Bedingungen ausgeführt werden. Dies hilft, unnötige Ausführungen zu vermeiden und die Effizienz der CI/CD-Pipeline zu verbessern.