Add Gitea Actions CI/CD pipeline
Deploy / check (push) Successful in 9m45s
Deploy / build (push) Failing after 4s
Deploy / deploy (push) Has been skipped

Build and push images to the private registry, then deploy to the VPS by commit SHA with health check and rollback.
This commit is contained in:
2026-08-20 15:16:37 +02:00
parent 541e5c26c1
commit 4eef81fdfc
12 changed files with 4650 additions and 87 deletions
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env bash
# Runs on the deploy VPS as the `deploy` user (member of the docker group).
# Shipped here by CI alongside docker-compose.yaml.
#
# IMAGE_TAG=<sha> /home/deploy/websites/ksan.dev/deploy.sh
#
# On success the tag is recorded in .tag.good, which rollback.sh reads.
set -euo pipefail
SITE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SITE_DIR"
: "${IMAGE_TAG:?IMAGE_TAG must be set}"
if [[ ! "$IMAGE_TAG" =~ ^[0-9a-f]{7,40}$ ]]; then
echo "deploy: refusing to deploy non-sha tag '$IMAGE_TAG'" >&2
exit 1
fi
export IMAGE_TAG
echo "deploy: pulling $IMAGE_TAG"
docker compose pull --quiet
echo "deploy: starting"
# --wait blocks on the healthcheck, so a container that boots and immediately
# dies fails here rather than being reported as a successful deploy.
if ! docker compose up -d --remove-orphans --wait --wait-timeout 120; then
echo "deploy: container did not become healthy" >&2
docker compose logs --tail 50 >&2 || true
exit 1
fi
echo "$IMAGE_TAG" > .tag.good
echo "deploy: $IMAGE_TAG is live"
# Old images accumulate fast on a multi-site box; keep a week for rollbacks.
docker image prune -f --filter until=168h >/dev/null 2>&1 || true