poc
POC GitOps Dispatch / echo (push) Successful in 13s
CI Feature / Load example-gitea-env.conf to pipeline env (push) Successful in 33s
unit-tests Bats test report
CI Feature / Bats tests (push) Successful in 1m34s
acc-tests Cucumber test report
CI Feature / Cucumber tests (push) Successful in 1m48s
CI Feature / Report Summary (push) Successful in 5s

This commit is contained in:
moilanik
2026-06-22 04:17:07 +03:00
parent 1385afcca6
commit 9105675591
2 changed files with 209 additions and 0 deletions
+189
View File
@@ -0,0 +1,189 @@
#!/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