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

@@ -30,6 +30,10 @@ env:
DOKPLOY_DEV_WEB_WEBHOOK_URL: "https://deploy.dev.nii-ecos.ru/api/deploy/_EjfuYBpzGJ18uPwBZ3iF"
DOKPLOY_DEV_WORKER_WEBHOOK_URL: "https://deploy.dev.nii-ecos.ru/api/deploy/hltL7K2HmG1a8EIzr-mVA"
DOKPLOY_DEV_BEAT_WEBHOOK_URL: "https://deploy.dev.nii-ecos.ru/api/deploy/RkdykbqU6faErrZBAN9Rv"
DOKPLOY_API_URL: "https://deploy.dev.nii-ecos.ru/api"
DOKPLOY_DEV_WEB_APP_NAME: "service-backend-4mbxrs"
DOKPLOY_DEV_WORKER_APP_NAME: "service-backend-512y9c"
DOKPLOY_DEV_BEAT_APP_NAME: "service-backend-nvdyoq"
UV_VERSION: "0.7.2"
PIP_DISABLE_PIP_VERSION_CHECK: "1"
@@ -380,9 +384,20 @@ jobs:
if: needs.build_push.result == 'success'
steps:
- name: Trigger dev Dokploy webhooks
- name: Checkout code
run: |
set -euo pipefail
REPO_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git"
BRANCH="${GITHUB_HEAD_REF:-${GITHUB_REF_NAME}}"
git -c core.hooksPath=/dev/null clone --depth=1 --branch="${BRANCH}" "${REPO_URL}" .
git -c core.hooksPath=/dev/null checkout "${GITHUB_SHA}"
- name: Deploy prebuilt images in Dokploy
env:
DOKPLOY_API_TOKEN: ${{ secrets.DOKPLOY_API_TOKEN }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_TOKEN }}
HEAD_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
run: |
set -euo pipefail
@@ -399,100 +414,4 @@ jobs:
;;
esac
call_webhook() {
service_name="$1"
webhook_url="$2"
target="$3"
AUTH_HEADER=()
if [ -n "${DOKPLOY_API_TOKEN:-}" ]; then
AUTH_HEADER=(-H "Authorization: Bearer ${DOKPLOY_API_TOKEN}")
fi
PAYLOAD=$(CURRENT_DOKPLOY_TARGET="${target}" 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']}/{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']}/{os.environ['WEB_IMAGE']}:{image_tag}",
"worker": celery_image,
"beat": celery_image,
},
}
print(json.dumps(payload, ensure_ascii=True, separators=(",", ":")))
PY
)
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
exit 1
fi
}
call_webhook "dev web" "${DOKPLOY_DEV_WEB_WEBHOOK_URL}" "web"
call_webhook "dev worker" "${DOKPLOY_DEV_WORKER_WEBHOOK_URL}" "worker"
call_webhook "dev beat" "${DOKPLOY_DEV_BEAT_WEBHOOK_URL}" "beat"
{
echo "Dokploy dev deploy triggered."
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"
} >> "${GITHUB_STEP_SUMMARY:-/dev/stdout}"
bash scripts/ci/dokploy_deploy_image.sh all