Skip to content

Build Multiarch Images #177

Build Multiarch Images

Build Multiarch Images #177

name: Build Multiarch Images
on:
workflow_dispatch:
inputs:
be-tag:
description: "The Lemmy Backend tag to build"
required: false
type: string
fe-tag:
description: "The Lemmy Frontend tag to build"
required: false
type: string
env:
LEMMY_ORG: LemmyNet
BE_REPO: lemmy
FE_REPO: lemmy-ui
DST_REGISTRY: ghcr.io
BE_TAG: ${{ github.event.inputs.be-tag }}
FE_TAG: ${{ github.event.inputs.fe-tag }}
jobs:
launch-runners:
runs-on: ubuntu-latest
if: github.event.inputs.fe-tag != '' || github.event.inputs.be-tag != ''
strategy:
matrix:
include:
- runner-arch: "x64"
docker-target: "linux/amd64"
target-short: "amd64"
ec2-ami: "ami-034de852f74caf71b"
ec2-instance-type: "c5d.large"
- runner-arch: "arm64"
docker-target: "linux/arm/v7"
target-short: "arm"
ec2-ami: "ami-015b0351eb1536708"
ec2-instance-type: "c6gn.large"
- runner-arch: "arm64"
docker-target: "linux/arm64"
target-short: "arm64"
ec2-ami: "ami-015b0351eb1536708"
ec2-instance-type: "c6gn.large"
steps:
- name: Launch Spot Runner (${{ matrix.runner-arch }}, ${{ matrix.docker-target }})
id: launch
uses: ubergeek77/aws-ec2-spot-runner@v1
with:
ec2-ami: ${{ matrix.ec2-ami }}
ec2-instance-type: ${{ matrix.ec2-instance-type }}
runner-arch: ${{ matrix.runner-arch }}
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
ec2-keypair-name: ${{ secrets.EC2_KEYPAIR }}
ec2-security-group-id: ${{ secrets.EC2_SG }}
github-repo: ${{ github.repository }}
github-token: ${{ secrets.RUNNER_TOKEN }}
- name: Export Runner Label
id: save-labels
run: echo "${{ matrix.target-short }}_label=${{ steps.launch.outputs.label }}" >> $GITHUB_OUTPUT
outputs:
amd64_label: ${{ steps.save-labels.outputs.amd64_label }}
arm_label: ${{ steps.save-labels.outputs.arm_label }}
arm64_label: ${{ steps.save-labels.outputs.arm64_label }}
build-images:
needs: launch-runners
if: github.event.inputs.fe-tag != '' || github.event.inputs.be-tag != ''
strategy:
matrix:
include:
- docker-target: "linux/amd64"
target-short: "amd64"
runs-on: ${{ needs.launch-runners.outputs.amd64_label }}
- docker-target: "linux/arm/v7"
target-short: "arm"
runs-on: ${{ needs.launch-runners.outputs.arm_label }}
- docker-target: "linux/arm64"
target-short: "arm64"
runs-on: ${{ needs.launch-runners.outputs.arm64_label }}
runs-on: ${{ matrix.runs-on }}
steps:
- name: Checkout Build Files
uses: actions/checkout@v4
- name: Checkout Lemmy Frontend Source (${{ env.FE_TAG }})
uses: actions/checkout@v4
if: env.FE_TAG != ''
with:
repository: ${{ env.LEMMY_ORG }}/${{ env.FE_REPO }}
ref: ${{ env.FE_TAG }}
path: ${{ env.FE_REPO }}
submodules: recursive
- name: Checkout Lemmy Backend Source (${{ env.BE_TAG }})
uses: actions/checkout@v4
if: github.event.inputs.be-tag != ''
with:
repository: ${{ env.LEMMY_ORG }}/${{ env.BE_REPO }}
ref: ${{ env.BE_TAG }}
path: ${{ env.BE_REPO }}
submodules: recursive
- name: Override Frontend Dockerfile
if: env.FE_TAG != ''
run: cp -f ./Dockerfile-frontend ./${{ env.FE_REPO }}/Dockerfile
- name: Override Backend Dockerfile
if: github.event.inputs.be-tag != ''
run: cp -f ./Dockerfile-backend ./${{ env.BE_REPO }}/Dockerfile
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.DST_REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Frontend (${{ env.FE_TAG }}, ${{ matrix.docker-target }})
if: env.FE_TAG != ''
uses: docker/build-push-action@v5
with:
context: ./${{ env.FE_REPO }}
file: ./${{ env.FE_REPO }}/Dockerfile
platforms: ${{ matrix.docker-target }}
push: true
tags: ${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.FE_REPO }}:${{ env.FE_TAG }}-${{ matrix.target-short }}
- name: Build and push Backend (${{ env.BE_TAG }}, ${{ matrix.docker-target }})
if: github.event.inputs.be-tag != ''
uses: docker/build-push-action@v5
with:
context: ./${{ env.BE_REPO }}
file: ./${{ env.BE_REPO }}/Dockerfile
platforms: ${{ matrix.docker-target }}
push: true
tags: ${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.BE_REPO }}:${{ env.BE_TAG }}-${{ matrix.target-short }}
stop-runners:
needs: [launch-runners,build-images]
runs-on: ubuntu-latest
if: (github.event.inputs.fe-tag != '' || github.event.inputs.be-tag != '') && always()
strategy:
matrix:
include:
- shutdown-label: ${{ needs.launch-runners.outputs.amd64_label }}
docker-target: "linux/amd64"
runner-arch: "x64"
- shutdown-label: ${{ needs.launch-runners.outputs.arm_label }}
docker-target: "linux/arm/v7"
runner-arch: "arm64"
- shutdown-label: ${{ needs.launch-runners.outputs.arm64_label }}
docker-target: "linux/arm64"
runner-arch: "arm64"
steps:
- name: Terminate Runner (${{ matrix.runner-arch }}, ${{ matrix.docker-target }})
uses: ubergeek77/aws-ec2-spot-runner@v1
with:
shutdown-label: ${{ matrix.shutdown-label }}
github-token: ${{ secrets.RUNNER_TOKEN }}
github-repo: ${{ github.repository }}
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
squash-images:
needs: build-images
if: github.event.inputs.fe-tag != '' || github.event.inputs.be-tag != ''
runs-on: ubuntu-latest
steps:
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.DST_REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Squash Frontend Multiarch Tags
if: env.FE_TAG != ''
uses: ubergeek77/squash-docker-tags@v1
with:
source-tags: |
${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.FE_REPO }}:${{ env.FE_TAG }}-amd64
${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.FE_REPO }}:${{ env.FE_TAG }}-arm
${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.FE_REPO }}:${{ env.FE_TAG }}-arm64
destination-tag: ${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.FE_REPO }}:${{ env.FE_TAG }}
- name: Squash Backend Multiarch Tags
if: github.event.inputs.be-tag != ''
uses: ubergeek77/squash-docker-tags@v1
with:
source-tags: |
${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.BE_REPO }}:${{ env.BE_TAG }}-amd64
${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.BE_REPO }}:${{ env.BE_TAG }}-arm
${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.BE_REPO }}:${{ env.BE_TAG }}-arm64
destination-tag: ${{ env.DST_REGISTRY }}/${{ github.repository_owner }}/${{ env.BE_REPO }}:${{ env.BE_TAG }}