Files
sinusbot-docker/.gitea/workflows/docker-build.yml
2026-07-19 13:33:38 +02:00

102 lines
3.4 KiB
YAML

name: Build Docker Image
on:
push:
branches: [main]
paths:
- docker-compose.yaml
workflow_dispatch:
jobs:
docker:
name: Build & Push Docker Image
runs-on: linux-amd64
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Detect image version change
id: image
shell: bash
run: |
extract_image() {
grep -E '^[[:space:]]*image:[[:space:]]+' "$1" \
| head -n1 \
| awk '{ print $2 }' \
| sed 's/^["'\'']//; s/["'\'']$//'
}
CURRENT_IMAGE="$(extract_image docker-compose.yaml)"
if [ -z "$CURRENT_IMAGE" ]; then
echo "::error::No image found in docker-compose.yaml"
exit 1
fi
OLD_IMAGE=""
if [ "${{ github.event_name }}" = "push" ] && [ -n "${{ github.event.before }}" ]; then
if git cat-file -e "${{ github.event.before }}:docker-compose.yaml" 2>/dev/null; then
git show "${{ github.event.before }}:docker-compose.yaml" > /tmp/docker-compose.previous.yaml
OLD_IMAGE="$(extract_image /tmp/docker-compose.previous.yaml || true)"
fi
fi
IMAGE_BASE="${CURRENT_IMAGE%:*}"
IMAGE_TAG="${CURRENT_IMAGE##*:}"
REGISTRY="${CURRENT_IMAGE%%/*}"
if [ "$IMAGE_TAG" = "$CURRENT_IMAGE" ] || [ -z "$IMAGE_TAG" ]; then
echo "::error::Image must include an explicit tag, e.g. git.techniverse.net/scriptos/sinusbot:1.1"
exit 1
fi
CHANGED="false"
if [ "${{ github.event_name }}" = "workflow_dispatch" ] || [ "$CURRENT_IMAGE" != "$OLD_IMAGE" ]; then
CHANGED="true"
fi
echo "current_image=$CURRENT_IMAGE"
echo "old_image=${OLD_IMAGE:-<none>}"
echo "changed=$CHANGED"
echo "changed=$CHANGED" >> "$GITHUB_OUTPUT"
echo "image=$CURRENT_IMAGE" >> "$GITHUB_OUTPUT"
echo "image_base=$IMAGE_BASE" >> "$GITHUB_OUTPUT"
echo "tag=$IMAGE_TAG" >> "$GITHUB_OUTPUT"
echo "registry=$REGISTRY" >> "$GITHUB_OUTPUT"
- name: Stop when image version did not change
if: steps.image.outputs.changed != 'true'
run: echo "Image version unchanged. Skipping Docker build."
- name: Login to Gitea Container Registry
if: steps.image.outputs.changed == 'true'
uses: docker/login-action@v3
with:
registry: ${{ steps.image.outputs.registry }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Set up Docker Buildx
if: steps.image.outputs.changed == 'true'
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
if: steps.image.outputs.changed == 'true'
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64
push: true
provenance: false
tags: |
${{ steps.image.outputs.image }}
${{ steps.image.outputs.image_base }}:latest
labels: |
org.opencontainers.image.title=Sinusbot
org.opencontainers.image.version=${{ steps.image.outputs.tag }}
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
org.opencontainers.image.licenses=MIT