diff --git a/.gitea/workflows/gitops-dispatch.yml b/.gitea/workflows/gitops-dispatch.yml index 38bbdea..aeadab7 100644 --- a/.gitea/workflows/gitops-dispatch.yml +++ b/.gitea/workflows/gitops-dispatch.yml @@ -35,24 +35,115 @@ env: GITEA_API_URL: ${{ fromJson(inputs.env_json).GITEA_API_URL }} GITOPS_TAG_PREFIX: ${{ fromJson(inputs.env_json).GIT_TAG_PREFIX || '' }} GITOPS_WORKFLOW: gitops-service.yaml + GITOPS_DISPATCH_TIMEOUT: 30 jobs: dispatch: runs-on: ubuntu-latest outputs: - summary: ${{ steps.run.outputs.GITOPS_SUMMARY }} + summary: ${{ steps.summary.outputs.GITOPS_SUMMARY }} steps: - - uses: actions/checkout@v4 - - uses: actions/checkout@v4 - with: - repository: niko/gitea-ci-library - path: .ci - - name: Run gitops dispatch - id: run + - name: Generate dispatch_id + id: gen + run: | + ID=$(date +%s | md5sum | head -c 8) + echo "dispatch_id=$ID" >> "$GITHUB_OUTPUT" + + - name: Dispatch to GitOps repo env: GITEA_TOKEN: ${{ secrets.GITOPS_DISPATCH_TOKEN }} run: | - OUTPUT=$(bash .ci/scripts/gitops-dispatch.sh) - echo "$OUTPUT" - SUMMARY=$(awk -F= '/^GITOPS_SUMMARY=/ {print $2}' <<<"$OUTPUT") - echo "GITOPS_SUMMARY=$SUMMARY" >> "$GITHUB_OUTPUT" + INPUTS=$(jq -nc \ + --arg dispatch_id "${{ steps.gen.outputs.dispatch_id }}" \ + --arg file "$GITOPS_FILE" \ + --arg yq_tpl "$GITOPS_YQ_TPL" \ + --arg version "$GITOPS_VERSION" \ + --arg source_repo "$GITOPS_SOURCE_REPO" \ + --arg source_commit "$GITOPS_SOURCE_COMMIT" \ + --arg git_tag_prefix "${GITOPS_TAG_PREFIX:-}" \ + '{dispatch_id: $dispatch_id, file: $file, yq_tpl: $yq_tpl, version: $version, source_repo: $source_repo, source_commit: $source_commit, git_tag_prefix: $git_tag_prefix}') + curl -s -X POST \ + "${GITEA_API_URL}/api/v1/repos/${GITOPS_REPO}/actions/workflows/${GITOPS_WORKFLOW}/dispatches" \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$(jq -nc --arg ref "main" --argjson inputs "$INPUTS" '{ref: "main", inputs: $inputs}')" + + - name: Poll for completion + id: poll + env: + GITEA_TOKEN: ${{ secrets.GITOPS_DISPATCH_TOKEN }} + run: | + ID="${{ steps.gen.outputs.dispatch_id }}" + TIMEOUT_MINUTES="${GITOPS_DISPATCH_TIMEOUT:-30}" + POLL_INTERVAL=10 + START_TIME=$(date +%s) + TIMEOUT_SECONDS=$((TIMEOUT_MINUTES * 60)) + + echo "Polling for run with dispatch_id=$ID" + + while [ -z "$RUN_ID" ]; do + NOW=$(date +%s) + ELAPSED=$((NOW - START_TIME)) + if [ "$ELAPSED" -ge "$TIMEOUT_SECONDS" ]; then + echo "ERROR: Timeout waiting for run to appear" >&2 + exit 124 + fi + + RUNS_RESP=$(curl -s --connect-timeout 5 --max-time 10 \ + "${GITEA_API_URL}/api/v1/repos/${GITOPS_REPO}/actions/runs?event=workflow_dispatch&limit=10" \ + -H "Authorization: token $GITEA_TOKEN") + RUN_ID=$(echo "$RUNS_RESP" | jq -r --arg id "$ID" \ + '[.workflow_runs[] | select(.display_title | contains($id))] | .[0].id // empty') + + [ -z "$RUN_ID" ] && sleep "$POLL_INTERVAL" + done + + echo "Run found: id=$RUN_ID" + + while true; do + NOW=$(date +%s) + ELAPSED=$((NOW - START_TIME)) + if [ "$ELAPSED" -ge "$TIMEOUT_SECONDS" ]; then + echo "ERROR: Timeout waiting for completion" >&2 + exit 124 + fi + + RUN_RESP=$(curl -s --connect-timeout 5 --max-time 10 \ + "${GITEA_API_URL}/api/v1/repos/${GITOPS_REPO}/actions/runs/${RUN_ID}" \ + -H "Authorization: token $GITEA_TOKEN") + STATUS=$(echo "$RUN_RESP" | jq -r '.status // "running"') + CONCLUSION=$(echo "$RUN_RESP" | jq -r '.conclusion // ""') + + echo " status=$STATUS conclusion=$CONCLUSION" + + if [ "$STATUS" = "completed" ]; then + if [ "$CONCLUSION" = "success" ]; then + echo "GitOps workflow completed successfully" + BRANCH_RESP=$(curl -s --connect-timeout 5 --max-time 10 \ + "${GITEA_API_URL}/api/v1/repos/${GITOPS_REPO}/branches/main" \ + -H "Authorization: token $GITEA_TOKEN") || true + GITOPS_COMMIT=$(echo "$BRANCH_RESP" | jq -r '.commit.id // empty') + echo "GITOPS_COMMIT=$GITOPS_COMMIT" >> "$GITHUB_OUTPUT" + echo "$GITOPS_COMMIT" > /tmp/gitops-commit + exit 0 + else + echo "ERROR: GitOps workflow failed with conclusion=$CONCLUSION" >&2 + exit 1 + fi + fi + + sleep "$POLL_INTERVAL" + done + + - name: GitOps summary + id: summary + if: always() + run: | + STATUS="failure" + GITOPS_SHA="" + if [ -f /tmp/gitops-commit ]; then + STATUS="success" + GITOPS_SHA=$(cat /tmp/gitops-commit) + fi + COMPONENT="${GITOPS_TAG_PREFIX:-${GITOPS_FILE}}" + echo "GITOPS_SUMMARY=${COMPONENT}|${GITOPS_VERSION}|${STATUS}|${GITOPS_SHA}|${GITOPS_REPO}" >> "$GITHUB_OUTPUT"