ci: deploy prebuilt images through dokploy api
Some checks failed
CI/CD Pipeline / Quality Gate (push) Successful in 19s
CI/CD Pipeline / Build and Push Images (push) Successful in 6s
CI/CD Pipeline / Internal Notify (push) Successful in 1s
CI/CD Pipeline / Deploy Dev in Dokploy (push) Failing after 1s

This commit is contained in:
2026-04-28 23:29:37 +02:00
parent 738682e496
commit 9fefc26d2b
4 changed files with 307 additions and 228 deletions

View File

@@ -21,7 +21,7 @@ write_usage() {
echo "- cleanup_confirm=CLEAN_DEV_DB"
echo "This drops and recreates the dev database, then triggers Dokploy web/worker/beat."
echo "For base image refresh run with manual_action=build_golden_images."
echo "For Dokploy start run with manual_action=dokploy_start and dokploy_target=all|web|worker|beat."
echo "For Dokploy image deploy run with manual_action=dokploy_start and dokploy_target=all|web|worker|beat."
} >>"${SUMMARY_FILE}"
}
@@ -100,109 +100,15 @@ build_golden_images() {
} >>"${SUMMARY_FILE}"
}
dokploy_payload() {
CURRENT_DOKPLOY_TARGET="$1" python3 - <<'PY'
import json
import os
repository = os.environ.get("GITHUB_REPOSITORY", "")
repository_name = repository.rsplit("/", 1)[-1]
branch = os.environ.get("GITHUB_REF_NAME") or "dev"
sha = os.environ.get("GITHUB_SHA") or ""
server_url = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/")
repository_url = f"{server_url}/{repository}" if server_url and repository else ""
image_tag = f"{branch.replace('/', '-')}-{sha[:7]}" if branch and sha else branch or "dev"
celery_image = (
f"{os.environ['REGISTRY_HOST']}/{os.environ['REGISTRY_NAMESPACE']}/"
f"{os.environ['CELERY_IMAGE']}:{image_tag}"
)
payload = {
"ref": f"refs/heads/{branch}",
"after": sha,
"checkout_sha": sha,
"repository": {
"name": repository_name,
"full_name": repository,
"html_url": repository_url,
"clone_url": f"{repository_url}.git" if repository_url else "",
},
"sender": {"login": os.environ.get("GITHUB_ACTOR")},
"pusher": {"name": os.environ.get("GITHUB_ACTOR")},
"head_commit": {
"id": sha,
"message": f"CI deploy {os.environ.get('CURRENT_DOKPLOY_TARGET')}",
"url": f"{repository_url}/commit/{sha}" if repository_url and sha else "",
},
"commits": [
{
"id": sha,
"message": f"CI deploy {os.environ.get('CURRENT_DOKPLOY_TARGET')}",
"url": f"{repository_url}/commit/{sha}" if repository_url and sha else "",
}
],
"project": repository,
"branch": branch,
"sha": sha,
"actor": os.environ.get("GITHUB_ACTOR"),
"target": os.environ.get("CURRENT_DOKPLOY_TARGET"),
"image_tag": image_tag,
"images": {
"web": (
f"{os.environ['REGISTRY_HOST']}/{os.environ['REGISTRY_NAMESPACE']}/"
f"{os.environ['WEB_IMAGE']}:{image_tag}"
),
"worker": celery_image,
"beat": celery_image,
},
}
print(json.dumps(payload, ensure_ascii=True, separators=(",", ":")))
PY
}
call_dokploy_webhook() {
local service_name="$1"
local webhook_url="$2"
local target="$3"
local auth_header=()
local payload response
if [ -z "${webhook_url}" ]; then
echo "Dokploy webhook for ${service_name} is not configured" >&2
exit 1
fi
if [ -n "${DOKPLOY_API_TOKEN:-}" ]; then
auth_header=(-H "Authorization: Bearer ${DOKPLOY_API_TOKEN}")
fi
payload="$(dokploy_payload "${target}")"
echo "Trigger Dokploy for ${service_name}"
response="$(curl -fsS \
--connect-timeout 5 \
--max-time 30 \
--retry 2 \
--retry-delay 2 \
-X POST \
-H "Content-Type: application/json" \
-H "X-Gitea-Event: push" \
-H "X-Gogs-Event: push" \
-H "X-GitHub-Event: push" \
"${auth_header[@]}" \
--data "${payload}" \
"${webhook_url}")"
printf '%s\n' "${response}"
if printf '%s' "${response}" | grep -qi "Branch Not Match"; then
echo "Dokploy rejected ${service_name}: branch did not match" >&2
require_dokploy_api_token() {
if [ -z "${DOKPLOY_API_TOKEN:-}" ]; then
echo "DOKPLOY_API_TOKEN is required for Dokploy image deploy" >&2
exit 1
fi
}
trigger_dokploy() {
local target="$1"
local triggered=0
case "${target}" in
all | web | worker | celery | beat) ;;
*)
@@ -211,34 +117,7 @@ trigger_dokploy() {
;;
esac
if [ "${target}" = "all" ] || [ "${target}" = "web" ]; then
call_dokploy_webhook "dev web" "${DOKPLOY_DEV_WEB_WEBHOOK_URL}" "web"
triggered=1
fi
if [ "${target}" = "all" ] || [ "${target}" = "worker" ] || [ "${target}" = "celery" ]; then
call_dokploy_webhook "dev worker" "${DOKPLOY_DEV_WORKER_WEBHOOK_URL}" "worker"
triggered=1
fi
if [ "${target}" = "all" ] || [ "${target}" = "beat" ]; then
call_dokploy_webhook "dev beat" "${DOKPLOY_DEV_BEAT_WEBHOOK_URL}" "beat"
triggered=1
fi
if [ "${triggered}" -ne 1 ]; then
echo "No Dokploy webhook was triggered" >&2
exit 1
fi
{
echo "Dokploy dev trigger completed."
echo "Target: ${target}"
echo "Registry API: ${REGISTRY_API_URL}"
echo "Web image: ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${WEB_IMAGE}:dev"
echo "Worker image: ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${CELERY_IMAGE}:dev"
echo "Beat image: ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${CELERY_IMAGE}:dev"
} >>"${SUMMARY_FILE}"
bash scripts/ci/dokploy_deploy_image.sh "${target}"
}
install_postgres_client() {
@@ -373,18 +252,19 @@ cleanup_dev_database() {
exit 1
fi
require_dokploy_api_token
install_postgres_client
drop_and_recreate_database
call_dokploy_webhook "dev web" "${DOKPLOY_DEV_WEB_WEBHOOK_URL}" "web"
bash scripts/ci/dokploy_deploy_image.sh web
wait_for_migrations
call_dokploy_webhook "dev worker" "${DOKPLOY_DEV_WORKER_WEBHOOK_URL}" "worker"
call_dokploy_webhook "dev beat" "${DOKPLOY_DEV_BEAT_WEBHOOK_URL}" "beat"
bash scripts/ci/dokploy_deploy_image.sh worker
bash scripts/ci/dokploy_deploy_image.sh beat
{
echo "Dev database was dropped and recreated."
echo "Database: ${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
echo "Encoding: UTF8"
echo "Dokploy web/worker/beat deploy was triggered."
echo "Dokploy web/worker/beat image deploy was triggered."
} >>"${SUMMARY_FILE}"
}