Skip to content

Commit

Permalink
Update workflow to support GHCR
Browse files Browse the repository at this point in the history
  • Loading branch information
carlreid committed Feb 12, 2025
1 parent 4ac6a72 commit d2abcb0
Showing 1 changed file with 180 additions and 115 deletions.
295 changes: 180 additions & 115 deletions .github/workflows/Manual_Publish_Docker.yml
Original file line number Diff line number Diff line change
@@ -1,26 +1,50 @@
name: Manual Publish Docker Latest
name: Build and Publish Docker Images
on:
workflow_dispatch:
inputs:
build_all:
description: 'Build all images'
type: boolean
default: false
build_base:
description: 'Build base image'
type: boolean
default: false
build_build:
description: 'Build build image'
type: boolean
default: false
build_sm:
description: 'Build SM image'
type: boolean
default: false
skip_main_build:
description: 'Skip main build'
type: boolean
default: false
prod:
description: 'Production build'
type: boolean
default: false

permissions:
contents: read
packages: write

env:
REGISTRY_IMAGE: senexcrenshaw/streammaster
REGISTRY: ghcr.io
BASE_IMAGE_NAME: ${{ github.repository }}-builds
FINAL_IMAGE_NAME: ${{ github.repository }}

jobs:
build:
setup:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64

outputs:
version: ${{ steps.gitversion.outputs.semVer }}
branchName: ${{ steps.gitversion.outputs.branchName }}
buildMeta ${{ steps.gitversion.outputs.buildMetadata }}
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0

Expand All @@ -30,145 +54,186 @@ jobs:
versionSpec: "5.x"

- name: Determine Version
id: gitversion
uses: gittools/actions/gitversion/execute@v0
with:
useConfigFile: true
updateAssemblyInfo: true
targetPath: StreamMasterAPI

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
latest
${{ env.GitVersion_SemVer }}
${{ env.GitVersion_SemVer }}-${{ env.GitVersion_BuildMetaDataPadded }}

- name: Set up QEMU
uses: docker/setup-qemu-action@v2
build-base:
needs: setup
if: ${{ inputs.build_base || inputs.build_all }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Login to Docker Hub
- name: Login to GHCR
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push by digest
id: build
- name: Build and push base image
uses: docker/build-push-action@v4
with:
context: .
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
file: Dockerfile.base
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-base

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Save base version
run: echo "${{ needs.setup.outputs.version }}" > basever

- name: Upload digest
- name: Upload base version
uses: actions/upload-artifact@v3
with:
name: digests
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
name: basever
path: basever

merge:
build-build:
needs: setup
if: ${{ inputs.build_build || inputs.build_all }}
runs-on: ubuntu-latest
needs:
- build
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

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

- name: Install GitVersion
uses: gittools/actions/gitversion/setup@v0
- name: Build and push build image
uses: docker/build-push-action@v4
with:
versionSpec: "5.x"
context: .
file: Dockerfile.build
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-build

- name: Determine Version
uses: gittools/actions/gitversion/execute@v0
- name: Save build version
run: echo "${{ needs.setup.outputs.version }}" > buildver

- name: Upload build version
uses: actions/upload-artifact@v3
with:
useConfigFile: true
updateAssemblyInfo: true
targetPath: StreamMasterAPI
name: buildver
path: buildver

- name: Download digests
build-sm:
needs: [setup, build-build]
if: ${{ inputs.build_sm || inputs.build_all }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Download build version
uses: actions/download-artifact@v3
with:
name: digests
path: /tmp/digests
name: buildver
path: buildver

- name: Display GitVersion variables
- name: Prepare SM Dockerfile
run: |
echo "Major: ${{ env.GitVersion_Major }}"
echo "Minor: ${{ env.GitVersion_Minor }}"
echo "Patch: ${{ env.GitVersion_Patch }}"
echo "PreReleaseTag: ${{ env.GitVersion_PreReleaseTag }}"
echo "PreReleaseTagWithDash: ${{ env.GitVersion_PreReleaseTagWithDash }}"
echo "PreReleaseLabel: ${{ env.GitVersion_PreReleaseLabel }}"
echo "PreReleaseNumber: ${{ env.GitVersion_PreReleaseNumber }}"
echo "WeightedPreReleaseNumber: ${{ env.GitVersion_WeightedPreReleaseNumber }}"
echo "BuildMetaData: ${{ env.GitVersion_BuildMetaData }}"
echo "BuildMetaDataPadded: ${{ env.GitVersion_BuildMetaDataPadded }}"
echo "FullBuildMetaData: ${{ env.GitVersion_FullBuildMetaData }}"
echo "MajorMinorPatch: ${{ env.GitVersion_MajorMinorPatch }}"
echo "SemVer: ${{ env.GitVersion_SemVer }}"
echo "LegacySemVer: ${{ env.GitVersion_LegacySemVer }}"
echo "LegacySemVerPadded: ${{ env.GitVersion_LegacySemVerPadded }}"
echo "AssemblySemVer: ${{ env.GitVersion_AssemblySemVer }}"
echo "AssemblySemFileVer: ${{ env.GitVersion_AssemblySemFileVer }}"
echo "FullSemVer: ${{ env.GitVersion_FullSemVer }}"
echo "InformationalVersion: ${{ env.GitVersion_InformationalVersion }}"
echo "BranchName: ${{ env.GitVersion_BranchName }}"
echo "EscapedBranchName: ${{ env.GitVersion_EscapedBranchName }}"
echo "Sha: ${{ env.GitVersion_Sha }}"
echo "ShortSha: ${{ env.GitVersion_ShortSha }}"
echo "NuGetVersionV2: ${{ env.GitVersion_NuGetVersionV2 }}"
echo "NuGetVersion: ${{ env.GitVersion_NuGetVersion }}"
echo "NuGetPreReleaseTagV2: ${{ env.GitVersion_NuGetPreReleaseTagV2 }}"
echo "NuGetPreReleaseTag: ${{ env.GitVersion_NuGetPreReleaseTag }}"
echo "VersionSourceSha: ${{ env.GitVersion_VersionSourceSha }}"
echo "CommitsSinceVersionSource: ${{ env.GitVersion_CommitsSinceVersionSource }}"
echo "CommitsSinceVersionSourcePadded: ${{ env.GitVersion_CommitsSinceVersionSourcePadded }}"
echo "UncommittedChanges: ${{ env.GitVersion_UncommittedChanges }}"
echo "CommitDate: ${{ env.GitVersion_CommitDate }}"
set -e # Exit immediately if a command exits with a non-zero status.
buildver=$(cat buildver/buildver)
echo "FROM --platform=\$BUILDPLATFORM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${buildver}-build AS build" > Dockerfile.sm
cat Dockerfile.sm.template >> Dockerfile.sm
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
- name: Login to GHCR
uses: docker/login-action@v2
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
latest
${{ env.GitVersion_SemVer }}
${{ env.GitVersion_SemVer }}-${{ env.GitVersion_BuildMetaDataPadded }}
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Login to Docker Hub
uses: docker/login-action@v2
- name: Build and push SM image
uses: docker/build-push-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
context: .
file: Dockerfile.sm
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-sm

- name: Build and Push Image
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
- name: Save SM version
run: echo "${{ needs.setup.outputs.version }}" > smver

- name: Upload SM version
uses: actions/upload-artifact@v3
with:
name: smver
path: smver

build-final:
needs: [setup, build-base, build-sm]
if: ${{ !inputs.skip_main_build || inputs.build_all }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Inspect image
- name: Download base version
uses: actions/download-artifact@v3
with:
name: basever
path: basever

- name: Download SM version
uses: actions/download-artifact@v3
with:
name: smver
path: smver

- name: Prepare final Dockerfile
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
set -e # Exit immediately if a command exits with a non-zero status.
if [ -f "basever/basever" ]; then
basever=$(cat basever/basever)
else
echo "Error: basever/basever not found!"
exit 1
fi
if [ -f "smver/smver" ]; then
smver=$(cat smver/smver)
else
echo "Error: smver/smver not found!"
exit 1
fi
echo "FROM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${smver}-sm AS sm" > Dockerfile
echo "FROM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${basever}-base AS base" >> Dockerfile
cat Dockerfile.template >> Dockerfile
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

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

- name: Build and push final image
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ env.REGISTRY }}/${{ env.FINAL_IMAGE_NAME }}:${{ needs.setup.outputs.version }}
${{ env.REGISTRY }}/${{ env.FINAL_IMAGE_NAME }}:${{ inputs.prod && 'latest' || needs.setup.outputs.branchName }}

0 comments on commit d2abcb0

Please sign in to comment.