mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-08 11:03:25 -08:00
* pin used actions plus some reordering and harmonization across files * [CI] Link the version string and RNG stub into the test targets The distribution libgtest.a now used by the Linux images makes the linker pull more translation units out of libcockatrice_network than the fetched googletest did. Those units reference VERSION_STRING and the global rng, which several test targets never defined, so the instrumented Ubuntu 26.04 legs failed at link: undefined reference to `VERSION_STRING' undefined reference to `rng' Add the generated version string source wherever a test links the network umbrella, and define the rng stub in the tests that pull the server game classes without declaring it. This matches what the neighbouring server tests already do. A full Debug build and ctest suite in the ci-ubuntu2604 image (system libgtest.a) is green: 841 tests pass. Fixes the nightly failures introduced by #6894. --------- Co-authored-by: Lukas Brübach <44814898+BruebachL@users.noreply.github.com>
203 lines
7.8 KiB
YAML
203 lines
7.8 KiB
YAML
name: Build Docker
|
|
|
|
permissions:
|
|
contents: read # needed to checkout repo
|
|
packages: write # needed for interacting with GHCR
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- master
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
paths:
|
|
- '.github/workflows/docker-release.yml'
|
|
- '.dockerignore'
|
|
- 'Dockerfile'
|
|
- 'docker-compose.yml'
|
|
- 'docker-compose.yml.windows'
|
|
release:
|
|
types:
|
|
- released # publishing of stable releases
|
|
workflow_dispatch: # (re)publish the image for an existing stable release
|
|
inputs:
|
|
tag:
|
|
description: 'Existing release tag to build and publish (e.g. 2026-10-03-Release-3.1.0)'
|
|
required: true
|
|
type: string
|
|
latest:
|
|
description: 'Also update the "latest" tag'
|
|
required: true
|
|
type: boolean
|
|
default: true
|
|
|
|
# Cancel earlier, unfinished runs of this workflow on the same branch (unless publishing)
|
|
concurrency:
|
|
group: "${{ github.workflow }} @ ${{ inputs.tag || github.ref_name }}"
|
|
cancel-in-progress: ${{ github.event_name != 'release' && github.event_name != 'workflow_dispatch' }}
|
|
|
|
env:
|
|
GHCR_IMAGE: ghcr.io/cockatrice/servatrice
|
|
OCI_DESCRIPTION: Server for Cockatrice, a cross-platform virtual tabletop for multiplayer card games
|
|
OCI_TITLE: Servatrice
|
|
OCI_URL: https://cockatrice.github.io/
|
|
|
|
jobs:
|
|
# Create one platform-specific image and publish its OCI image manifest per matrix job
|
|
build:
|
|
name: "Servatrice (${{ matrix.label }})"
|
|
if: github.repository_owner == 'Cockatrice'
|
|
runs-on: ${{ matrix.runner }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- label: x86
|
|
platform: linux/amd64
|
|
runner: ubuntu-latest # https://github.com/actions/runner-images#available-images
|
|
|
|
- label: arm
|
|
platform: linux/arm64
|
|
runner: ubuntu-24.04-arm # https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Arm64-Readme.md, replace with "ubuntu-latest-arm" once available
|
|
|
|
env:
|
|
CACHE_SCOPE: servatrice-${{ matrix.label }}
|
|
|
|
steps:
|
|
- name: "Checkout"
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
ref: ${{ case(github.event_name == 'workflow_dispatch', format('refs/tags/{0}', inputs.tag), '') }}
|
|
|
|
- name: "Set up Docker buildx"
|
|
uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
|
|
|
|
- name: "Login to GitHub Container Registry (GHCR)"
|
|
if: (github.event_name == 'release' && github.event.release.prerelease == false) || github.event_name == 'workflow_dispatch'
|
|
id: login
|
|
uses: docker/login-action@81c6f93d4bc991e510b342a00b419b3bb4efc5c6 # v4.7.0
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ github.token }}
|
|
|
|
# Don't push for non-publishing triggers
|
|
#
|
|
# The layer cache shares the repository's 10 GB Actions cache quota with the compiler
|
|
# caches (see CCACHE_SIZE in desktop-build.yml). mode=min keeps only the final image
|
|
# stage: the build stage sits behind `COPY . .`, so its compile layer is invalidated by
|
|
# every source change and was never read back, yet it was the bulk of the ~2 GB this
|
|
# cache held. The final runtime stage is the part that still pays off.
|
|
- name: "Build image"
|
|
if: steps.login.outcome != 'success'
|
|
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
|
|
with:
|
|
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
|
cache-to: ${{ case(github.ref == 'refs/heads/master', format('type=gha,mode=min,scope={0}', env.CACHE_SCOPE), '') }}
|
|
context: .
|
|
platforms: ${{ matrix.platform }}
|
|
push: false
|
|
|
|
# Add OCI labels and push single-platform image by digest (without tags)
|
|
- name: "Build image and push by digest"
|
|
if: steps.login.outcome == 'success'
|
|
id: build
|
|
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
|
|
with:
|
|
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
|
cache-to: type=gha,mode=min,scope=${{ env.CACHE_SCOPE }}
|
|
context: .
|
|
labels: |
|
|
org.opencontainers.image.description=${{ env.OCI_DESCRIPTION }}
|
|
org.opencontainers.image.title=${{ env.OCI_TITLE }}
|
|
org.opencontainers.image.url=${{ env.OCI_URL }}
|
|
outputs: type=image,name=${{ env.GHCR_IMAGE }},name-canonical=true,push=true,push-by-digest=true
|
|
platforms: ${{ matrix.platform }}
|
|
provenance: mode=max # do not pass secrets as build arguments with this option
|
|
sbom: true
|
|
|
|
- name: "Export digest"
|
|
if: steps.login.outcome == 'success'
|
|
env:
|
|
DIGEST: ${{ steps.build.outputs.digest }}
|
|
run: |
|
|
mkdir -p "$RUNNER_TEMP/digests"
|
|
touch "$RUNNER_TEMP/digests/${DIGEST#sha256:}"
|
|
|
|
- name: "Upload digest"
|
|
if: steps.login.outcome == 'success'
|
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
with:
|
|
if-no-files-found: error
|
|
name: digest-${{ matrix.label }}
|
|
path: ${{ runner.temp }}/digests/*
|
|
retention-days: 1
|
|
|
|
|
|
# Create an OCI image index from the platform-specific image manifests
|
|
index:
|
|
name: "Publish multi-platform Servatrice image"
|
|
if: github.repository_owner == 'Cockatrice' && ((github.event_name == 'release' && github.event.release.prerelease == false) || github.event_name == 'workflow_dispatch')
|
|
needs: build
|
|
runs-on: ubuntu-slim # https://github.com/actions/runner-images/blob/main/images/ubuntu-slim/ubuntu-slim-Readme.md
|
|
|
|
steps:
|
|
- name: "Download digests"
|
|
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
with:
|
|
path: ${{ runner.temp }}/digests
|
|
pattern: digest-*
|
|
merge-multiple: true
|
|
|
|
- name: "Login to GitHub Container Registry (GHCR)"
|
|
uses: docker/login-action@81c6f93d4bc991e510b342a00b419b3bb4efc5c6 # v4.7.0
|
|
with:
|
|
registry: ghcr.io
|
|
username: ${{ github.actor }}
|
|
password: ${{ github.token }}
|
|
|
|
- name: "Docker metadata"
|
|
id: metadata
|
|
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
|
with:
|
|
images: ${{ env.GHCR_IMAGE }}
|
|
flavor: |
|
|
latest=auto
|
|
# if semver, also: type=semver,pattern={{version}} / {{major}}.{{minor}}
|
|
tags: |
|
|
type=ref,event=tag
|
|
type=raw,value=${{ inputs.tag }},enable=${{ github.event_name == 'workflow_dispatch' }}
|
|
type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' && inputs.latest }}
|
|
|
|
# Add OCI annotations to image index and publish tags
|
|
- name: "Create image index"
|
|
env:
|
|
DOCKER_TAGS: ${{ steps.metadata.outputs.tags }}
|
|
working-directory: ${{ runner.temp }}/digests
|
|
run: |
|
|
TAG_ARGS=()
|
|
while IFS= read -r tag; do
|
|
TAG_ARGS+=(--tag "$tag")
|
|
done <<< "$DOCKER_TAGS"
|
|
|
|
DIGEST_ARGS=()
|
|
for digest in *; do
|
|
DIGEST_ARGS+=("$GHCR_IMAGE@sha256:$digest")
|
|
done
|
|
|
|
docker buildx imagetools create \
|
|
--prefer-index=true \
|
|
--annotation "index:org.opencontainers.image.description=$OCI_DESCRIPTION" \
|
|
--annotation "index:org.opencontainers.image.title=$OCI_TITLE" \
|
|
--annotation "index:org.opencontainers.image.url=$OCI_URL" \
|
|
"${TAG_ARGS[@]}" \
|
|
"${DIGEST_ARGS[@]}"
|
|
|
|
- name: "Inspect images"
|
|
env:
|
|
GITHUB_TAG: ${{ inputs.tag || github.ref_name }}
|
|
run: |
|
|
docker buildx imagetools inspect "$GHCR_IMAGE:latest"
|
|
docker buildx imagetools inspect "$GHCR_IMAGE:$GITHUB_TAG"
|