Skip to content

Build and Publish Docker Images #7

Build and Publish Docker Images

Build and Publish Docker Images #7

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 }}
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
if: ${{ inputs.build_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: 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 }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download build version
uses: actions/download-artifact@v4
with:
name: buildver
path: buildver
- name: Prepare SM Dockerfile
run: |
set -e
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: Login to GHCR
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- 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-base, build-sm]
if: ${{ !inputs.skip_main_build || inputs.build_all }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download base version
uses: actions/download-artifact@v4
with:
name: basever
path: basever
- name: Download SM version
uses: actions/download-artifact@v4
with:
name: smver
path: smver
- name: Prepare final Dockerfile
run: |
set -e
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 }}