loading
Generated 2026-06-21T14:16:32+00:00

All Files ( 71.1% covered at 6.67 hits/line )

8 files in total.
353 relevant lines, 251 lines covered and 102 lines missed. ( 71.1% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
scripts/check-version.sh 100.00 % 60 39 39 0 13.69
scripts/ci-report.sh 0.00 % 110 62 0 62 0.00
scripts/ci-validate.sh 95.24 % 31 21 20 1 9.86
scripts/dispatch-workflow.sh 86.54 % 71 52 45 7 9.60
scripts/gitops-update.sh 87.04 % 88 54 47 7 8.13
scripts/publish-git-pages.sh 78.05 % 117 82 64 18 2.88
scripts/publish.sh 70.00 % 16 10 7 3 3.50
scripts/report-status.sh 87.88 % 47 33 29 4 12.27

scripts/check-version.sh

100.0% lines covered

39 relevant lines. 39 lines covered and 0 lines missed.
    
  1. #!/usr/bin/env bash
  2. 12 set -e
  3. 12 RAW_VERSION=""
  4. 21 if [ -n "${VERSION_FILE-}" ] && [ -f "${VERSION_FILE-}" ]; then
  5. 36 RAW_VERSION=$(tr -d "$(printf '\xef\xbb\xbf')" < "${VERSION_FILE}" | sed -n 's/^version:[[:space:]]*\([^[:space:]]*\).*/\1/p')
  6. 9 if [ -z "${RAW_VERSION}" ]; then
  7. 12 if echo "${VERSION_FILE}" | grep -q -E '\.json$'; then
  8. 2 RAW_VERSION=$(jq -r '.version' "${VERSION_FILE}")
  9. else
  10. 15 RAW_VERSION=$(cat "${VERSION_FILE}" | tr -d '[:space:]')
  11. fi
  12. fi
  13. fi
  14. 12 if [ -z "${RAW_VERSION}" ]; then
  15. 3 if [ -f VERSION ]; then
  16. 3 RAW_VERSION=$(cat VERSION | tr -d '[:space:]')
  17. 2 elif [ -f package.json ]; then
  18. RAW_VERSION=$(jq -r '.version' package.json)
  19. 2 elif [ -f pom.xml ]; then
  20. RAW_VERSION=$(grep -oP '<version>\K[^<]+' pom.xml | head -1)
  21. 2 elif [ -f Chart.yaml ]; then
  22. 4 RAW_VERSION=$(tr -d "$(printf '\xef\xbb\xbf')" < Chart.yaml | sed -n 's/^version:[[:space:]]*\([^[:space:]]*\).*/\1/p')
  23. else
  24. 1 echo "ERROR: No version source found (VERSION_FILE, VERSION, package.json, pom.xml, Chart.yaml)" >&2
  25. 1 exit 1
  26. fi
  27. fi
  28. 33 BASE_VERSION=$(echo "$RAW_VERSION" | cut -d'.' -f1-2)
  29. 11 echo "gitea-ci-library - Tunnistettu Major.Minor versio: $BASE_VERSION"
  30. 22 TAGS_JSON=$(curl -s -f -H "Authorization: token ${GITEA_TOKEN}" \
  31. 22 "${SERVER_URL}/api/v1/repos/${REPO}/tags")
  32. 33 TAG=$(echo "$TAGS_JSON" | jq -r --arg prefix "${GIT_TAG_PREFIX-}" --arg sha "${SHA}" '
  33. 33 if type == "array" then
  34. 33 .[] | select(.commit.sha == $sha and (.name | startswith($prefix))) | .name
  35. 33 else empty end' | head -1)
  36. 11 mkdir -p /tmp/build-ctx
  37. 11
  38. 11 if [ -n "$TAG" ]; then
  39. 2 echo "ARTIFACT_EXISTS=true" > /tmp/build-ctx/build.env
  40. 2 echo "NEXT_VERSION=$TAG" >> /tmp/build-ctx/build.env
  41. 2 echo "gitea-ci-library - Artefakti löytyi jo tagilla: $TAG."
  42. else
  43. 9 echo "ARTIFACT_EXISTS=false" > /tmp/build-ctx/build.env
  44. 27 HIGHEST_PATCH=$(echo "$TAGS_JSON" | jq -r --arg prefix "${GIT_TAG_PREFIX-}" --arg bv "${GIT_TAG_PREFIX-}${BASE_VERSION}." '
  45. 27 if type == "array" then .[] | .name | select(startswith($bv)) | sub($bv; "") | tonumber else empty end' | sort -rn | head -1)
  46. 18
  47. 18 if [ -z "$HIGHEST_PATCH" ]; then NEXT_PATCH=0; else NEXT_PATCH=$((HIGHEST_PATCH + 1)); fi
  48. 9 FULL_VERSION="${BASE_VERSION}.${NEXT_PATCH}"
  49. 9 echo "NEXT_VERSION=$FULL_VERSION" >> /tmp/build-ctx/build.env
  50. 9 echo "gitea-ci-library - Uusi vapaa versio: $FULL_VERSION"
  51. fi

scripts/ci-report.sh

0.0% lines covered

62 relevant lines. 0 lines covered and 62 lines missed.
    
  1. #!/usr/bin/env sh
  2. set -eu
  3. DESCRIPTION="${1:-}"
  4. CONTEXT="${2:-}"
  5. SUITE="${3:-}"
  6. STATUS="${4:-success}"
  7. [ -n "$DESCRIPTION" ] || { echo "ERROR: description argument required" >&2; exit 1; }
  8. [ -n "$CONTEXT" ] || { echo "ERROR: context argument required" >&2; exit 1; }
  9. [ -n "$SUITE" ] || { echo "ERROR: suite argument required" >&2; exit 1; }
  10. REPORT_DIR="reports/${SUITE}"
  11. if [ ! -d "$REPORT_DIR" ]; then
  12. echo "ERROR: $REPORT_DIR not found" >&2
  13. sh .ci/scripts/report-status.sh failure "$DESCRIPTION" "$CONTEXT"
  14. exit 1
  15. fi
  16. FILE_COUNT=0
  17. SUBDIR_COUNT=0
  18. ENTRIES=""
  19. for f in "$REPORT_DIR"/*; do
  20. [ -f "$f" ] || continue
  21. base=$(basename "$f")
  22. [ "$base" = "index.html" ] && continue
  23. FILE_COUNT=$((FILE_COUNT + 1))
  24. ENTRIES="${ENTRIES}file:${base}
  25. "
  26. done
  27. for d in "$REPORT_DIR"/*/; do
  28. [ -d "$d" ] || continue
  29. base=$(basename "$d")
  30. [ -f "$d/index.html" ] || continue
  31. SUBDIR_COUNT=$((SUBDIR_COUNT + 1))
  32. ENTRIES="${ENTRIES}dir:${base}
  33. "
  34. done
  35. TOTAL=$((FILE_COUNT + SUBDIR_COUNT))
  36. if [ "$TOTAL" -eq 0 ]; then
  37. echo "ERROR: no reportable items in $REPORT_DIR" >&2
  38. sh .ci/scripts/report-status.sh failure "$DESCRIPTION" "$CONTEXT"
  39. exit 1
  40. fi
  41. SHA8=$(echo "${GITHUB_SHA:-xxxxxxxx}" | cut -c1-8)
  42. humanize() {
  43. name="$1"
  44. name=$(echo "$name" | sed -e 's/\.[^.]*$//' -e 's/[-_]/ /g')
  45. first=$(echo "$name" | cut -c1 | tr '[:lower:]' '[:upper:]')
  46. rest=$(echo "$name" | cut -c2-)
  47. echo "${first}${rest}"
  48. }
  49. generate_index() {
  50. {
  51. echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">'
  52. echo "<title>$DESCRIPTION</title>"
  53. echo '<style>body{font-family:sans-serif;margin:2em;max-width:960px}h1{color:#1e293b}ul{list-style:none;padding:0}li{margin:.5em 0;padding:.5em;background:#f8fafc;border-radius:6px}a{color:#2563eb;text-decoration:none}a:hover{text-decoration:underline}</style>'
  54. echo "</head><body><h1>$DESCRIPTION</h1><ul>"
  55. echo "$ENTRIES" | while IFS= read -r entry; do
  56. [ -z "$entry" ] && continue
  57. entry_type=$(echo "$entry" | cut -d: -f1)
  58. entry_name=$(echo "$entry" | cut -d: -f2-)
  59. if [ "$entry_type" = "file" ]; then
  60. echo "<li><a href=\"$entry_name\">$(humanize "$entry_name")</a></li>"
  61. else
  62. cap=$(echo "$entry_name" | sed 's/\(.\).*/\1/' | tr '[:lower:]' '[:upper:]')$(echo "$entry_name" | sed 's/.//')
  63. echo "<li><a href=\"$entry_name/index.html\">${cap}</a></li>"
  64. fi
  65. done
  66. echo '</ul></body></html>'
  67. } > "$REPORT_DIR/index.html"
  68. }
  69. STAGED="reports/${SHA8}/${SUITE}"
  70. mkdir -p "$STAGED"
  71. if [ "$TOTAL" -eq 1 ]; then
  72. cp -a "$REPORT_DIR/." "$STAGED/"
  73. sh .ci/scripts/publish-git-pages.sh "$SUITE"
  74. first_entry=$(echo "$ENTRIES" | head -1)
  75. first_type=$(echo "$first_entry" | cut -d: -f1)
  76. first_name=$(echo "$first_entry" | cut -d: -f2-)
  77. if [ "$first_type" = "file" ]; then
  78. SINGLE_ENTRY="$first_name"
  79. else
  80. SINGLE_ENTRY="${first_name}/index.html"
  81. fi
  82. URL="${GIT_PAGES_URL}/${GITHUB_REPOSITORY}/reports/${SHA8}/${SUITE}/${SINGLE_ENTRY}"
  83. sh .ci/scripts/report-status.sh "$STATUS" "$DESCRIPTION" "$CONTEXT" "" "$URL"
  84. else
  85. generate_index
  86. cp -a "$REPORT_DIR/." "$STAGED/"
  87. sh .ci/scripts/publish-git-pages.sh "$SUITE"
  88. sh .ci/scripts/report-status.sh "$STATUS" "$DESCRIPTION" "$CONTEXT" "$SUITE"
  89. fi
  90. rm -rf "$STAGED"

scripts/ci-validate.sh

95.24% lines covered

21 relevant lines. 20 lines covered and 1 lines missed.
    
  1. #!/usr/bin/env bash
  2. 7 set -euo pipefail
  3. 7 CONF_FILE="${CI_CONF_FILE:-.gitea/workflows/gitea-env.conf}"
  4. 7 ERRORS=0
  5. 9 [ -f "$CONF_FILE" ] || { echo "ERROR: $CONF_FILE not found — checkout missing?" >&2; exit 1; }
  6. 6 echo "Reading $CONF_FILE..."
  7. 36 while IFS='=' read -r key value || [ -n "$key" ]; do
  8. 27 key=$(echo "$key" | xargs)
  9. 27 value=$(echo "$value" | xargs)
  10. 10 [ -z "$key" ] && continue
  11. 9 [[ "$key" == "#"* ]] && continue
  12. 9 [ -z "$value" ] && echo "ERROR: $key is empty in $CONF_FILE" >&2 && ERRORS=1
  13. 19 if [ -n "$value" ] && [[ "$key" == *"URL"* ]] && [[ "$value" != http://* ]] && [[ "$value" != https://* ]]; then
  14. 1 echo "ERROR: $key should be a URL (http/https), got: $value" >&2
  15. 1 ERRORS=1
  16. fi
  17. done < "$CONF_FILE"
  18. 8 [ -z "${GITEA_TOKEN:-}" ] && echo "ERROR: GITEA_TOKEN secret is not set" >&2 && ERRORS=1
  19. 8 [ -z "${GIT_PAGES_PUBLISH_TOKEN:-}" ] && echo "ERROR: GIT_PAGES_PUBLISH_TOKEN secret is not set" >&2 && ERRORS=1
  20. 6 if [ "$ERRORS" -ne 0 ]; then
  21. 4 echo "FATAL: CI config validation failed" >&2
  22. 4 exit 1
  23. fi
  24. 2 echo "OK: all CI env vars validated"

scripts/dispatch-workflow.sh

86.54% lines covered

52 relevant lines. 45 lines covered and 7 lines missed.
    
  1. #!/usr/bin/env bash
  2. 13 set -euo pipefail
  3. 13 TARGET_REPO="${1:-}"
  4. 13 WORKFLOW_FILE="${2:-}"
  5. 13 REF="${3:-}"
  6. 13 INPUTS_JSON="${4:-}"
  7. 13 GITEA_API_URL="${5:-}"
  8. 13 GITEA_TOKEN="${6:-}"
  9. 13 TIMEOUT_MINUTES="${7:-360}"
  10. 13 POLL_INTERVAL="${DISPATCH_POLL_INTERVAL:-10}"
  11. 15 [ -z "$TARGET_REPO" ] && echo "ERROR: target_repo argument is required" >&2 && exit 1
  12. 14 [ -z "$WORKFLOW_FILE" ] && echo "ERROR: workflow_file argument is required" >&2 && exit 1
  13. 13 [ -z "$REF" ] && echo "ERROR: ref argument is required" >&2 && exit 1
  14. 12 [ -z "$INPUTS_JSON" ] && echo "ERROR: inputs_json argument is required" >&2 && exit 1
  15. 11 [ -z "$GITEA_API_URL" ] && echo "ERROR: gitea_api_url argument is required" >&2 && exit 1
  16. 10 [ -z "$GITEA_TOKEN" ] && echo "ERROR: gitea_token argument is required" >&2 && exit 1
  17. 7 DISPATCH_URL="$GITEA_API_URL/api/v1/repos/$TARGET_REPO/actions/workflows/$WORKFLOW_FILE/dispatches"
  18. 14 DISPATCH_BODY=$(jq -nc --arg ref "$REF" --argjson inputs "$INPUTS_JSON" '{ref: $ref, inputs: $inputs}')
  19. DISPATCH_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
  20. --connect-timeout 5 --max-time 10 \
  21. -X POST "$DISPATCH_URL" \
  22. -H "Authorization: token $GITEA_TOKEN" \
  23. -H "Content-Type: application/json" \
  24. 14 -d "$DISPATCH_BODY")
  25. 7 if [ "$DISPATCH_CODE" != "201" ]; then
  26. 1 echo "ERROR: Dispatch failed with HTTP $DISPATCH_CODE" >&2
  27. 1 exit 1
  28. fi
  29. 6 RUNS_URL="$GITEA_API_URL/api/v1/repos/$TARGET_REPO/actions/runs?status=running"
  30. RUNS_RESP=$(curl -s --connect-timeout 5 --max-time 10 \
  31. 12 -H "Authorization: token $GITEA_TOKEN" "$RUNS_URL")
  32. 18 RUN_ID=$(echo "$RUNS_RESP" | jq -r '.workflow_runs[0].id // empty')
  33. 11 if [ -z "$RUN_ID" ] || [ "$RUN_ID" = "null" ]; then
  34. 1 echo "ERROR: Could not find dispatched workflow run" >&2
  35. 1 exit 1
  36. fi
  37. 10 TIMEOUT_SECONDS=$(awk "BEGIN {printf \"%.3f\", $TIMEOUT_MINUTES * 60}")
  38. 10 START_TIME=$(date +%s)
  39. 14 while true; do
  40. 28 NOW=$(date +%s)
  41. 14 ELAPSED=$((NOW - START_TIME))
  42. 14 if awk -v e="$ELAPSED" -v t="$TIMEOUT_SECONDS" 'BEGIN { exit !(e >= t) }'; then
  43. 1 echo "ERROR: Timeout after ${TIMEOUT_MINUTES} minutes" >&2
  44. 1 exit 124
  45. fi
  46. 13 RUN_URL="$GITEA_API_URL/api/v1/repos/$TARGET_REPO/actions/runs/$RUN_ID"
  47. RUN_RESP=$(curl -s --connect-timeout 5 --max-time 10 \
  48. 26 -H "Authorization: token $GITEA_TOKEN" "$RUN_URL")
  49. 39 STATUS=$(echo "$RUN_RESP" | jq -r '.status // "running"')
  50. 13 if [ "$STATUS" = "completed" ]; then
  51. 12 CONCLUSION=$(echo "$RUN_RESP" | jq -r '.conclusion // "failure"')
  52. 4 if [ "$CONCLUSION" = "success" ]; then
  53. 2 exit 0
  54. fi
  55. 2 echo "ERROR: Workflow completed with conclusion: $CONCLUSION" >&2
  56. 2 exit 1
  57. fi
  58. 9 sleep "$POLL_INTERVAL"
  59. done

scripts/gitops-update.sh

87.04% lines covered

54 relevant lines. 47 lines covered and 7 lines missed.
    
  1. #!/usr/bin/env bash
  2. 14 set -euo pipefail
  3. 56 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. _gitops_fail() {
  5. 8 local MSG="${1:-GitOps update failed}"
  6. 8 echo "[ERROR] ${MSG}" >&2
  7. 15 if [ -n "${SOURCE_REPO:-}" ] && [ -n "${SOURCE_COMMIT:-}" ] && \
  8. 11 [ -n "${GITEA_API_URL:-}" ] && [ -n "${GITEA_TOKEN:-}" ]; then
  9. 4 local GITOPS_URL="${GITEA_API_URL}/${GITOPS_REPO:-unknown}/commits/${GITOPS_SHA:-unknown}"
  10. 20 ROOT_REPO="${SOURCE_REPO}" ROOT_COMMIT="${SOURCE_COMMIT}" \
  11. GITEA_API_URL="${GITEA_API_URL}" GITEA_TOKEN="${GITEA_TOKEN}" \
  12. 4 bash "${SCRIPT_DIR}/report-status.sh" failure "${MSG}" \
  13. 4 "gitops/${SOURCE_REPO}" "" "${GITOPS_URL}" 2>/dev/null || true
  14. 7 if [ -n "${GITOPS_REPO:-}" ] && [ -n "${GITOPS_SHA:-}" ]; then
  15. local SOURCE_URL="${GITEA_API_URL}/${SOURCE_REPO}/commits/${SOURCE_COMMIT}"
  16. ROOT_REPO="${GITOPS_REPO}" ROOT_COMMIT="${GITOPS_SHA}" \
  17. GITEA_API_URL="${GITEA_API_URL}" GITEA_TOKEN="${GITEA_TOKEN}" \
  18. bash "${SCRIPT_DIR}/report-status.sh" failure "${MSG}" \
  19. "source/${SOURCE_REPO}" "" "${SOURCE_URL}" 2>/dev/null || true
  20. fi
  21. fi
  22. 8 exit 1
  23. }
  24. _gitops_validate() {
  25. 15 [ -n "${INPUT_FILE:-}" ] || _gitops_fail "INPUT_FILE is required"
  26. 14 [ -n "${YQ_TPL:-}" ] || _gitops_fail "YQ_TPL is required"
  27. 13 [ -n "${VERSION:-}" ] || _gitops_fail "VERSION is required"
  28. 12 [ -n "${SOURCE_REPO:-}" ] || _gitops_fail "SOURCE_REPO is required"
  29. 11 [ -n "${SOURCE_COMMIT:-}" ] || _gitops_fail "SOURCE_COMMIT is required"
  30. 10 [ -n "${GITOPS_REPO:-}" ] || _gitops_fail "GITOPS_REPO is required"
  31. 9 [ -n "${GITEA_TOKEN:-}" ] || _gitops_fail "GITEA_TOKEN is required"
  32. 8 [ -n "${GITEA_API_URL:-}" ] || _gitops_fail "GITEA_API_URL is required"
  33. }
  34. _gitops_success() {
  35. 2 local GITOPS_URL="${GITEA_API_URL}/${GITOPS_REPO}/commits/${GITOPS_SHA}"
  36. 2 local SOURCE_URL="${GITEA_API_URL}/${SOURCE_REPO}/commits/${SOURCE_COMMIT}"
  37. 10 ROOT_REPO="${SOURCE_REPO}" ROOT_COMMIT="${SOURCE_COMMIT}" \
  38. 10 GITEA_API_URL="${GITEA_API_URL}" GITEA_TOKEN="${GITEA_TOKEN}" \
  39. 10 bash "${SCRIPT_DIR}/report-status.sh" success "GitOps updated to ${VERSION}" \
  40. 10 "gitops/${SOURCE_REPO}" "" "${GITOPS_URL}"
  41. 10 ROOT_REPO="${GITOPS_REPO}" ROOT_COMMIT="${GITOPS_SHA}" \
  42. 10 GITEA_API_URL="${GITEA_API_URL}" GITEA_TOKEN="${GITEA_TOKEN}" \
  43. 10 bash "${SCRIPT_DIR}/report-status.sh" success "Source build" \
  44. 10 "source/${SOURCE_REPO}" "" "${SOURCE_URL}"
  45. }
  46. _gitops_substitute() {
  47. 16 echo "$1" | sed "s/{{VERSION}}/$2/g"
  48. }
  49. _gitops_update() {
  50. 4 local CLONE_DIR="${GITOPS_TARGET_DIR:-$(mktemp -d)}"
  51. 2 if [ -n "${GITOPS_CLONE_URL:-}" ]; then
  52. git clone "${GITOPS_CLONE_URL}" "${CLONE_DIR}" || _gitops_fail "Failed to clone GitOps repo"
  53. else
  54. 2 git clone "${CLONE_URL}" "${CLONE_DIR}" || _gitops_fail "Failed to clone GitOps repo"
  55. fi
  56. 2 cd "${CLONE_DIR}" || _gitops_fail "Failed to enter clone directory"
  57. 2 yq eval -i "${YQ_EXPR}" "${INPUT_FILE}" || _gitops_fail "Failed to update ${INPUT_FILE}"
  58. 2 git add "${INPUT_FILE}" || _gitops_fail "Failed to stage ${INPUT_FILE}"
  59. 2 git commit -m "[skip ci] gitops: update version to ${VERSION}" || _gitops_fail "Failed to commit"
  60. 4 GITOPS_SHA="$(git rev-parse HEAD)"
  61. 2 git push || _gitops_fail "Failed to push"
  62. 2 _gitops_success
  63. }
  64. 14 _gitops_validate
  65. 12 YQ_EXPR=$(_gitops_substitute "${YQ_TPL}" "${VERSION}")
  66. 24 GITEA_HOST=$(echo "${GITEA_API_URL}" | sed 's|https://||' | sed 's|http://||')
  67. 6 CLONE_URL="${GITOPS_CLONE_URL:-https://${GITEA_TOKEN}@${GITEA_HOST}/${GITOPS_REPO}.git}"
  68. 6 if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
  69. 2 _gitops_update
  70. fi

scripts/publish-git-pages.sh

78.05% lines covered

82 relevant lines. 64 lines covered and 18 lines missed.
    
  1. 3 #!/usr/bin/env sh
  2. 9 set -eu
  3. 9 SUITE_PATH="${1:-}"
  4. 11 [ -n "$SUITE_PATH" ] || { echo "ERROR: suite_path argument required" >&2; exit 1; }
  5. 10 [ -n "${GITEA_API_URL:-}" ] || { echo "ERROR: GITEA_API_URL is not set" >&2; exit 1; }
  6. 9 [ -n "${GIT_PAGES_URL:-}" ] || { echo "ERROR: GIT_PAGES_URL is not set" >&2; exit 1; }
  7. 8 [ -n "${GIT_PAGES_PUBLISH_TOKEN:-}" ] || { echo "ERROR: GIT_PAGES_PUBLISH_TOKEN is not set" >&2; exit 1; }
  8. 7 [ -n "${GITHUB_REPOSITORY:-}" ] || { echo "ERROR: GITHUB_REPOSITORY is not set" >&2; exit 1; }
  9. 4 [ -n "${GITHUB_SHA:-}" ] || { echo "ERROR: GITHUB_SHA is not set" >&2; exit 1; }
  10. 4 OWNER="${GITHUB_REPOSITORY%%/*}"
  11. 4 REPO="${GITHUB_REPOSITORY##*/}"
  12. 12 SHA8=$(echo "$GITHUB_SHA" | cut -c1-8)
  13. 4 PAGES_USER="${GIT_PAGES_PUBLISH_USER:-publish}"
  14. 4 REPORT_DIR="reports/${SHA8}/${SUITE_PATH%/}"
  15. 4 REPORT_BASE="${GIT_PAGES_URL}/${OWNER}/${REPO}/reports/${SHA8}"
  16. 6 [ -d "$REPORT_DIR" ] || { echo "ERROR: not a directory: $REPORT_DIR" >&2; exit 1; }
  17. 3 PUBLISH_SITE_URL="${GIT_PAGES_URL}/"
  18. 6 WORK=$(mktemp -d)
  19. 6 TAR=$(mktemp)
  20. 3 trap 'rm -rf "$WORK" "$TAR"' EXIT
  21. 3 RELPATH="${REPORT_DIR#reports/${SHA8}/}"
  22. 6 if [ "$RELPATH" != "$REPORT_DIR" ] && [ -n "$RELPATH" ]; then
  23. 3 TARGET="$WORK/${OWNER}/${REPO}/reports/${SHA8}/${RELPATH}"
  24. else
  25. TARGET="$WORK/${OWNER}/${REPO}/reports/${SHA8}"
  26. fi
  27. 3 mkdir -p "$TARGET"
  28. 3 cp -a "$REPORT_DIR/." "$TARGET/"
  29. 3 if [ ! -f "$TARGET/index.html" ]; then
  30. 1 ITEM_LIST=""
  31. 1 ITEM_COUNT=0
  32. 1 for f in "$TARGET"/*; do
  33. 1 [ -f "$f" ] || continue
  34. 2 base=$(basename "$f")
  35. 1 [ "$base" = "index.html" ] && continue
  36. 1 ITEM_LIST="${ITEM_LIST}file:${base}
  37. 1 "
  38. 1 ITEM_COUNT=$((ITEM_COUNT + 1))
  39. 1 done
  40. 1
  41. 1 for d in "$TARGET"/*/; do
  42. 2 [ -d "$d" ] || continue
  43. base=$(basename "$d")
  44. [ -f "$d/index.html" ] || continue
  45. 1 ITEM_LIST="${ITEM_LIST}dir:${base}
  46. 1 "
  47. 1 ITEM_COUNT=$((ITEM_COUNT + 1))
  48. 1 done
  49. 1
  50. 1 if [ "$ITEM_COUNT" -gt 1 ]; then
  51. {
  52. echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">'
  53. echo "<title>Test report ${SHA8}</title>"
  54. echo '<style>body{font-family:sans-serif;margin:2em;max-width:960px}'
  55. echo 'h1{color:#1e293b}ul{list-style:none;padding:0}'
  56. echo 'li{margin:.5em 0;padding:.5em;background:#f8fafc;border-radius:6px}'
  57. echo 'a{color:#2563eb;text-decoration:none}a:hover{text-decoration:underline}'
  58. echo '</style></head><body>'
  59. echo "<h1>Test report <code>${SHA8}</code></h1><ul>"
  60. echo "$ITEM_LIST" | while IFS= read -r item; do
  61. [ -z "$item" ] && continue
  62. item_type=$(echo "$item" | cut -d: -f1)
  63. item_name=$(echo "$item" | cut -d: -f2-)
  64. label=$(echo "$item_name" | sed -e 's/\.[^.]*$//' -e 's/[-_]/ /g')
  65. first=$(echo "$label" | cut -c1 | tr '[:lower:]' '[:upper:]')
  66. rest=$(echo "$label" | cut -c2-)
  67. if [ "$item_type" = "file" ]; then
  68. echo "<li><a href=\"$item_name\">${first}${rest}</a></li>"
  69. else
  70. echo "<li><a href=\"$item_name/index.html\">${first}${rest}</a></li>"
  71. fi
  72. done
  73. echo '</ul></body></html>'
  74. } > "$TARGET/index.html"
  75. fi
  76. fi
  77. 6 cat > "$TARGET/.meta" <<EOF
  78. 6 {"branch":"${GITHUB_REF_NAME:-}","sha":"${GITHUB_SHA}","published_at":"$(date -u +%Y-%m-%dT%H:%M:%SZ)"}
  79. 6 EOF
  80. 9 find "$WORK/$OWNER" \( -type f -o -type l \) -print | sed "s|^${WORK}/||" | tar -cf "$TAR" -C "$WORK" -T -
  81. publish() {
  82. 3 method="$1"
  83. 3 curl -sS -X "$method" "$PUBLISH_SITE_URL" \
  84. 3 -u "${PAGES_USER}:${GIT_PAGES_PUBLISH_TOKEN}" \
  85. 3 -H "Content-Type: application/x-tar" \
  86. 3 -H "Atomic: no" \
  87. 3 -H "Create-Parents: yes" \
  88. 3 --data-binary @"$TAR" \
  89. 3 -o /tmp/git-pages-publish-response.txt \
  90. 3 -w "%{http_code}"
  91. }
  92. 6 HTTP_CODE=$(publish PATCH)
  93. 3 case "$HTTP_CODE" in
  94. 200|201|204) ;;
  95. *)
  96. 1 echo "ERROR: git-pages publish HTTP ${HTTP_CODE}" >&2
  97. 1 cat /tmp/git-pages-publish-response.txt >&2
  98. 1 exit 1
  99. ;;
  100. esac
  101. 2 echo "$REPORT_BASE"

scripts/publish.sh

70.0% lines covered

10 relevant lines. 7 lines covered and 3 lines missed.
    
  1. #!/usr/bin/env bash
  2. 5 set -euo pipefail
  3. 5 SUITE_PATH="${1:-}"
  4. 7 [ -n "$SUITE_PATH" ] || { echo "ERROR: suite_path argument required" >&2; exit 1; }
  5. 6 [ -n "${GITEA_API_URL:-}" ] || { echo "ERROR: GITEA_API_URL is not set" >&2; exit 1; }
  6. 5 [ -n "${GITEA_TOKEN:-}" ] || { echo "ERROR: GITEA_TOKEN is not set" >&2; exit 1; }
  7. 4 [ -n "${GIT_PAGES_URL:-}" ] || { echo "ERROR: GIT_PAGES_URL is not set" >&2; exit 1; }
  8. 3 [ -n "${GIT_PAGES_PUBLISH_TOKEN:-}" ] || { echo "ERROR: GIT_PAGES_PUBLISH_TOKEN is not set" >&2; exit 1; }
  9. SCRIPT_DIR="$(dirname "$0")"
  10. REPORT_URL=$(bash "$SCRIPT_DIR/publish-git-pages.sh" "$SUITE_PATH")
  11. echo "Published: $REPORT_URL"
  12. bash "$SCRIPT_DIR/report-status.sh" success "Reports published" "ci-report"

scripts/report-status.sh

87.88% lines covered

33 relevant lines. 29 lines covered and 4 lines missed.
    
  1. #!/usr/bin/env sh
  2. 18 set -eu
  3. 18 STATE="${1:-}"
  4. 18 DESCRIPTION="${2:-}"
  5. 54 SHA8=$(echo "${GITHUB_SHA:-}" | cut -c1-8)
  6. 18 KEY="${3:-commit-${SHA8}}"
  7. 18 SUITE="${4:-}"
  8. 18 CUSTOM_URL="${5:-}"
  9. 20 [ -z "$STATE" ] && echo "ERROR: state argument is required" >&2 && exit 1
  10. 19 [ -z "$DESCRIPTION" ] && echo "ERROR: description argument is required" >&2 && exit 1
  11. 18 [ -z "${GITEA_API_URL:-}" ] && echo "ERROR: GITEA_API_URL is not set" >&2 && exit 1
  12. 17 [ -z "${GITEA_TOKEN:-}" ] && echo "ERROR: GITEA_TOKEN is not set" >&2 && exit 1
  13. 14 if [ -n "$CUSTOM_URL" ]; then
  14. 8 URL="$CUSTOM_URL"
  15. 6 elif [ -n "$SUITE" ]; then
  16. 1 SUITE="${SUITE%/}/"
  17. 3 SHA8_CUT=$(echo "$GITHUB_SHA" | cut -c1-8)
  18. 1 URL="${GIT_PAGES_URL}/${GITHUB_REPOSITORY}/reports/${SHA8_CUT}/${SUITE}"
  19. else
  20. 5 URL="${GITEA_API_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
  21. fi
  22. 14 REPO="${ROOT_REPO:-${GITHUB_REPOSITORY:-}}"
  23. 14 COMMIT="${ROOT_COMMIT:-${GITHUB_SHA:-}}"
  24. 14 [ -z "$REPO" ] && echo "ERROR: GITHUB_REPOSITORY is not set" >&2 && exit 1
  25. 14 [ -z "$COMMIT" ] && echo "ERROR: GITHUB_SHA is not set" >&2 && exit 1
  26. HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
  27. -X POST "$GITEA_API_URL/api/v1/repos/$REPO/statuses/$COMMIT" \
  28. -H "Authorization: token $GITEA_TOKEN" \
  29. -H "Content-Type: application/json" \
  30. 32 -d "{\"state\":\"$STATE\",\"target_url\":\"$URL\",\"description\":\"$DESCRIPTION\",\"context\":\"$KEY\"}" || true)
  31. 14 if [ "$HTTP_CODE" = "201" ]; then
  32. 9 exit 0
  33. fi
  34. 10 if [ -z "$HTTP_CODE" ] || [ "$HTTP_CODE" = "000" ]; then
  35. 4 echo "gitea-ci-library - ERROR: Failed to connect to Gitea API at $GITEA_API_URL" >&2
  36. else
  37. 1 echo "gitea-ci-library - ERROR: gitea-ci-library, API returned HTTP $HTTP_CODE" >&2
  38. fi
  39. 5 exit 1