Skip to content

Build and Publish Docker Images #21

Build and Publish Docker Images

Build and Publish Docker Images #21

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: ghcr.io
BASE_IMAGE_NAME: ${{ github.repository_owner }}/streammaster-builds
FINAL_IMAGE_NAME: ${{ github.repository_owner }}/streammaster
jobs:
setup:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.gitversion.outputs.semVer }}
branchName: ${{ steps.gitversion.outputs.branchName }}
buildMeta: ${{ steps.gitversion.outputs.buildMetadata }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install GitVersion
uses: gittools/actions/gitversion/setup@v0
with:
versionSpec: "5.x"
- name: Determine Version
id: gitversion
uses: gittools/actions/gitversion/execute@v0
build-base:
needs: setup
if: |
inputs.build_base ||
inputs.build_all ||
(inputs.build_build && !inputs.build_base) ||
(inputs.build_sm && !inputs.build_base && !inputs.build_build) ||
((!inputs.skip_main_build || inputs.build_all) && !inputs.build_base && !inputs.build_build && !inputs.build_sm)
runs-on: ubuntu-latest
steps:
- 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:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push base image
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile.base
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-base
- name: Save base version
run: echo "${{ needs.setup.outputs.version }}" > basever
- name: Upload base version
uses: actions/upload-artifact@v4
with:
name: basever
path: basever
build-build:
needs: [setup, build-base]
if: |
inputs.build_build ||
inputs.build_all ||
(inputs.build_sm && !inputs.build_build) ||
((!inputs.skip_main_build || inputs.build_all) && !inputs.build_build && !inputs.build_sm)
runs-on: ubuntu-latest
steps:
- 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:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push build image
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile.build
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-build
- name: Save build version
run: echo "${{ needs.setup.outputs.version }}" > buildver
- name: Upload build version
uses: actions/upload-artifact@v4
with:
name: buildver
path: buildver
build-sm:
needs: [setup, build-build]
if: |
inputs.build_sm ||
inputs.build_all ||
((!inputs.skip_main_build || inputs.build_all) && !inputs.build_sm)
runs-on: ubuntu-latest
steps:
- 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:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Check for existing build image
id: check-build
continue-on-error: true
run: |
# Try to pull the build image
docker pull ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-build
if [ $? -eq 0 ]; then
echo "build_exists=true" >> $GITHUB_OUTPUT
else
echo "build_exists=false" >> $GITHUB_OUTPUT
fi
- name: Build build image if needed
if: steps.check-build.outputs.build_exists != 'true' && !inputs.build_all
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile.build
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-build
- name: Prepare SM Dockerfile
run: |
set -e
echo "FROM --platform=\$BUILDPLATFORM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-build AS build" > Dockerfile.sm
cat Dockerfile.sm.template >> Dockerfile.sm
- name: Echo Dockerfile.sm contents
run: cat Dockerfile.sm
- name: Build and push SM image
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile.sm
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-sm
- name: Save SM version
run: echo "${{ needs.setup.outputs.version }}" > smver
- name: Upload SM version
uses: actions/upload-artifact@v4
with:
name: smver
path: smver
build-final:
needs: [setup, build-sm]
if: ${{ !inputs.skip_main_build || 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 GHCR
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Check for existing images
id: check-images
continue-on-error: true
run: |
# Try to pull the required images
docker pull ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-base
if [ $? -eq 0 ]; then
echo "base_exists=true" >> $GITHUB_OUTPUT
else
echo "base_exists=false" >> $GITHUB_OUTPUT
fi
docker pull ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-sm
if [ $? -eq 0 ]; then
echo "sm_exists=true" >> $GITHUB_OUTPUT
else
echo "sm_exists=false" >> $GITHUB_OUTPUT
fi
- name: Build base image if needed
if: steps.check-images.outputs.base_exists != 'true' && !inputs.build_all
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile.base
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-base
- name: Build SM image if needed
if: steps.check-images.outputs.sm_exists != 'true' && !inputs.build_all
uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile.sm
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-sm
- name: Prepare final Dockerfile
run: |
set -e
echo "FROM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-sm AS sm" > Dockerfile
echo "FROM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-base AS base" >> Dockerfile
cat Dockerfile.template >> Dockerfile
- 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 }}