Files
coolify/.github/workflows/coolify-release.yml
T
Andras Bacsai 7716e65eea ci(release): promote SHA-tagged images on release
Publish branch builds under immutable commit SHA tags, then promote the
released image to its version tag and stable releases to latest.
2026-07-19 23:00:47 +02:00

108 lines
3.6 KiB
YAML

name: Release Coolify
on:
release:
types: [published]
permissions:
contents: read
packages: write
env:
GITHUB_REGISTRY: ghcr.io
DOCKER_REGISTRY: docker.io
IMAGE_NAME: coollabsio/coolify
jobs:
promote-image:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
persist-credentials: false
ref: ${{ github.event.release.tag_name }}
- uses: docker/setup-buildx-action@v3
- name: Login to ${{ env.GITHUB_REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.GITHUB_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to ${{ env.DOCKER_REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Resolve release image
id: release
env:
TAG_NAME: ${{ github.event.release.tag_name }}
run: |
if [[ ! "${TAG_NAME}" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then
echo "Unsupported release tag: ${TAG_NAME}"
exit 1
fi
VERSION="${TAG_NAME#v}"
RELEASE_SHA=$(git rev-list -n 1 "${TAG_NAME}")
CONFIG_VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)
if [[ "${CONFIG_VERSION}" != "${VERSION}" ]]; then
echo "Release tag ${VERSION} does not match config version ${CONFIG_VERSION}."
exit 1
fi
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "sha=${RELEASE_SHA}" >> "$GITHUB_OUTPUT"
- name: Promote version on ${{ env.GITHUB_REGISTRY }}
env:
REGISTRY: ${{ env.GITHUB_REGISTRY }}
VERSION: ${{ steps.release.outputs.version }}
RELEASE_SHA: ${{ steps.release.outputs.sha }}
run: |
IMAGE="${REGISTRY}/${IMAGE_NAME}"
SOURCE_TAG="sha-${RELEASE_SHA}"
docker buildx imagetools create "${IMAGE}:${SOURCE_TAG}" --tag "${IMAGE}:${VERSION}"
- name: Promote version on ${{ env.DOCKER_REGISTRY }}
env:
REGISTRY: ${{ env.DOCKER_REGISTRY }}
VERSION: ${{ steps.release.outputs.version }}
RELEASE_SHA: ${{ steps.release.outputs.sha }}
run: |
IMAGE="${REGISTRY}/${IMAGE_NAME}"
SOURCE_TAG="sha-${RELEASE_SHA}"
docker buildx imagetools create "${IMAGE}:${SOURCE_TAG}" --tag "${IMAGE}:${VERSION}"
- name: Promote latest on ${{ env.GITHUB_REGISTRY }}
if: ${{ ! github.event.release.prerelease }}
env:
REGISTRY: ${{ env.GITHUB_REGISTRY }}
RELEASE_SHA: ${{ steps.release.outputs.sha }}
run: |
IMAGE="${REGISTRY}/${IMAGE_NAME}"
SOURCE_TAG="sha-${RELEASE_SHA}"
docker buildx imagetools create "${IMAGE}:${SOURCE_TAG}" --tag "${IMAGE}:latest"
- name: Promote latest on ${{ env.DOCKER_REGISTRY }}
if: ${{ ! github.event.release.prerelease }}
env:
REGISTRY: ${{ env.DOCKER_REGISTRY }}
RELEASE_SHA: ${{ steps.release.outputs.sha }}
run: |
IMAGE="${REGISTRY}/${IMAGE_NAME}"
SOURCE_TAG="sha-${RELEASE_SHA}"
docker buildx imagetools create "${IMAGE}:${SOURCE_TAG}" --tag "${IMAGE}:latest"
- uses: sarisia/actions-status-discord@v1
if: always()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }}