projectsyn/commodore

View on GitHub
.github/workflows/push.yml

Summary

Maintainability
Test Coverage
name: Build & Push Container Image
on:
  push:
    branches:
    - master
    tags:
    - v*

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      IMAGE: docker.io/${{ github.repository }}
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: "0"
    - name: Set image version latest
      if: github.ref == 'refs/heads/master'
      run: echo "VERSION=latest" >> ${GITHUB_ENV}
    - name: Set image version from tag
      if: startsWith(github.ref, 'refs/tags/v')
      run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/})" >> ${GITHUB_ENV}
    - name: Build Image
      run: make docker
      env:
        IMAGE_NAME: "${IMAGE}:${VERSION}"
    - name: Push Image
      env:
        DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
        DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
      run: |
        docker login docker.io --username "${DOCKER_USERNAME}" --password "${DOCKER_PASSWORD}"
        docker push "${IMAGE}:${VERSION}"
    - name: Build changelog from PRs with labels
      if: startsWith(github.ref, 'refs/tags/v')
      id: build_changelog
      uses: mikepenz/release-changelog-builder-action@v5
      with:
        configuration: ".github/changelog-configuration.json"
        # PreReleases still get a changelog, but the next full release gets a diff since the last full release,
        # combining possible changelogs of all previous PreReleases in between.
        # PreReleases show a partial changelog since last PreRelease.
        ignorePreReleases: "${{ !contains(github.ref, '-rc') }}"
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    - name: Read release message from tag commit
      id: tag_message
      if: startsWith(github.ref, 'refs/tags/v')
      run: |
        git fetch origin +refs/tags/*:refs/tags/*
        # Extract tag message
        TAG_MSG=$(git tag -n --format='%(contents:body)' ${GITHUB_REF##refs/tags/} | tr -d '\r')
        # Escape literal % and newlines (\n, \r) for github actions output
        TAG_MSG=${TAG_MSG//'%'/%25}
        TAG_MSG=${TAG_MSG//$'\n'/%0A}
        # Join multiple lines belonging to the same paragraph for GitHub
        # markdown.
        # Paragraph breaks should be %0A%0A. We replace single line breaks
        # with a space with sed.
        TAG_MSG=$(echo ${TAG_MSG} |sed 's/\([^A]\)%0A\([^%]\)/\1 \2/g')
        # Set action output `messsage`
        echo "::set-output name=message::${TAG_MSG}"
      env:
        GITHUB_REF: ${{ github.ref }}
    - name: Create Release
      if: startsWith(github.ref, 'refs/tags/v')
      uses: ncipollo/release-action@v1
      with:
        body: "# Summary\n\n${{steps.tag_message.outputs.message}}\n\n# Changes\n\n${{steps.build_changelog.outputs.changelog}}"
        prerelease: "${{ contains(github.ref, '-rc') }}"
        # Ensure target branch for release is "master"
        commit: master
        token: ${{ secrets.GITHUB_TOKEN }}