Byparr/.github/workflows/docker-publish.yml

187 lines
5.0 KiB
YAML
Raw Normal View History

2024-07-25 02:08:26 +02:00
name: Docker
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on:
schedule:
2024-07-25 21:07:10 +00:00
- cron: "25 0 * * *"
2024-07-25 02:08:26 +02:00
push:
2024-07-25 21:07:10 +00:00
branches: ["main"]
2024-07-25 02:08:26 +02:00
# Publish semver tags as releases.
2024-07-25 21:07:10 +00:00
tags: ["v*.*.*"]
2024-07-25 02:08:26 +02:00
pull_request:
2024-07-25 21:07:10 +00:00
branches: ["main"]
2024-11-26 18:18:02 +00:00
workflow_dispatch:
2024-07-25 02:08:26 +02:00
env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}
jobs:
2025-02-28 19:16:47 +01:00
test:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
2025-02-26 11:03:28 +01:00
2025-02-28 19:16:47 +01:00
steps:
- name: Checkout repository
uses: actions/checkout@v4
2025-02-26 11:03:28 +01:00
2025-02-28 19:16:47 +01:00
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
2025-02-26 11:03:28 +01:00
2025-02-28 19:16:47 +01:00
- name: Test
id: test
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64
cache-from: type=gha,scope=x64
pull: true
cache-to: type=gha,mode=max,scope=x64
target: test
2025-02-26 11:03:28 +01:00
2024-07-25 02:08:26 +02:00
build:
2025-02-28 19:16:47 +01:00
needs: test
2024-12-11 00:46:53 +00:00
runs-on: ubuntu-latest
2024-07-25 02:08:26 +02:00
permissions:
contents: read
packages: write
id-token: write
2025-02-26 11:03:28 +01:00
strategy:
matrix:
platform: [linux/amd64, linux/arm64]
2024-07-25 02:08:26 +02:00
steps:
- name: Checkout repository
uses: actions/checkout@v4
2025-02-28 16:11:10 +01:00
- name: Prepare variables
id: vars
run: |
SURFIX=$(echo ${{ matrix.platform }} | cut -d'/' -f2)
echo "SURFIX=$SURFIX" >> $GITHUB_OUTPUT
# Generate a unique local tag for the image
2025-02-28 18:33:30 +01:00
echo "LOCAL_TAG=${{ github.sha }}-$SURFIX" >> $GITHUB_OUTPUT
2025-02-27 20:20:55 +00:00
2025-02-28 16:17:54 +01:00
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
2025-02-26 11:03:28 +01:00
# Set up BuildKit Docker container builder
2024-07-25 02:08:26 +02:00
- name: Set up Docker Buildx
2024-11-30 12:43:56 +00:00
uses: docker/setup-buildx-action@v3
2024-07-25 02:08:26 +02:00
2025-02-28 18:36:00 +01:00
# Log into registry
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
2024-07-25 02:08:26 +02:00
# Extract metadata (tags, labels) for Docker
- name: Extract Docker metadata
id: meta
2024-11-30 12:43:56 +00:00
uses: docker/metadata-action@v5
2024-07-25 02:08:26 +02:00
with:
2025-02-28 18:33:30 +01:00
tags: type=raw,value=${{ steps.vars.outputs.LOCAL_TAG }}
2024-07-25 02:08:26 +02:00
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
2025-02-28 16:11:10 +01:00
# Build and export Docker image for each platform (without pushing)
- name: Build Docker image
id: build
2024-11-30 12:43:56 +00:00
uses: docker/build-push-action@v6
2024-07-25 02:08:26 +02:00
with:
context: .
2024-12-11 01:02:59 +00:00
pull: true
2025-02-28 18:33:30 +01:00
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
2024-07-25 02:08:26 +02:00
labels: ${{ steps.meta.outputs.labels }}
2025-02-26 11:03:28 +01:00
platforms: ${{ matrix.platform }}
2025-02-27 19:10:26 +00:00
cache-from: type=gha,scope=${{ matrix.platform }}
cache-to: type=gha,mode=max,scope=${{ matrix.platform }}
2025-02-27 19:41:54 +00:00
build-args: GITHUB_BUILD=true,VERSION=${{ github.ref_type == 'tag' && github.ref_name || github.sha }}
2025-02-20 20:50:11 +00:00
2025-02-28 16:11:10 +01:00
merge-and-push:
2025-02-26 11:03:28 +01:00
needs: build
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
2025-02-28 16:11:10 +01:00
# Install the cosign tool
- name: Install cosign
uses: sigstore/cosign-installer@v3
# Set up Docker Buildx
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# Log into registry
2025-02-26 11:03:28 +01:00
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
2025-02-20 20:50:11 +00:00
with:
2025-02-26 11:03:28 +01:00
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
2024-07-25 02:08:26 +02:00
2025-02-28 16:11:10 +01:00
# Extract Docker metadata for tagging
2025-02-26 11:03:28 +01:00
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
2025-02-28 16:11:10 +01:00
# Create manifest lists and push
- name: Create and push manifest lists
2025-02-26 11:03:28 +01:00
run: |
TAGS="${{ steps.meta.outputs.tags }}"
2025-02-28 17:43:57 +01:00
args=""
2025-02-28 19:28:05 +01:00
image=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
2025-02-28 19:01:06 +01:00
image=${image,,}
2025-02-28 18:04:23 +01:00
# Create tag arguments
for tag in $TAGS; do
2025-02-28 17:43:57 +01:00
args="$args -t $tag"
2025-02-26 11:03:28 +01:00
done
2025-02-28 17:09:23 +01:00
if [ "${{ github.ref_type }}" == "tag" ]; then
2025-02-28 19:28:05 +01:00
args="$args -t ${image}:latest"
2025-02-28 17:09:23 +01:00
fi
2025-02-28 17:53:04 +01:00
echo $args
2025-02-28 18:43:55 +01:00
docker buildx imagetools create $args \
2025-02-28 19:28:05 +01:00
${image}:${{github.sha}}-amd64 \
${image}:${{github.sha}}-arm64
2025-02-28 17:09:23 +01:00
2025-02-28 16:11:10 +01:00
# Sign the manifest
- name: Sign the manifests
2024-07-25 02:08:26 +02:00
env:
TAGS: ${{ steps.meta.outputs.tags }}
2025-02-26 11:03:28 +01:00
run: |
for TAG in $TAGS; do
cosign sign --yes $TAG
done