ci: deploy prebuilt images through dokploy api
This commit is contained in:
@@ -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}"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user