Build and push Docker image #7
Workflow file for this run
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
name: Build and push Docker image | |
on: | |
release: | |
types: [prereleased, released] | |
jobs: | |
build-and-release: | |
name: Build and push Docker image | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
packages: write | |
steps: | |
- name: 📥 Checkout | |
uses: actions/checkout@v3 | |
- name: 🪄 Create Dockerfile | |
# Double run script idea from https://stackoverflow.com/a/73006319/12070367 | |
run: | | |
# Merge backend and frontend Dockerfiles | |
awk -v prefix=backend '$1 == "COPY" && $2 !~ /^--/ {print $1, prefix"/"$2, $3; next} 1' backend/Dockerfile > Dockerfile | |
echo "\n" >> Dockerfile | |
awk -v prefix=frontend '$1 == "COPY" && $2 !~ /^--/ {print $1, prefix"/"$2, $3; next} 1' frontend/Dockerfile >> Dockerfile | |
# Remove and store CMD lines into variables | |
CMD_BACKEND=$(sed -n '/^CMD/p' backend/Dockerfile) | |
CMD_FRONTEND=$(sed -n '/^CMD/p' frontend/Dockerfile) | |
sed -i '/^CMD/d' Dockerfile | |
# Transform CMD variables into `exec` commands and flatten array arguments into strings | |
CMD_BACKEND=$(echo $CMD_BACKEND | sed 's/CMD //; s/^\[ //; s/ \]$//; s/, / /g; s/"//g; s/^/exec /') | |
CMD_FRONTEND=$(echo $CMD_FRONTEND | sed 's/CMD //; s/^\[ //; s/ \]$//; s/, / /g; s/"//g; s/^/exec /') | |
# Create bash script to run both backend and frontend | |
echo "#!/bin/bash\n" > run.sh | |
echo "set -e" >> run.sh | |
echo "echo \"Starting backend...\"" >> run.sh | |
echo "$CMD_BACKEND &" >> run.sh | |
echo "echo \"Starting frontend...\"" >> run.sh | |
echo "$CMD_FRONTEND" >> run.sh | |
# Add run.sh to Dockerfile | |
echo >> Dockerfile | |
echo "COPY run.sh ." >> Dockerfile | |
echo "RUN chmod +x run.sh" >> Dockerfile | |
echo "CMD [ \"./run.sh\" ]" >> Dockerfile | |
- name: 📦 Set up QEMU | |
uses: docker/setup-qemu-action@v2 | |
- name: 🔨 Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
- name: 👨🏻💻 Login to GitHub Container Registry | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: ⚙️ Create environment variables | |
run: | | |
echo "REPO=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV | |
echo "TAG=$(echo ${{ github.event.release.tag_name }} | sed 's/^v//')" >> $GITHUB_ENV | |
- name: 🏗 Build and push Docker image | |
uses: docker/build-push-action@v4 | |
env: | |
BUILDX_NO_DEFAULT_ATTESTATIONS: 1 | |
with: | |
context: . | |
platforms: linux/amd64,linux/arm64/v8,linux/arm/v7 | |
push: true | |
tags: | | |
ghcr.io/${{ env.REPO }}:${{ env.TAG }} | |
ghcr.io/${{ env.REPO }}:latest |