From f29a1a1976db0526de13bf39ef7b457d8dc87fde Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 26 Jun 2026 13:43:30 +0000 Subject: [PATCH] fix(ci): handle both old (flat) and new (nested) project.create response formats In Dokploy <= ~v0.24, project.create returns a flat object with just projectId at the top level; no environment concept exists yet, so resources (postgres, mongo, apps) are created with projectId. In Dokploy >= ~v0.25, project.create returns nested {project, environment} objects and resources require environmentId. Previous workflow always used .project.projectId and .environment.environmentId, both of which evaluated to null on old versions, causing curl to exit with code 22 (HTTP error) on every subsequent resource-create call. Fix: extract PROJECT_ID with a // fallback, check ENV_ID nullness, and build a SCOPE fragment (either 'environmentId' or 'projectId') used in all resource-creation tRPC calls. --- .../workflows/upgrade-integration-test.yml | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/.github/workflows/upgrade-integration-test.yml b/.github/workflows/upgrade-integration-test.yml index 4f1b1d3b2..d0e3531e4 100644 --- a/.github/workflows/upgrade-integration-test.yml +++ b/.github/workflows/upgrade-integration-test.yml @@ -210,17 +210,34 @@ jobs: '{"name":"ci-upgrade-test","description":"CI upgrade integration test"}') echo "project.create → $PROJECT" - PROJECT_ID=$(echo "$PROJECT" | jq -r '.result.data.json.project.projectId') - ENV_ID=$(echo "$PROJECT" | jq -r '.result.data.json.environment.environmentId') + # Support both API eras: + # Old (pre-environments, ≤ ~v0.24): project.create returns a flat + # object → .result.data.json.projectId + # New (environments feature, ≥ ~v0.25): returns nested objects + # → .result.data.json.project.projectId + .environment.environmentId + PROJECT_ID=$(echo "$PROJECT" | jq -r \ + '.result.data.json.project.projectId // .result.data.json.projectId') + ENV_ID=$(echo "$PROJECT" | jq -r \ + '.result.data.json.environment.environmentId // empty') echo "project_id=$PROJECT_ID" >> "$GITHUB_OUTPUT" - echo "env_id=$ENV_ID" >> "$GITHUB_OUTPUT" + echo "env_id=${ENV_ID:-none}" >> "$GITHUB_OUTPUT" + echo "Detected PROJECT_ID=$PROJECT_ID ENV_ID=${ENV_ID:-}" + + # Build the JSON scope fragment used in every resource-create call. + # Old API uses projectId; new API uses environmentId. + if [ -n "$ENV_ID" ] && [ "$ENV_ID" != "null" ]; then + SCOPE="\"environmentId\":\"$ENV_ID\"" + else + SCOPE="\"projectId\":\"$PROJECT_ID\"" + fi + echo "Resource scope: $SCOPE" # --- PostgreSQL 15 --- PG=$(trpc_mut postgres.create \ "{\"name\":\"ci-pg\",\"appName\":\"ci-pg-db\",\ \"databaseName\":\"cidb\",\"databaseUser\":\"ciuser\",\ \"databasePassword\":\"CiPg1pass\",\ - \"dockerImage\":\"postgres:15\",\"environmentId\":\"$ENV_ID\"}") + \"dockerImage\":\"postgres:15\",$SCOPE}") PG_ID=$(echo "$PG" | jq -r '.result.data.json.postgresId') trpc_mut postgres.start "{\"postgresId\":\"$PG_ID\"}" > /dev/null echo "pg_id=$PG_ID" >> "$GITHUB_OUTPUT" @@ -230,7 +247,7 @@ jobs: "{\"name\":\"ci-mongo\",\"appName\":\"ci-mongo-db\",\ \"databaseName\":\"cidb\",\"databaseUser\":\"ciuser\",\ \"databasePassword\":\"CiMg1pass\",\ - \"dockerImage\":\"mongo:7.0\",\"environmentId\":\"$ENV_ID\"}") + \"dockerImage\":\"mongo:7.0\",$SCOPE}") MG_ID=$(echo "$MG" | jq -r '.result.data.json.mongoId') trpc_mut mongo.start "{\"mongoId\":\"$MG_ID\"}" > /dev/null echo "mg_id=$MG_ID" >> "$GITHUB_OUTPUT" @@ -239,8 +256,7 @@ jobs: make_app() { local DISP_NAME=$1 APP_NAME=$2 IMAGE=$3 APP=$(trpc_mut application.create \ - "{\"name\":\"$DISP_NAME\",\"appName\":\"$APP_NAME\",\ - \"environmentId\":\"$ENV_ID\"}") + "{\"name\":\"$DISP_NAME\",\"appName\":\"$APP_NAME\",$SCOPE}") APP_ID=$(echo "$APP" | jq -r '.result.data.json.applicationId') trpc_mut application.saveDockerProvider \ "{\"applicationId\":\"$APP_ID\",\"dockerImage\":\"$IMAGE\",\