Pipeline - AI #1098
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Pipeline - AI | |
| on: | |
| workflow_run: | |
| workflows: ["PNCP discovery"] | |
| types: [completed] | |
| schedule: | |
| - cron: '15 * * * *' | |
| workflow_dispatch: | |
| concurrency: | |
| group: pipeline-trigger | |
| cancel-in-progress: false | |
| jobs: | |
| trigger: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| if: > | |
| github.event_name != 'workflow_run' || | |
| github.event.workflow_run.conclusion == 'success' | |
| env: | |
| RENDER_APP_URL: ${{ secrets.RENDER_APP_URL }} | |
| PIPELINE_SECRET: ${{ secrets.PIPELINE_SECRET }} | |
| PIPELINE_STEP: ai | |
| CURL_MAX_TIME_SECONDS: "600" | |
| AI_EDITAIS_PER_DAY: "20" | |
| AI_EDITAIS_PER_MINUTE: "3" | |
| PACIFIC_WINDOW_START: "8" | |
| PACIFIC_WINDOW_END: "19" | |
| steps: | |
| - name: Check Pacific daytime window and trigger | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| PACIFIC_HOUR_RAW="$(TZ=America/Los_Angeles date +%H)" | |
| PACIFIC_HOUR=$((10#$PACIFIC_HOUR_RAW)) | |
| PACIFIC_TIME="$(TZ=America/Los_Angeles date '+%H:%M %Z')" | |
| echo "Pacific local time: ${PACIFIC_TIME}" | |
| echo "Permitted window: ${PACIFIC_WINDOW_START}:00 – ${PACIFIC_WINDOW_END}:59 America/Los_Angeles" | |
| echo "Mirrored backend limits: AI_EDITAIS_PER_DAY=${AI_EDITAIS_PER_DAY}, AI_EDITAIS_PER_MINUTE=${AI_EDITAIS_PER_MINUTE}" | |
| if [ "$PACIFIC_HOUR" -lt "$PACIFIC_WINDOW_START" ] || [ "$PACIFIC_HOUR" -gt "$PACIFIC_WINDOW_END" ]; then | |
| echo "Outside daytime Pacific processing window — skipping Render trigger." | |
| exit 0 | |
| fi | |
| echo "Inside daytime Pacific window — proceeding to trigger Render." | |
| URL="${RENDER_APP_URL}/api/pipeline/${PIPELINE_STEP}" | |
| MAX_ATTEMPTS=4 | |
| SLEEP_SECONDS=120 | |
| echo "Initiating AI trigger at Pacific time: ${PACIFIC_TIME}" | |
| echo "Endpoint: POST ${URL}" | |
| for attempt in $(seq 1 "$MAX_ATTEMPTS"); do | |
| echo "Attempt ${attempt}/${MAX_ATTEMPTS}: POST ${URL}" | |
| http_code=$(curl -sS -o response.json -w "%{http_code}" \ | |
| -X POST \ | |
| -H "Authorization: Bearer ${PIPELINE_SECRET}" \ | |
| --connect-timeout 30 \ | |
| --max-time "${CURL_MAX_TIME_SECONDS}" \ | |
| "$URL" || echo "000") | |
| echo "HTTP ${http_code}" | |
| cat response.json || true | |
| echo | |
| if [ "$http_code" = "200" ] || [ "$http_code" = "202" ]; then | |
| echo "Outcome: operational success (HTTP ${http_code})" | |
| exit 0 | |
| fi | |
| if [ "$http_code" = "401" ] || [ "$http_code" = "403" ] || [ "$http_code" = "404" ]; then | |
| echo "Non-retryable status ${http_code}" | |
| exit 1 | |
| fi | |
| if [ "$attempt" = "$MAX_ATTEMPTS" ]; then | |
| echo "Exhausted retries after ${MAX_ATTEMPTS} attempts" | |
| exit 1 | |
| fi | |
| echo "Retrying in ${SLEEP_SECONDS}s…" | |
| sleep "$SLEEP_SECONDS" | |
| done |