1818 GCP_PROJECT_ID : firstradequant
1919 GCP_WORKLOAD_IDENTITY_PROVIDER : projects/1088907247379/locations/global/workloadIdentityPools/github-actions/providers/github-main
2020 GCP_WORKLOAD_IDENTITY_SERVICE_ACCOUNT : firstrade-platform-deploy@firstradequant.iam.gserviceaccount.com
21+ GCP_SCHEDULER_SERVICE_ACCOUNT : firstrade-platform-scheduler@firstradequant.iam.gserviceaccount.com
2122
2223concurrency :
2324 group : ${{ github.workflow }}-${{ github.ref_name }}
@@ -123,6 +124,45 @@ jobs:
123124 scheduler_job=""
124125 scheduler_location=""
125126 scheduler_expected_path=""
127+ ensure_invoke_bridge_job() {
128+ local bridge_job="$1"
129+ local bridge_uri="$2"
130+ local bridge_location="$3"
131+ if gcloud scheduler jobs describe "${bridge_job}" \
132+ --project="${GCP_PROJECT_ID}" \
133+ --location="${bridge_location}" >/dev/null 2>&1; then
134+ current_uri="$(
135+ gcloud scheduler jobs describe "${bridge_job}" \
136+ --project="${GCP_PROJECT_ID}" \
137+ --location="${bridge_location}" \
138+ --format='value(httpTarget.uri)' 2>/dev/null || true
139+ )"
140+ if [ -n "${current_uri}" ] && [ "${current_uri}" != "${bridge_uri}" ]; then
141+ echo "Updating invoke-bridge Cloud Scheduler job ${bridge_job} to ${bridge_uri}."
142+ gcloud scheduler jobs update http "${bridge_job}" \
143+ --project="${GCP_PROJECT_ID}" \
144+ --location="${bridge_location}" \
145+ --uri="${bridge_uri}" \
146+ --http-method=POST \
147+ --oidc-service-account-email="${GCP_SCHEDULER_SERVICE_ACCOUNT}" \
148+ --oidc-token-audience="${service_url}" \
149+ --quiet
150+ fi
151+ return 0
152+ fi
153+ echo "Creating invoke-bridge Cloud Scheduler job ${bridge_job} -> ${bridge_uri}."
154+ gcloud scheduler jobs create http "${bridge_job}" \
155+ --project="${GCP_PROJECT_ID}" \
156+ --location="${bridge_location}" \
157+ --uri="${bridge_uri}" \
158+ --http-method=POST \
159+ --oidc-service-account-email="${GCP_SCHEDULER_SERVICE_ACCOUNT}" \
160+ --oidc-token-audience="${service_url}" \
161+ --schedule="0 0 1 1 *" \
162+ --time-zone="UTC" \
163+ --attempt-deadline=600s \
164+ --quiet
165+ }
126166 if [ "${service_ingress}" = "internal" ]; then
127167 scheduler_location="${CLOUD_SCHEDULER_LOCATION:-${CLOUD_RUN_REGION}}"
128168 case "${raw_path}" in
@@ -133,10 +173,12 @@ jobs:
133173 /probe)
134174 scheduler_job="${CLOUD_RUN_SERVICE}-probe-scheduler"
135175 scheduler_expected_path="/probe"
176+ ensure_invoke_bridge_job "${scheduler_job}" "${service_url}/probe" "${scheduler_location}"
136177 ;;
137178 /dry-run)
138179 scheduler_job="${CLOUD_RUN_SERVICE}-precheck-scheduler"
139180 scheduler_expected_path="/dry-run"
181+ ensure_invoke_bridge_job "${scheduler_job}" "${service_url}/dry-run" "${scheduler_location}"
140182 ;;
141183 *)
142184 echo "Cloud Run service ${CLOUD_RUN_SERVICE} has internal ingress, so GitHub-hosted runners cannot curl ${raw_path} directly." >&2
@@ -147,6 +189,7 @@ jobs:
147189
148190 scheduler_uri="$(
149191 gcloud scheduler jobs describe "${scheduler_job}" \
192+ --project="${GCP_PROJECT_ID}" \
150193 --location="${scheduler_location}" \
151194 --format='value(httpTarget.uri)' 2>/dev/null || true
152195 )"
0 commit comments