Build/Push Docker Image #78
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#******************************************************************************* | |
# buidDocker.yml | |
# | |
# Workflow to build and push a multiplatform (amd64, arm64 & arm7) Linux Docker | |
# image for Medley. This workflow uses the latest Maiko docker image and the | |
# latest Medley release on github. | |
# | |
# This workflow contains a sentry that causes it to skip the build (as identified | |
# by its commit SHA) if its already been done. Setting the "force" input to true | |
# will bypass this sentry, | |
# | |
# Updated 2022-01-18 by Frank Halasz from on earlier buildDocker.yml | |
# | |
# Copyright 2022 by Interlisp.org | |
# | |
# ****************************************************************************** | |
name: 'Build/Push Docker Image' | |
# Run this workflow on ... | |
on: | |
workflow_dispatch: | |
inputs: | |
draft: | |
description: "Mark this as a draft release" | |
type: choice | |
options: | |
- 'false' | |
- 'true' | |
force: | |
description: "Force build even if build already successfully completed for this commit" | |
type: choice | |
options: | |
- 'false' | |
- 'true' | |
workflow_call: | |
outputs: | |
successful: | |
description: "'True' if medley docker build completed successully" | |
value: ${{ jobs.complete.outputs.build_successful }} | |
inputs: | |
draft: | |
description: "Mark this as a draft release" | |
required: false | |
type: string | |
default: 'false' | |
force: | |
description: "Force build even if build already successfully completed for this commit" | |
required: false | |
type: string | |
default: 'false' | |
secrets: | |
DOCKER_USERNAME: | |
required: true | |
DOCKER_PASSWORD: | |
required: true | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
###################################################################################### | |
# Regularize the inputs so they can be referenced the same way whether they are | |
# the result of a workflow_dispatch or a workflow_call | |
inputs: | |
runs-on: ubuntu-latest | |
outputs: | |
draft: ${{ steps.one.outputs.draft }} | |
force: ${{ steps.one.outputs.force }} | |
steps: | |
- id: one | |
run: > | |
if [ '${{ toJSON(inputs) }}' = 'null' ]; | |
then | |
echo "workflow_dispatch"; | |
echo "draft=${{ github.event.inputs.draft }}" >> $GITHUB_OUTPUT; | |
echo "force=${{ github.event.inputs.force }}" >> $GITHUB_OUTPUT; | |
else | |
echo "workflow_call"; | |
echo "draft=${{ inputs.draft }}" >> $GITHUB_OUTPUT; | |
echo "force=${{ inputs.force }}" >> $GITHUB_OUTPUT; | |
fi | |
###################################################################################### | |
# Use sentry-action to determine if this release has already been built | |
# based on the latest commit to the repo | |
sentry: | |
needs: inputs | |
runs-on: ubuntu-latest | |
outputs: | |
release_not_built: ${{ steps.check.outputs.release_not_built }} | |
steps: | |
# Checkout the actions for this repo owner | |
- name: Checkout Actions | |
uses: actions/checkout@v3 | |
with: | |
repository: ${{ github.repository_owner }}/.github | |
path: ./Actions_${{ github.sha }} | |
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }} | |
# Check if build already run for this commit | |
- name: Build already completed? | |
id: check | |
continue-on-error: true | |
uses: ./../actions/check-sentry-action | |
with: | |
tag: "docker" | |
###################################################################################### | |
# | |
# Build and push the medley docker image | |
# | |
build_and-push: | |
runs-on: ubuntu-latest | |
needs: [inputs, sentry] | |
if: | | |
needs.sentry.outputs.release_not_built == 'true' | |
|| needs.inputs.outputs.force == 'true' | |
steps: | |
# Checkout latest commit | |
- name: Checkout Medley | |
uses: actions/checkout@v3 | |
# Find latest release (draft or normal) | |
# and download its assets | |
- name: Download linux debs from latest (draft) release | |
run: | | |
tag="" | |
if [ "${{ needs.inputs.outputs.draft }}" = "true" ]; | |
then | |
tag=$(gh release list | grep Draft | head -n 1 | awk '{ print $3 }') | |
fi | |
if [ -z "${tag}" ]; | |
then | |
tag=$(gh release list | grep Latest | head -n 1 | awk '{ print $3 }') | |
fi | |
mkdir -p release_debs | |
gh release download ${tag} -D release_debs -p '*-linux-*.deb' | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
# Get Maiko and Medley release information from name of deb files | |
# just downloaded from the Medley latest release | |
- name: Get info about Miako and Medley releases | |
id: release_info | |
run: | | |
regex="^medley-full-[^-]*-[^-]*-\([^_]*\)_\(.*\).deb\$" | |
ls -1 release_debs | head -n 1 > debname.tmp | |
medley_release="medley-$(sed -e "s/${regex}/\1/" debname.tmp)" | |
maiko_release="maiko-$(sed -e "s/${regex}/\2/" debname.tmp)" | |
rm -f debname.tmp | |
echo "MEDLEY_RELEASE=${medley_release}" >> ${GITHUB_ENV} | |
echo "MAIKO_RELEASE=${maiko_release}" >> ${GITHUB_ENV} | |
# regex="^[^0-9]*\([^_]*\)_\([^-]*-[^-]*\)-\([^-]*\)-\([^.]*\).*\$" | |
# Set repo env variables | |
- name: Set repo/docker env variables | |
id: repo_env | |
run: | | |
repo_name="${GITHUB_REPOSITORY#*/}" | |
docker_namespace="$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')" | |
docker_image="${docker_namespace}/${repo_name}" | |
if [ "${{ needs.inputs.outputs.draft }}" = "false" ]; | |
then | |
docker_tags="${docker_image}:latest,${docker_image}:${MEDLEY_RELEASE#*-}_${MAIKO_RELEASE#*-}" | |
platforms="linux/amd64,linux/arm64" | |
else | |
docker_tags="${docker_image}:draft" | |
platforms="linux/amd64" | |
fi | |
echo "REPO_NAME=${repo_name}" >> ${GITHUB_ENV} | |
echo "DOCKER_NAMESPACE=${docker_namespace}" >> ${GITHUB_ENV} | |
echo "DOCKER_IMAGE=${docker_image}" >> ${GITHUB_ENV} | |
echo "DOCKER_TAGS=${docker_tags}" >> ${GITHUB_ENV} | |
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> ${GITHUB_ENV} | |
echo "PLATFORMS=${platforms}" >> ${GITHUB_ENV} | |
#linux/amd64,linux/arm64,linux/arm/v7 | |
# Setup the Docker Machine Emulation environment. | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@master | |
with: | |
platforms: linux/amd64,linux/arm64,linux/arm/v7 | |
# Setup the Docker Buildx funtion | |
- name: Set up Docker Buildx | |
id: buildx | |
uses: docker/setup-buildx-action@master | |
# Login into DockerHub - required to store the created image | |
- name: Login to DockerHub | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
# Do the Docker Build using the Dockerfile in the repository | |
# checked out and the release tars just downloaded. | |
# Push the result to Docker Hub | |
- name: Build Docker Image for Push to Docker Hub | |
uses: docker/build-push-action@v3 | |
with: | |
builder: ${{ steps.buildx.outputs.name }} | |
build-args: | | |
BUILD_DATE=${{ env.BUILD_DATE }} | |
MEDLEY_RELEASE=${{ env.MEDLEY_RELEASE }} | |
MAIKO_RELEASE=${{ env.MAIKO_RELEASE }} | |
REPO_OWNER=${{ github.repository_owner }} | |
context: ./release_debs | |
file: ./.github/workflows/Dockerfile_medley | |
platforms: ${{ env.PLATFORMS }} | |
# Push the result to DockerHub | |
push: true | |
tags: ${{ env.DOCKER_TAGS }} | |
###################################################################################### | |
# Use set-sentry-action to determine set the sentry that says this release has | |
# been successfully built | |
complete: | |
runs-on: ubuntu-latest | |
outputs: | |
build_successful: ${{ steps.output.outputs.build_successful }} | |
needs: [inputs, sentry, build_and-push] | |
steps: | |
# Checkout the actions for this repo owner | |
- name: Checkout Actions | |
uses: actions/checkout@v3 | |
with: | |
repository: ${{ github.repository_owner }}/.github | |
path: ./Actions_${{ github.sha }} | |
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }} | |
# Set sentry | |
- name: Set flag that build for this commit has been completed | |
id: set | |
uses: ./../actions/set-sentry-action | |
with: | |
tag: "docker" | |
- name: Output | |
id: output | |
run: | | |
echo "build_successful='true'" >> ${GITHUB_OUTPUT} | |
###################################################################################### |