Update GH workflow config

This commit is contained in:
Josh.5
2025-06-23 04:30:19 +00:00
parent c3dc444a8f
commit 67e55c50af

View File

@@ -1,144 +1,170 @@
---
name: Build and Deploy CI name: Build and Deploy CI
on: on:
workflow_dispatch:
push: push:
branches: [ 'dev-**', 'pr-**', staging, master ] branches: ['dev-**', 'pr-**', staging, master]
tags: [ '**' ] tags: ['**']
pull_request: pull_request:
branches: [ staging, master ] branches: [staging, master]
schedule: schedule:
# At 02:30 on Saturday # At 02:30 on Saturday
- cron: '30 2 * * 6' - cron: '30 2 * * 6'
jobs: jobs:
build_docker: build_docker:
name: Build Docker Image name: Build Docker Image
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: read
packages: write
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
flavour: ["debian", "arch"] flavour: ['debian', 'arch']
steps: steps:
# Fetch shallow git repository # ---
- name: Checkout - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v4
# Use QEMU to build # ---
- name: Set up QEMU - name: Set up Docker Buildx
if: success() uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 #v3.8.0
id: qemu
uses: docker/setup-qemu-action@v1
# Use docker buildx to build the docker image # ---
- name: Build the Docker image - name: Prepare
uses: docker/setup-buildx-action@v1 if: success()
if: success() id: prepare
id: buildx run: |
with: FLAVOUR=${{ matrix.flavour }}
version: latest echo "FLAVOUR='${FLAVOUR}'"
echo "GITHUB_REF='${GITHUB_REF}'"
echo "GITHUB_REPOSITORY='${GITHUB_REPOSITORY}'"
VERSION_TAG=${GITHUB_REF#refs/*/}
SHA_SHORT="${GITHUB_SHA::7}"
ORG=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
BUILD_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
# Generate 'prepare' build arguments to be retrieved later on SERVICE_NAME=steam-headless
- name: Prepare DOCKER_HUB_IMAGE=docker.io/josh5/${SERVICE_NAME:?}
if: success() GHCR_IMAGE=ghcr.io/${ORG:?}/${SERVICE_NAME:?}
id: prepare
run: | DOCKER_TAGS=""
FLAVOUR=${{ matrix.flavour }} if [[ ${GITHUB_REF} == refs/heads/master ]]; then
echo "FLAVOUR='${FLAVOUR}'"
echo "GITHUB_REF='${GITHUB_REF}'"
echo "GITHUB_REPOSITORY='${GITHUB_REPOSITORY}'"
DOCKER_IMAGE=docker.io/josh5/steam-headless
VERSION_TAG=${GITHUB_REF#refs/*/}
DOCKER_TAGS=""
if [[ ${VERSION_TAG%/merge} == 'master' ]]; then
if [[ ${FLAVOUR} == 'debian' ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
fi
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR},"
elif [[ ${VERSION_TAG%/merge} == 'staging' ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-staging,"
elif [[ ${VERSION_TAG%/merge} =~ "dev-"* ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-${VERSION_TAG%/merge},"
fi
if [[ ${GITHUB_REF} == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
if [[ ${VERSION} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[-\w]*$ ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-${VERSION},"
if [[ ${FLAVOUR} == 'debian' ]]; then if [[ ${FLAVOUR} == 'debian' ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest," DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_HUB_IMAGE}:latest,${GHCR_IMAGE}:latest,${GHCR_IMAGE}:stable,"
fi fi
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_HUB_IMAGE}:${FLAVOUR},${GHCR_IMAGE}:${FLAVOUR},"
elif [[ ${GITHUB_REF} == refs/heads/staging ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_HUB_IMAGE}:${FLAVOUR}-staging,${GHCR_IMAGE}:${FLAVOUR}-staging,"
elif [[ ${GITHUB_REF} == refs/heads/dev-* ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_HUB_IMAGE}:${FLAVOUR}-${VERSION_TAG},${GHCR_IMAGE}:${FLAVOUR}-${VERSION_TAG},"
elif [[ ${GITHUB_REF} == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
if [[ ${VERSION} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[-\w]*$ ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_HUB_IMAGE}:${FLAVOUR}-${VERSION},${GHCR_IMAGE}:${FLAVOUR}-${VERSION},"
if [[ ${FLAVOUR} == 'debian' ]]; then
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_HUB_IMAGE}:latest,${GHCR_IMAGE}:latest,"
fi
fi
elif [[ ${GITHUB_REF} == refs/pull/* ]]; then
PR_NUMBER=$(echo ${GITHUB_REF} | cut -d'/' -f3)
# For PR builds, only tag the GHCR image.
DOCKER_TAGS="${GHCR_IMAGE}:pr-${PR_NUMBER},"
fi fi
fi echo "DOCKER_TAGS='${DOCKER_TAGS}'"
echo "DOCKER_TAGS='${DOCKER_TAGS}'"
echo "Build: [$(date +"%F %T")] [${GITHUB_REF_NAME}] [${GITHUB_SHA}] [${FLAVOUR}]" > ./overlay/version.txt echo "Build: [$(date +"%F %T")] [${GITHUB_REF_NAME}] [${GITHUB_SHA}] [${FLAVOUR}]" > ./overlay/version.txt
DOCKER_PUSH="true" DOCKER_PUSH="true"
if [[ ${DOCKER_IMAGE} != 'docker.io/josh5/steam-headless' ]]; then if [[ ${DOCKER_HUB_IMAGE} != 'docker.io/josh5/steam-headless' ]]; then
DOCKER_PUSH="false" DOCKER_PUSH="false"
fi fi
if [[ ${VERSION_TAG%/merge} =~ "pr-"* ]]; then if [[ ${VERSION_TAG%/merge} =~ "pr-"* ]]; then
DOCKER_PUSH="false" DOCKER_PUSH="false"
fi fi
if [[ ${VERSION_TAG%/merge} =~ ^[0-9]+$ ]]; then if [[ ${VERSION_TAG%/merge} =~ ^[0-9]+$ ]]; then
DOCKER_PUSH="false" DOCKER_PUSH="false"
fi fi
if [[ "X${DOCKER_TAGS}" == "X" ]]; then if [[ "X${DOCKER_TAGS}" == "X" ]]; then
DOCKER_PUSH="false" DOCKER_PUSH="false"
fi fi
echo "DOCKER_PUSH='${DOCKER_PUSH}'" echo "DOCKER_PUSH='${DOCKER_PUSH}'"
cat ./overlay/version.txt cat ./overlay/version.txt
echo "docker_image=${DOCKER_IMAGE}" >> $GITHUB_OUTPUT echo "docker_hub_image:${DOCKER_HUB_IMAGE:?}"
echo "docker_tags=$(echo ${DOCKER_TAGS} | sed 's/,$//')" >> $GITHUB_OUTPUT echo "docker_hub_image=${DOCKER_HUB_IMAGE:?}" >> $GITHUB_OUTPUT
echo "docker_platforms=linux/amd64" >> $GITHUB_OUTPUT
echo "docker_push=${DOCKER_PUSH}" >> $GITHUB_OUTPUT
# Cache the build echo "ghcr_image:${GHCR_IMAGE:?}"
- name: Cache Docker layers echo "ghcr_image=${GHCR_IMAGE:?}" >> $GITHUB_OUTPUT
uses: actions/cache@v2
id: cache
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ matrix.flavour }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-${{ matrix.flavour }}-
# Login to Docker Hub
- name: Login to Docker Hub
if: success() && (startsWith(github.ref, 'refs/heads/') || startsWith(github.ref, 'refs/tags/'))
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Run docker build and push
- name: Docker Build and Push
if: success()
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile.${{ matrix.flavour }}
pull: true
platforms: ${{ steps.prepare.outputs.docker_platforms }}
push: ${{ steps.prepare.outputs.docker_push }}
tags: |
${{ steps.prepare.outputs.docker_tags }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new
# Keep only latest cache echo "sha_short:${SHA_SHORT:?}"
# https://github.com/docker/build-push-action/issues/252 echo "sha_short=${SHA_SHORT:?}" >> $GITHUB_OUTPUT
# https://github.com/moby/buildkit/issues/1896
- name: Move cache echo "service_name:${SERVICE_NAME:?}"
if: always() echo "service_name=${SERVICE_NAME:?}" >> $GITHUB_OUTPUT
run: |
if [[ -e /tmp/.buildx-cache-new ]]; then echo "docker_image:${DOCKER_HUB_IMAGE:?}"
echo "Cleaning up old cache..." echo "docker_image=${DOCKER_HUB_IMAGE:?}" >> $GITHUB_OUTPUT
rm -rf /tmp/.buildx-cache
mv -v /tmp/.buildx-cache-new /tmp/.buildx-cache echo "docker_tags:$(echo ${DOCKER_TAGS} | sed 's/,$//')"
fi echo "docker_tags=$(echo ${DOCKER_TAGS} | sed 's/,$//')" >> $GITHUB_OUTPUT
echo "docker_push:${DOCKER_PUSH:?}"
echo "docker_push=${DOCKER_PUSH:?}" >> $GITHUB_OUTPUT
echo "docker_build_date:${BUILD_DATE:?}"
echo "docker_build_date=${BUILD_DATE:?}" >> $GITHUB_OUTPUT
echo "docker_platforms=linux/amd64" >> $GITHUB_OUTPUT
# ---
- name: Log into GHCR registry
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# ---
- name: Log into Docker Hub registry
if: success() && (startsWith(github.ref, 'refs/heads/') || startsWith(github.ref, 'refs/tags/'))
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 #v3.3.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# ---
- name: Docker meta
if: success()
id: meta
uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 #v5.6.1
with:
images: |
${{ steps.prepare.outputs.docker_image }}
labels: |
maintainer=Josh.5
source.version=${{ steps.prepare.outputs.sha_short }}
source.project=Steam Headless
source.service=${{ steps.prepare.outputs.service_name }}
org.opencontainers.image.title=${{ steps.prepare.outputs.service_name }}
org.opencontainers.image.created=${{ steps.prepare.outputs.docker_build_date }}
# ---
- name: Build Image
if: success()
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc #v6.11.0
with:
context: .
file: Dockerfile.${{ matrix.flavour }}
platforms: ${{ steps.prepare.outputs.docker_platforms }}
pull: 'true'
push: ${{ steps.prepare.outputs.docker_push }}
tags: |
${{ steps.prepare.outputs.docker_tags }}
labels: |
${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=${{ steps.prepare.outputs.service_name }}-${{ matrix.flavour }}-main
cache-to: type=gha,scope=${{ steps.prepare.outputs.service_name }}-${{ matrix.flavour }}-main,mode=max