Skip to content

Commit

Permalink
feat(CI): turn docker images into locally produced matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
ook37 committed Feb 22, 2024
1 parent 2d722a3 commit 35398a6
Showing 1 changed file with 168 additions and 0 deletions.
168 changes: 168 additions & 0 deletions .github/workflows/publish-docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
name: Publish Pacstall Docker Images

on:
workflow_dispatch:
inputs:
vertag:
description: 'Version Tag'
required: false
push:
branches:
- develop
- master
tags:
- '*'

env:
INPUT_VERTAG: ${{ github.event.inputs.vertag }}
REGISTRY: ghcr.io
REF_NAME: ${{ github.ref_name }}

jobs:

build:
strategy:
matrix:
OS: ["ubuntu:latest", "ubuntu:devel", "ubuntu:rolling", "debian:stable", "debian:testing", "debian:unstable"]
platform: ["linux/amd64", "linux/arm64"]
fail-fast: false
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build Dockerfile
run: |
vertag=${{ env.INPUT_VERTAG }}
if [[ -z ${vertag} ]]; then
vertag=${{ env.REF_NAME }}
fi
platform=${{ matrix.platform }}
arch=${platform#*/}
distro=${{ matrix.OS }}
distro_tag="${distro/:/-}"
curl -fsSL https://raw.githubusercontent.com/pacstall/docker/master/pacstall-docker-builder -o pacstall-docker-builder
chmod +x pacstall-docker-builder
./pacstall-docker-builder -f -a ${arch} -d ${distro} -v ${vertag}
echo "BUILT_DOCKFILE=Dockerfile-Pacstall-${vertag}-${arch}-${distro_tag}-$(date +%Y%m%d)" >> $GITHUB_ENV
echo "DOCK_LABEL=${vertag}" >> $GITHUB_ENV
echo "PLATFORM_PAIR=${distro_tag}-${arch}" >> $GITHUB_ENV
echo "REGISTRY_IMAGE=${{ env.REGISTRY }}/${{ github.repository_owner }}/${distro_tag}" >> $GITHUB_ENV
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
type=raw,value=${{ env.DOCK_LABEL }}
flavor: latest=true

- name: Login to registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push by digest
id: build
uses: docker/build-push-action@v5
with:
context: .
file: ./${{ env.BUILT_DOCKFILE }}
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

merge:
strategy:
matrix:
OS: ["ubuntu:latest", "ubuntu:devel", "ubuntu:rolling", "debian:stable", "debian:testing", "debian:unstable"]
fail-fast: false
runs-on: ubuntu-latest
needs: [build]
steps:
- name: Load envars
run: |
vertag=${{ env.INPUT_VERTAG }}
if [[ -z ${vertag} ]]; then
vertag=${{ env.REF_NAME }}
fi
distro=${{ matrix.OS }}
distro_tag="${distro/:/-}"
echo "DOCK_LABEL=${vertag}" >> $GITHUB_ENV
if [[ ${vertag} == "develop" ]]; then
echo "FLAVOR_LATEST=false" >> $GITHUB_ENV
echo "DATE_DOCK_LABEL=${vertag}-$(date +%Y%m%d)" >> $GITHUB_ENV
elif [[ ${vertag} == "master" ]]; then
echo "FLAVOR_LATEST=true" >> $GITHUB_ENV
echo "DATE_DOCK_LABEL=${vertag}-$(date +%Y%m%d)" >> $GITHUB_ENV
else
echo "FLAVOR_LATEST=true" >> $GITHUB_ENV
fi
echo "DISTRO_TAG=${distro_tag}" >> $GITHUB_ENV
echo "REGISTRY_IMAGE=${{ env.REGISTRY }}/${{ github.repository_owner }}/${distro_tag}" >> $GITHUB_ENV
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-${{ env.DISTRO_TAG }}*
merge-multiple: true

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
version: v0.12.0

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
type=raw,value=${{ env.DOCK_LABEL }}
type=raw,value=${{ env.DATE_DOCK_LABEL }}
flavor: latest=${{ env.FLAVOR_LATEST }}

- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Create manifest list and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create \
--annotation "index:org.opencontainers.image.description=Contains amd64/x86_64 + arm64/aarch64 pacstall:${{ env.DOCK_LABEL }} images for ${{ matrix.OS }}, from $(date +%Y%m%d)." \
$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}

0 comments on commit 35398a6

Please sign in to comment.