feat(ci): enhance CI workflow with metadata outputs and add Coolify deployment workflow
All checks were successful
CI / lint (push) Successful in 16s
CI / test (push) Successful in 1m3s
CI / build (push) Successful in 1m48s

This commit is contained in:
2025-11-14 19:55:06 +01:00
parent cd0c0ab416
commit fa8a065138
2 changed files with 155 additions and 10 deletions

View File

@@ -6,6 +6,11 @@ on:
jobs:
build:
outputs:
allow_push: ${{ steps.meta.outputs.allow_push }}
ref_name: ${{ steps.meta.outputs.ref_name }}
event_name: ${{ steps.meta.outputs.event_name }}
sha: ${{ steps.meta.outputs.sha }}
runs-on: ubuntu-latest
env:
DEFAULT_BRANCH: main
@@ -23,9 +28,16 @@ jobs:
env:
DEFAULT_BRANCH: ${{ env.DEFAULT_BRANCH }}
run: |
ref_name="${GITHUB_REF_NAME:-${GITHUB_REF##*/}}"
event_name="${GITHUB_EVENT_NAME:-}"
sha="${GITHUB_SHA:-}"
git_ref="${GITEA_REF:-${GITHUB_REF:-}}"
ref_name="${GITEA_REF_NAME:-${GITHUB_REF_NAME:-}}"
if [ -z "$ref_name" ] && [ -n "$git_ref" ]; then
ref_name="${git_ref##*/}"
fi
event_name="${GITEA_EVENT_NAME:-${GITHUB_EVENT_NAME:-}}"
sha="${GITEA_SHA:-${GITHUB_SHA:-}}"
if [ -z "$sha" ]; then
sha="$(git rev-parse HEAD)"
fi
if [ "$ref_name" = "${DEFAULT_BRANCH:-main}" ] && [ "$event_name" != "pull_request" ]; then
echo "allow_push=true" >> "$GITHUB_OUTPUT"
@@ -37,6 +49,27 @@ jobs:
echo "event_name=$event_name" >> "$GITHUB_OUTPUT"
echo "sha=$sha" >> "$GITHUB_OUTPUT"
- name: Validate registry configuration
shell: bash
run: |
set -euo pipefail
if [ -z "${REGISTRY_URL}" ]; then
echo "::error::REGISTRY_URL secret not configured. Configure it with your Gitea container registry host." >&2
exit 1
fi
server_url="${GITEA_SERVER_URL:-${GITHUB_SERVER_URL:-}}"
server_host="${server_url#http://}"
server_host="${server_host#https://}"
server_host="${server_host%%/*}"
server_host="${server_host%%:*}"
registry_host="${REGISTRY_URL#http://}"
registry_host="${registry_host#https://}"
registry_host="${registry_host%%/*}"
registry_host="${registry_host%%:*}"
if [ -n "${server_host}" ] && ! printf '%s' "${registry_host}" | grep -qi "${server_host}"; then
echo "::warning::REGISTRY_URL (${REGISTRY_URL}) does not match current Gitea host (${server_host}). Ensure this registry endpoint is managed by Gitea." >&2
fi
- name: Set up QEMU and Buildx
uses: docker/setup-buildx-action@v3
@@ -83,7 +116,7 @@ jobs:
deploy:
needs: build
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
if: needs.build.outputs.allow_push == 'true'
runs-on: ubuntu-latest
env:
REGISTRY_URL: ${{ secrets.REGISTRY_URL }}
@@ -95,22 +128,29 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Capture commit metadata
id: commit_meta
run: |
set -euo pipefail
message="$(git log -1 --pretty=%B | tr '\n' ' ')"
echo "message=$message" >> "$GITHUB_OUTPUT"
- name: Set up kubectl for staging
if: github.event.head_commit && contains(github.event.head_commit.message, '[deploy staging]')
if: contains(steps.commit_meta.outputs.message, '[deploy staging]')
uses: azure/k8s-set-context@v3
with:
method: kubeconfig
kubeconfig: ${{ env.STAGING_KUBE_CONFIG }}
- name: Set up kubectl for production
if: github.event.head_commit && contains(github.event.head_commit.message, '[deploy production]')
if: contains(steps.commit_meta.outputs.message, '[deploy production]')
uses: azure/k8s-set-context@v3
with:
method: kubeconfig
kubeconfig: ${{ env.PROD_KUBE_CONFIG }}
- name: Deploy to staging
if: github.event.head_commit && contains(github.event.head_commit.message, '[deploy staging]')
if: contains(steps.commit_meta.outputs.message, '[deploy staging]')
run: |
kubectl set image deployment/calminer-app calminer=${REGISTRY_URL}/allucanget/${REGISTRY_CONTAINER_NAME}:latest
kubectl apply -f k8s/configmap.yaml
@@ -118,7 +158,7 @@ jobs:
kubectl rollout status deployment/calminer-app
- name: Collect staging deployment logs
if: github.event.head_commit && contains(github.event.head_commit.message, '[deploy staging]')
if: contains(steps.commit_meta.outputs.message, '[deploy staging]')
run: |
mkdir -p logs/deployment/staging
kubectl get pods -o wide > logs/deployment/staging/pods.txt
@@ -126,7 +166,7 @@ jobs:
kubectl logs deployment/calminer-app --all-containers=true --tail=500 > logs/deployment/staging/calminer-app.log
- name: Deploy to production
if: github.event.head_commit && contains(github.event.head_commit.message, '[deploy production]')
if: contains(steps.commit_meta.outputs.message, '[deploy production]')
run: |
kubectl set image deployment/calminer-app calminer=${REGISTRY_URL}/allucanget/${REGISTRY_CONTAINER_NAME}:latest
kubectl apply -f k8s/configmap.yaml
@@ -134,7 +174,7 @@ jobs:
kubectl rollout status deployment/calminer-app
- name: Collect production deployment logs
if: github.event.head_commit && contains(github.event.head_commit.message, '[deploy production]')
if: contains(steps.commit_meta.outputs.message, '[deploy production]')
run: |
mkdir -p logs/deployment/production
kubectl get pods -o wide > logs/deployment/production/pods.txt