Skip to content

Build and push Docker image #11

Build and push Docker image

Build and push Docker image #11

name: Build and push Docker image
on:
workflow_dispatch:
inputs:
push-image:
description: 'Push image to Registry'
required: true
type: boolean
default: true
create-release:
description: 'Create GitHub release'
required: true
type: boolean
default: true
is-prerelease:
description: 'Mark this as a prerelease'
required: true
type: boolean
default: false
permissions:
contents: write
packages: write
jobs:
get-versions:
name: Get SemVer
runs-on: ubuntu-latest
outputs:
imageVersionFull: ${{ steps.docker-image-version.outputs.fullVersion }}
imageVersionMajor: ${{ steps.docker-image-version.outputs.majorVersion }}
semverNext: ${{ steps.semver-info.outputs.nextVersion }}
steps:
- name: Checkout Code
uses: actions/checkout@v5
- name: Get Next Version
id: semver
uses: ietf-tools/semver-action@v1
with:
token: ${{ github.token }}
branch: ${{ github.ref_name }}
- name: Output SemVer
id: semver-info
run: |
nextVersion="${{ steps.semver.outputs.next }}"
echo "Current version: ${{ steps.semver.outputs.current }}"
echo "Next version: ${{ steps.semver.outputs.next }}"
echo "Next strict version: ${{ steps.semver.outputs.nextStrict }}"
echo "Next major version: ${{ steps.semver.outputs.nextMajor }}"
echo "Next major strict version: ${{ steps.semver.outputs.nextMajorStrict }}"
echo "Bump: ${{ steps.semver.outputs.bump }}"
echo "Is prerelease: ${{ inputs.is-prerelease }}"
if [ "${{ inputs.is-prerelease }}" = "false" ]; then
echo "nextVersion=$nextVersion" >> "$GITHUB_OUTPUT"
else
echo "nextVersion=${nextVersion}-beta" >> "$GITHUB_OUTPUT"
fi
- name: Create Docker image version
id: docker-image-version
run: |
fullVersion="${{ steps.semver.outputs.nextStrict }}"
majorVersion="${{ steps.semver.outputs.nextMajorStrict }}"
if [ "${{ inputs.is-prerelease }}" = "false" ]; then
echo "fullVersion=$fullVersion" >> "$GITHUB_OUTPUT"
echo "majorVersion=$majorVersion" >> "$GITHUB_OUTPUT"
else
echo "fullVersion=${fullVersion}-beta" >> "$GITHUB_OUTPUT"
echo "majorVersion=${majorVersion}-beta" >> "$GITHUB_OUTPUT"
fi
build-and-push:
runs-on: ubuntu-latest
needs: get-versions
steps:
- name: Show selected ref
run: |
echo "Ref: $GITHUB_REF"
echo "SHA: $GITHUB_SHA"
echo "Repo: $GITHUB_REPOSITORY"
echo "Is prerelease: ${{ inputs.is-prerelease }}"
echo "Create release: ${{ inputs.create-release }}"
echo "Push image: ${{ inputs.push-image }}"
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ github.sha }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=raw,value=${{ needs.get-versions.outputs.imageVersionFull }}
type=raw,value=${{ needs.get-versions.outputs.imageVersionMajor }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64,linux/arm64
push: ${{ inputs.push-image }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
create-release:
name: Create Release
runs-on: ubuntu-latest
needs: [ get-versions, build-and-push ]
if: ${{ inputs.create-release }}
steps:
- name: Checkout Code
uses: actions/checkout@v5
- name: Create tag
uses: actions/github-script@v8
with:
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: 'refs/tags/${{ needs.get-versions.outputs.semverNext }}',
sha: context.sha
})
- name: Update CHANGELOG
id: changelog
uses: requarks/changelog-action@v1
with:
token: ${{ github.token }}
tag: ${{ needs.get-versions.outputs.semverNext }}
- name: Commit CHANGELOG.md
uses: stefanzweifel/git-auto-commit-action@v6
if: ${{ !inputs.is-prerelease }}
with:
branch: ${{ github.ref_name }}
commit_message: 'docs: update CHANGELOG.md for ${{ github.ref_name }} [skip ci]'
file_pattern: CHANGELOG.md
- name: Create Release
uses: ncipollo/release-action@v1
with:
name: ${{ needs.get-versions.outputs.semverNext }}
body: ${{ steps.changelog.outputs.changes }}
tag: ${{ needs.get-versions.outputs.semverNext }}
commit: ${{ github.sha }}
prerelease: ${{ inputs.is-prerelease }}
makeLatest: ${{ !inputs.is-prerelease }}
token: ${{ github.token }}