#!/usr/bin/env bash # Publish HTML CI report tree to local runner host and print HTTPS URL. # Usage: publish-ci-report.sh # repo: EventHubBack | EventHubFront | … # run_id: usually GITHUB_RUN_NUMBER or sha # kind: eunit | ct | allure | e2e-ift | e2e-stage | … # src_dir: directory with HTML to copy set -euo pipefail REPO="${1:?repo}" RUN_ID="${2:?run_id}" KIND="${3:?kind}" SRC="${4:?src_dir}" REPORTS_DIR="${CI_REPORTS_DIR:-/var/eventhub/ci-reports}" STAND="${RUNNER_STAND:-}" detect_stand() { if [[ -n "${RUNNER_STAND:-}" ]]; then echo "${RUNNER_STAND}" return 0 fi # Gitea runner на dev-машине: отчёты в /var/eventhub/ci-reports локально. # Наличие /opt/eventhub-ift (SSH deploy) не означает, что HTML лежит на IFT-сервере. echo "dev" } if [[ -n "${CI_REPORTS_BASE_URL:-}" ]]; then BASE_URL="${CI_REPORTS_BASE_URL%/}" else STAND="$(detect_stand)" BASE_URL="https://ci-reports.${STAND}.eventhub.local" fi if [[ ! -d "${SRC}" ]]; then echo "publish-ci-report: src missing: ${SRC}" >&2 exit 1 fi # act runner: workflow may create REPORTS_DIR via sudo (root-owned); ensure CI user can write. ensure_ci_reports_dir() { if [[ -d "${REPORTS_DIR}" ]] && [[ -w "${REPORTS_DIR}" ]]; then return 0 fi if mkdir -p "${REPORTS_DIR}" 2>/dev/null && [[ -w "${REPORTS_DIR}" ]]; then return 0 fi if command -v sudo >/dev/null 2>&1; then sudo mkdir -p "${REPORTS_DIR}" sudo chown -R "$(id -u):$(id -g)" "${REPORTS_DIR}" return 0 fi mkdir -p "${REPORTS_DIR}" } ensure_ci_reports_dir ensure_ci_reports_nginx() { command -v docker >/dev/null 2>&1 || return 0 local svc replicas svc=$(docker service ls --format '{{.Name}}' 2>/dev/null | grep -E '^eventhub_ci-reports$' | head -n 1 || true) [[ -n "${svc}" ]] || return 0 replicas=$(docker service ls --format '{{.Name}} {{.Replicas}}' 2>/dev/null | awk '$1=="eventhub_ci-reports"{print $2; exit}') if [[ "${replicas}" == 0/* ]] || [[ -z "${replicas}" ]]; then echo "Starting ${svc}=1 (dev ci-reports nginx)..." docker service scale "${svc}=1" 2>/dev/null || true fi } ensure_ci_reports_nginx DEST="${REPORTS_DIR}/${REPO}/${RUN_ID}/${KIND}" mkdir -p "${REPORTS_DIR}/${REPO}/${RUN_ID}" rm -rf "${DEST}" mkdir -p "${DEST}" cp -a "${SRC}/." "${DEST}/" # Convenience: CT puts index under ct_run.*; expose DEST/index.html if [[ ! -f "${DEST}/index.html" ]]; then CT_INDEX="$(find "${DEST}" -type f -name index.html 2>/dev/null | head -n 1 || true)" if [[ -n "${CT_INDEX}" ]]; then REL="${CT_INDEX#"${DEST}/"}" cat > "${DEST}/index.html" < CT report

Open Common Test report

EOF fi fi # Refresh run index INDEX="${REPORTS_DIR}/${REPO}/${RUN_ID}/index.html" { echo "" echo "${REPO} #${RUN_ID}" echo "" echo "" echo "

${REPO} — run ${RUN_ID}

" echo "
    " for d in "${REPORTS_DIR}/${REPO}/${RUN_ID}"/*/; do [[ -d "${d}" ]] || continue name="$(basename "${d}")" if [[ -f "${d}index.html" ]]; then echo "
  • ${name}
  • " else echo "
  • ${name}/
  • " fi done echo "
" } > "${INDEX}" URL="${BASE_URL}/${REPO}/${RUN_ID}/${KIND}/" INDEX_URL="${BASE_URL}/${REPO}/${RUN_ID}/" echo "Report: ${URL}" echo "Report index: ${INDEX_URL}" echo "Report path: ${DEST}" if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then { echo "### Test report" echo "- [${KIND}](${URL})" echo "- [index](${INDEX_URL})" } >> "${GITHUB_STEP_SUMMARY}" fi