This workflow automates building and publishing Docker images upon a release or manual trigger. It includes steps for version resolution, Docker Hub login, and caching to optimize builds for both backend and frontend images.
92 lines
2.8 KiB
YAML
92 lines
2.8 KiB
YAML
name: Docker Publish (Release)
|
|
|
|
on:
|
|
release:
|
|
types: [published]
|
|
workflow_dispatch:
|
|
inputs:
|
|
version:
|
|
description: "Version tag to publish (e.g. 0.1.2 or v0.1.2)"
|
|
required: false
|
|
type: string
|
|
|
|
jobs:
|
|
publish:
|
|
name: Build and Push Docker Images
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
# Optional repo variable. If unset, DOCKERHUB_USERNAME is used.
|
|
IMAGE_NAMESPACE: ${{ vars.DOCKERHUB_NAMESPACE }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Resolve version/tag
|
|
id: ver
|
|
shell: bash
|
|
run: |
|
|
RAW_TAG="${{ github.event.release.tag_name }}"
|
|
if [ -z "$RAW_TAG" ]; then
|
|
RAW_TAG="${{ inputs.version }}"
|
|
fi
|
|
if [ -z "$RAW_TAG" ]; then
|
|
RAW_TAG="${GITHUB_REF_NAME}"
|
|
fi
|
|
|
|
CLEAN_TAG="${RAW_TAG#v}"
|
|
echo "raw=$RAW_TAG" >> "$GITHUB_OUTPUT"
|
|
echo "clean=$CLEAN_TAG" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Set image namespace
|
|
id: ns
|
|
shell: bash
|
|
run: |
|
|
NS="${IMAGE_NAMESPACE}"
|
|
if [ -z "$NS" ]; then
|
|
NS="${{ secrets.DOCKERHUB_USERNAME }}"
|
|
fi
|
|
if [ -z "$NS" ]; then
|
|
echo "Missing Docker Hub namespace. Set repo var DOCKERHUB_NAMESPACE or secret DOCKERHUB_USERNAME."
|
|
exit 1
|
|
fi
|
|
echo "value=$NS" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Build and push backend image
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: ./backend
|
|
file: ./backend/Dockerfile
|
|
push: true
|
|
tags: |
|
|
${{ steps.ns.outputs.value }}/nexapg-backend:${{ steps.ver.outputs.clean }}
|
|
${{ steps.ns.outputs.value }}/nexapg-backend:latest
|
|
cache-from: type=registry,ref=${{ steps.ns.outputs.value }}/nexapg-backend:buildcache
|
|
cache-to: type=registry,ref=${{ steps.ns.outputs.value }}/nexapg-backend:buildcache,mode=max
|
|
|
|
- name: Build and push frontend image
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: ./frontend
|
|
file: ./frontend/Dockerfile
|
|
push: true
|
|
build-args: |
|
|
VITE_API_URL=/api/v1
|
|
tags: |
|
|
${{ steps.ns.outputs.value }}/nexapg-frontend:${{ steps.ver.outputs.clean }}
|
|
${{ steps.ns.outputs.value }}/nexapg-frontend:latest
|
|
cache-from: type=registry,ref=${{ steps.ns.outputs.value }}/nexapg-frontend:buildcache
|
|
cache-to: type=registry,ref=${{ steps.ns.outputs.value }}/nexapg-frontend:buildcache,mode=max
|