Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions .github/workflows/BuildEmAll.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: Docker Multi-Platform Build, Push & Release

on:
# Trigger the workflow on pushes to the master branch that change files in the dyndns directory
push:
branches: [ "master" ]
paths:
- 'dyndns/**'

# Allow this workflow to be run manually from the Actions tab
workflow_dispatch:

# Define environment variables for the entire workflow for easy configuration
env:
DOCKER_IMAGE_NAME: w3kllc/ddns

jobs:
Build-Em-All:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Fetch all history for all tags and branches
with:
fetch-depth: 0

- name: Determine Version Tag
id: get_version
run: |
# Get the most recent commit message reliably
LATEST_COMMIT_MSG=$(git log -1 --pretty=%B)

# 1. Try to get version from commit message (e.g., "v1.2.3 Something something")
# The '|| true' ensures that if grep finds nothing, it doesn't cause the script to exit with an error.
COMMIT_MSG_VERSION=$(echo "$LATEST_COMMIT_MSG" | grep -oP '^v[0-9]+\.[0-9]+(\.[0-9]+)?' || true)

if [[ -n "$COMMIT_MSG_VERSION" ]]; then
echo "Found version in commit message: $COMMIT_MSG_VERSION"
echo "TAG=$COMMIT_MSG_VERSION" >> "$GITHUB_OUTPUT"
exit 0
fi

echo "No version found in commit message. Checking for existing Git tags."

# 2. If no version in commit, get the latest git tag
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null)

if [[ -n "$LATEST_TAG" ]]; then
echo "Found latest tag: $LATEST_TAG"
# Increment the patch version of the tag (e.g., v1.2.3 -> v1.2.4 or v1.2 -> v1.3)
NEW_TAG=$(echo "$LATEST_TAG" | awk -F. -v OFS=. '{$NF = $NF + 1;} 1')
echo "Incremented tag to: $NEW_TAG"
echo "TAG=$NEW_TAG" >> "$GITHUB_OUTPUT"
else
# 3. If no tags exist, use a date-based version
DATE_TAG="v$(date -u +'%y.%m.%d-%H%M')"
echo "No tags found. Using date-based tag: $DATE_TAG"
echo "TAG=$DATE_TAG" >> "$GITHUB_OUTPUT"
fi

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.DOCKER_IMAGE_NAME }}
tags: |
# Create a tag with the version from the previous step
type=raw,value=${{ steps.get_version.outputs.TAG }}
# Create the 'latest' tag
type=raw,value=latest,enable={{is_default_branch}}

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v5
with:
context: .
file: ./deployment/Dockerfile
platforms: linux/amd64,linux/386,linux/arm/v7,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

- name: Create GitHub Release
if: github.event_name != 'pull_request' # Only run on push, not PR
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.get_version.outputs.TAG }}
name: Release ${{ steps.get_version.outputs.TAG }}
body: |
Docker Image: `${{ env.DOCKER_IMAGE_NAME }}:${{ steps.get_version.outputs.TAG }}`

${{ github.event.head_commit.message }}
# The action automatically attaches source code archives (zip and tar.gz)
1 change: 1 addition & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
MIT License

Copyright (c) 2025 w3K LLC
Copyright (c) 2020 Benjamin Bärthlein
Copyright (c) 2016 David Prandzioch

Expand Down
Loading