9105675591
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
190 lines
6.8 KiB
Bash
Executable File
190 lines
6.8 KiB
Bash
Executable File
#!/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
|