-
#!/usr/bin/env bash
-
set -euo pipefail
-
-
#
-
# POC: testaa display_title-matchingia dispatchatuille workflow runeille.
-
#
-
# Ajaa kaksi testiä:
-
# A — dispatchaa gitea-ci-library:n poc-dispatch.yml (tämä repo, feature-haara)
-
# B — dispatchaa gitea-ci-gitops-tests:n gitops-service.yaml
-
#
-
# Käyttö:
-
# export GITEA_API_URL=https://gitea.app.keskikuja.site
-
# export GITEA_TOKEN=...
-
# bash scripts/poc-dispatch-match.sh
-
#
-
-
GITEA_API_URL="${GITEA_API_URL:?GITEA_API_URL is required}"
-
GITEA_TOKEN="${GITEA_TOKEN:?GITEA_TOKEN is required}"
-
BRANCH="${BRANCH:-feature/gitops}"
-
TIMEOUT_SECONDS="${TIMEOUT_SECONDS:-60}"
-
POLL_INTERVAL="${POLL_INTERVAL:-5}"
-
GITOPS_REPO="${GITOPS_REPO:-niko/gitea-ci-gitops-tests}"
-
GITOPS_WORKFLOW="${GITOPS_WORKFLOW:-gitops-service.yaml}"
-
LIB_REPO="${LIB_REPO:-niko/gitea-ci-library}"
-
LIB_WORKFLOW="${LIB_WORKFLOW:-poc-dispatch.yml}"
-
-
PASS=0
-
FAIL=0
-
-
_ts() {
-
date -u +%Y-%m-%dT%H:%M:%SZ
-
}
-
-
_report() {
-
local label="$1" status="$2" detail="$3"
-
if [ "$status" = "PASS" ]; then
-
PASS=$((PASS + 1))
-
echo " ✅ $label: $detail"
-
else
-
FAIL=$((FAIL + 1))
-
echo " ❌ $label: $detail"
-
fi
-
}
-
-
_dispatch_and_poll() {
-
local label="$1" target_repo="$2" workflow_file="$3" ref="$4" dispatch_id="$5"
-
local inputs_json="$6"
-
-
echo ""
-
echo "=== Test: $label ==="
-
echo " target: $target_repo"
-
echo " workflow: $workflow_file"
-
echo " ref: $ref"
-
echo " dispatch_id: $dispatch_id"
-
-
# 1. Ennen dispatchia: ota snapshot viimeisimmästä run_number:sta
-
local before_resp before_run before_count
-
before_resp=$(curl -s --connect-timeout 5 --max-time 10 \
-
"$GITEA_API_URL/api/v1/repos/$target_repo/actions/runs?event=workflow_dispatch&limit=1" \
-
-H "Authorization: token $GITEA_TOKEN")
-
-
before_run=$(echo "$before_resp" | jq -r '.workflow_runs[0].run_number // 0')
-
before_count=$(echo "$before_resp" | jq -r '.total_count // 0')
-
echo " before: $before_count runs, latest run_number=$before_run"
-
-
# 2. Dispatch
-
local dispatch_url="$GITEA_API_URL/api/v1/repos/$target_repo/actions/workflows/$workflow_file/dispatches"
-
local dispatch_body
-
dispatch_body=$(jq -nc --arg ref "$ref" --argjson inputs "$inputs_json" '{ref: $ref, inputs: $inputs}')
-
-
local dispatch_code
-
dispatch_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 \
-
-X POST "$dispatch_url" \
-
-H "Authorization: token $GITEA_TOKEN" \
-
-H "Content-Type: application/json" \
-
-d "$dispatch_body")
-
-
if [ "$dispatch_code" != "201" ] && [ "$dispatch_code" != "204" ]; then
-
_report "$label" "FAIL" "Dispatch failed with HTTP $dispatch_code"
-
return
-
fi
-
echo " dispatch: HTTP $dispatch_code — started"
-
-
# 3. Pollaa: etsi run jossa display_title sisältää dispatch_id:n
-
local start_time elapsed found=""
-
start_time=$(date +%s)
-
-
while true; do
-
elapsed=$(( $(date +%s) - start_time ))
-
if [ "$elapsed" -ge "$TIMEOUT_SECONDS" ]; then
-
break
-
fi
-
-
local runs_resp found_id found_display found_status found_run_num
-
runs_resp=$(curl -s --connect-timeout 5 --max-time 10 \
-
"$GITEA_API_URL/api/v1/repos/$target_repo/actions/runs?event=workflow_dispatch&limit=20" \
-
-H "Authorization: token $GITEA_TOKEN")
-
-
found_id=$(echo "$runs_resp" | jq -r --arg id "$dispatch_id" \
-
'[.workflow_runs[] | select(.display_title | contains($id))] | .[0].id // empty')
-
-
if [ -n "$found_id" ] && [ "$found_id" != "null" ]; then
-
found_display=$(echo "$runs_resp" | jq -r --arg id "$dispatch_id" \
-
'[.workflow_runs[] | select(.display_title | contains($id))] | .[0].display_title // "?"')
-
found_status=$(echo "$runs_resp" | jq -r --arg id "$dispatch_id" \
-
'[.workflow_runs[] | select(.display_title | contains($id))] | .[0].status // "?"')
-
found_run_num=$(echo "$runs_resp" | jq -r --arg id "$dispatch_id" \
-
'[.workflow_runs[] | select(.display_title | contains($id))] | .[0].run_number // "?"')
-
-
echo " found: id=$found_id run_number=$found_run_num status=$found_status display_title=\"$found_display\" (after ${elapsed}s)"
-
-
# Odota että run on completed
-
local poll_url="$GITEA_API_URL/api/v1/repos/$target_repo/actions/runs/$found_id"
-
while [ "$elapsed" -lt "$TIMEOUT_SECONDS" ]; do
-
local run_resp run_status run_conclusion
-
run_resp=$(curl -s --connect-timeout 5 --max-time 10 \
-
"$poll_url" -H "Authorization: token $GITEA_TOKEN")
-
run_status=$(echo "$run_resp" | jq -r '.status // "unknown"')
-
-
if [ "$run_status" = "completed" ]; then
-
run_conclusion=$(echo "$run_resp" | jq -r '.conclusion // "?"')
-
elapsed=$(( $(date +%s) - start_time ))
-
_report "$label" "PASS" "display_title matched, status=$run_status conclusion=$run_conclusion run_number=$found_run_num (${elapsed}s)"
-
echo " run detail: id=$found_id display_title=\"$found_display\""
-
echo " endpoint: $GITEA_API_URL/$target_repo/actions/runs/$found_id"
-
return
-
fi
-
-
sleep "$POLL_INTERVAL"
-
elapsed=$(( $(date +%s) - start_time ))
-
done
-
-
_report "$label" "FAIL" "Run found but didn't complete within ${TIMEOUT_SECONDS}s"
-
return
-
fi
-
-
sleep "$POLL_INTERVAL"
-
done
-
-
_report "$label" "FAIL" "No run with display_title containing \"$dispatch_id\" found within ${TIMEOUT_SECONDS}s"
-
}
-
-
# Tallenna aloitusaika
-
POC_START=$(_ts)
-
echo "=============================================="
-
echo "POC: dispatch-workflow display_title matching"
-
echo "Started: $POC_START"
-
echo "API URL: $GITEA_API_URL"
-
echo "=============================================="
-
-
# Testi A: dispatchaa tämän repon poc-dispatch.yml
-
DISPATCH_ID_A=$(xxd -l 4 -p /dev/urandom 2>/dev/null || openssl rand -hex 4 2>/dev/null || date +%s | md5sum | head -c 8)
-
INPUTS_A=$(jq -nc \
-
--arg dispatch_id "$DISPATCH_ID_A" \
-
--arg type "local" \
-
'{dispatch_id: $dispatch_id, type: $type}')
-
-
_dispatch_and_poll \
-
"A: local poc-dispatch" \
-
"$LIB_REPO" "$LIB_WORKFLOW" "$BRANCH" \
-
"$DISPATCH_ID_A" "$INPUTS_A"
-
-
# Testi B: dispatchaa gitea-ci-gitops-tests gitops-service.yaml
-
DISPATCH_ID_B=$(xxd -l 4 -p /dev/urandom 2>/dev/null || openssl rand -hex 4 2>/dev/null || date +%s | md5sum | head -c 8)
-
INPUTS_B=$(jq -nc \
-
--arg dispatch_id "$DISPATCH_ID_B" \
-
--arg file "dev/Chart.yaml" \
-
--arg yq_tpl '.version = "{{VERSION}}"' \
-
--arg version "0.1.1" \
-
--arg source_repo "$LIB_REPO" \
-
--arg source_commit "poc-test-$(date +%s)" \
-
'{dispatch_id: $dispatch_id, file: $file, yq_tpl: $yq_tpl, version: $version, source_repo: $source_repo, source_commit: $source_commit}')
-
-
_dispatch_and_poll \
-
"B: gitops test" \
-
"$GITOPS_REPO" "$GITOPS_WORKFLOW" "main" \
-
"$DISPATCH_ID_B" "$INPUTS_B"
-
-
# Loppuraportti
-
echo ""
-
echo "=============================================="
-
echo "POC complete"
-
echo " PASS: $PASS"
-
echo " FAIL: $FAIL"
-
echo "=============================================="
-
-
if [ "$FAIL" -gt 0 ]; then
-
exit 1
-
fi