Skip to content

Enhanced GitHub Workflow with ARM64 Docker Builds #452

Enhanced GitHub Workflow with ARM64 Docker Builds

Enhanced GitHub Workflow with ARM64 Docker Builds #452

Workflow file for this run

name: Main
on: [push, pull_request]
env:
should_push_image: |-
${{
github.event_name == 'push' && (
startsWith(github.event.ref, 'refs/tags/')
|| endsWith(github.event.ref, '/master')
)
}}
build_and_cache: |-
build_and_cache() {
arch="$1"
if ! docker buildx build \
--platform linux/$arch \
--cache-from type=local,src=/home/runner/tmp/$arch \
--cache-to type=local,dest=/home/runner/tmp/$arch \
--tag ${GITHUB_REPOSITORY,,}:$arch \
--file Dockerfile . ;
then
echo "::error::Docker-Build Error. $arch Cache will be deleted now!"
rm -rf /home/runner/tmp/$arch/
docker buildx prune -a -f
fi
}
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Update cache on every commit
uses: actions/cache@v3
with:
path: /home/runner/tmp
key: docker-${{ github.run_id }}
restore-keys: |
docker-
- name: Compute Docker Tag
if: fromJSON(env.should_push_image)
id: compute_docker_tag
run: |
tag=${GITHUB_REF#refs/tags/}
branch=${GITHUB_REF#refs/heads/}
if [ "$tag" != "$GITHUB_REF" ]; then
tag=$(echo "$tag" | sed -e 's/[^a-zA-Z0-9\-\.]/-/g')
echo ::set-output name=DOCKER_TAG::${tag}
elif [ "$branch" != "$GITHUB_REF" ]; then
branch=$(echo "$branch" | sed -e 's/[^a-zA-Z0-9\-\.]/-/g')
echo ::set-output name=DOCKER_TAG::${branch}
else
echo "unable to determine docker tag" >&2
exit 1
fi
- name: Docker registry login
if: fromJSON(env.should_push_image)
run: |
echo "${{ secrets.DOCKER_HUB_PASSWORD }}" \
| docker login -u "${{ secrets.DOCKER_HUB_USER }}" --password-stdin
- name: Docker env prep
run: |
docker buildx create --use
docker buildx inspect --bootstrap
- name: Fill AMD64 cache
run: |
${{ env.build_and_cache }}
build_and_cache amd64
- name: Fill ARM64 cache
run: |
${{ env.build_and_cache }}
build_and_cache arm64
- name: Docker build (from cache) and push
if: fromJSON(env.should_push_image)
run: |
docker buildx build --push \
--platform linux/amd64,linux/arm64 \
--tag ${GITHUB_REPOSITORY,,}:${{ steps.compute_docker_tag.outputs.DOCKER_TAG }} \
--file Dockerfile .
- name: Docker build (from cache) & push latest
if: |
github.event_name == 'push' && (
startsWith(github.event.ref, 'refs/tags/')
)
run: |
docker buildx build --push \
--platform linux/amd64,linux/arm64 \
--tag ${GITHUB_REPOSITORY,,}:latest \
--file Dockerfile .