refactor(streamer): remove gstreamer and legacy rtmp paths
This commit is contained in:
+209
-210
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -u -o pipefail
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
STREAMER_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
@@ -11,11 +11,10 @@ SUMMARY_HELPER="${SCRIPT_DIR}/acceptance_summary_helper.py"
|
||||
|
||||
RUN_ID=""
|
||||
RUN_DIR=""
|
||||
MANIFEST_TSV="${RUN_DIR}/rows.tsv"
|
||||
SUMMARY_JSON="${RUN_DIR}/summary.json"
|
||||
MANIFEST_TSV=""
|
||||
SUMMARY_JSON=""
|
||||
LATEST_SUMMARY_JSON="${EVIDENCE_ROOT}/task-14-acceptance-summary.json"
|
||||
EVIDENCE_TEXT="${EVIDENCE_ROOT}/task-14-acceptance.txt"
|
||||
|
||||
STARTED_AT_UTC="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
||||
|
||||
mkdir -p "${TASK_EVIDENCE_DIR}"
|
||||
@@ -34,7 +33,7 @@ allocate_run_dir() {
|
||||
return 0
|
||||
fi
|
||||
attempts=$((attempts + 1))
|
||||
sleep 0.01
|
||||
sleep 0.01
|
||||
done
|
||||
echo "failed to allocate unique acceptance run directory" >&2
|
||||
return 1
|
||||
@@ -47,7 +46,7 @@ PORT_OFFSET="$((RUN_HASH % 1000))"
|
||||
RTP_PORT_BASE="$((51040 + PORT_OFFSET))"
|
||||
RTMP_PORT_BASE="$((19360 + PORT_OFFSET))"
|
||||
|
||||
echo -e "order\trow_id\tname\tprotocol\tcodec\trtmp_mode\tstatus\treason\tduration_ms\tsim_rc\tstreamer_rc\ttester_rc\tsim_log\tstreamer_log\ttester_log\tsdp_path" > "${MANIFEST_TSV}"
|
||||
echo -e "order\trow_id\tname\tprotocol\tcodec\ttransport\tstatus\treason\tduration_ms\temitter_rc\treceiver_rc\temitter_log\treceiver_log\tsdp_path" > "${MANIFEST_TSV}"
|
||||
|
||||
cleanup_pids=()
|
||||
|
||||
@@ -55,6 +54,7 @@ cleanup_all() {
|
||||
for pid in "${cleanup_pids[@]:-}"; do
|
||||
if [[ -n "${pid}" ]] && kill -0 "${pid}" 2>/dev/null; then
|
||||
kill "${pid}" 2>/dev/null || true
|
||||
wait "${pid}" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
}
|
||||
@@ -90,179 +90,193 @@ append_manifest_row() {
|
||||
local name="$3"
|
||||
local protocol="$4"
|
||||
local codec="$5"
|
||||
local rtmp_mode="$6"
|
||||
local transport="$6"
|
||||
local status="$7"
|
||||
local reason="$8"
|
||||
local duration_ms="$9"
|
||||
local sim_rc="${10}"
|
||||
local streamer_rc="${11}"
|
||||
local tester_rc="${12}"
|
||||
local sim_log="${13}"
|
||||
local streamer_log="${14}"
|
||||
local tester_log="${15}"
|
||||
local sdp_path="${16}"
|
||||
local emitter_rc="${10}"
|
||||
local receiver_rc="${11}"
|
||||
local emitter_log="${12}"
|
||||
local receiver_log="${13}"
|
||||
local sdp_path="${14}"
|
||||
|
||||
echo -e "${order}\t${row_id}\t${name}\t${protocol}\t${codec}\t${rtmp_mode}\t${status}\t${reason}\t${duration_ms}\t${sim_rc}\t${streamer_rc}\t${tester_rc}\t${sim_log}\t${streamer_log}\t${tester_log}\t${sdp_path}" >> "${MANIFEST_TSV}"
|
||||
echo -e "${order}\t${row_id}\t${name}\t${protocol}\t${codec}\t${transport}\t${status}\t${reason}\t${duration_ms}\t${emitter_rc}\t${receiver_rc}\t${emitter_log}\t${receiver_log}\t${sdp_path}" >> "${MANIFEST_TSV}"
|
||||
}
|
||||
|
||||
run_matrix_row() {
|
||||
run_rtp_row() {
|
||||
local order="$1"
|
||||
local row_id="$2"
|
||||
local name="$3"
|
||||
local protocol="$4"
|
||||
local codec="$5"
|
||||
local rtmp_mode="$6"
|
||||
local codec="$3"
|
||||
|
||||
local row_dir="${RUN_DIR}/${order}-${row_id}"
|
||||
mkdir -p "${row_dir}"
|
||||
|
||||
local sim_log="${row_dir}/sim.log"
|
||||
local streamer_log="${row_dir}/streamer.log"
|
||||
local tester_log="${row_dir}/tester.log"
|
||||
local sdp_path=""
|
||||
|
||||
local shm_name="cvmmap_accept_${row_id}_${RUN_ID}"
|
||||
local zmq_endpoint="ipc:///tmp/cvmmap_accept_${row_id}_${RUN_ID}.ipc"
|
||||
|
||||
local sim_label="acc_${order}_${protocol}_${codec}"
|
||||
|
||||
local streamer_cmd=(
|
||||
"${BUILD_DIR}/cvmmap_streamer"
|
||||
--run-mode pipeline
|
||||
--codec "${codec}"
|
||||
--shm-name "${shm_name}"
|
||||
--zmq-endpoint "${zmq_endpoint}"
|
||||
--input-mode dummy
|
||||
--dummy-label "${sim_label}"
|
||||
--dummy-frames 320
|
||||
--dummy-fps 200
|
||||
--dummy-width 640
|
||||
--dummy-height 360
|
||||
--dummy-startup-delay-ms 0
|
||||
--queue-size 1
|
||||
--gop 30
|
||||
--b-frames 0
|
||||
--ingest-max-frames 120
|
||||
--ingest-idle-timeout-ms 6000
|
||||
)
|
||||
|
||||
local tester_cmd=()
|
||||
if [[ "${protocol}" == "rtp" ]]; then
|
||||
local rtp_port
|
||||
local payload_type
|
||||
if [[ "${codec}" == "h264" ]]; then
|
||||
rtp_port="${RTP_PORT_BASE}"
|
||||
payload_type=96
|
||||
else
|
||||
rtp_port="$((RTP_PORT_BASE + 2))"
|
||||
payload_type=98
|
||||
fi
|
||||
sdp_path="${row_dir}/stream.sdp"
|
||||
streamer_cmd+=(
|
||||
--rtp
|
||||
--rtp-endpoint "127.0.0.1:${rtp_port}"
|
||||
--rtp-payload-type "${payload_type}"
|
||||
--rtp-sdp "${sdp_path}"
|
||||
)
|
||||
tester_cmd=(
|
||||
"${BUILD_DIR}/rtp_receiver_tester"
|
||||
--port "${rtp_port}"
|
||||
--expect-pt "${payload_type}"
|
||||
--packet-threshold 1
|
||||
--timeout-ms 10000
|
||||
)
|
||||
else
|
||||
local rtmp_port
|
||||
local tester_mode
|
||||
case "${row_id}" in
|
||||
rtmp_h264)
|
||||
rtmp_port="${RTMP_PORT_BASE}"
|
||||
tester_mode="h264"
|
||||
;;
|
||||
rtmp_h265_enhanced)
|
||||
rtmp_port="$((RTMP_PORT_BASE + 2))"
|
||||
tester_mode="h265-enhanced"
|
||||
;;
|
||||
rtmp_h265_domestic)
|
||||
rtmp_port="$((RTMP_PORT_BASE + 4))"
|
||||
tester_mode="h265-domestic"
|
||||
;;
|
||||
*)
|
||||
rtmp_port="$((RTMP_PORT_BASE + 6))"
|
||||
tester_mode="h264"
|
||||
;;
|
||||
esac
|
||||
|
||||
streamer_cmd+=(
|
||||
--rtmp
|
||||
--rtmp-url "rtmp://127.0.0.1:${rtmp_port}/live/${row_id}"
|
||||
--rtmp-mode "${rtmp_mode}"
|
||||
)
|
||||
tester_cmd=(
|
||||
"${BUILD_DIR}/rtmp_stub_tester"
|
||||
--mode "${tester_mode}"
|
||||
--listen-host 127.0.0.1
|
||||
--listen-port "${rtmp_port}"
|
||||
--video-threshold 1
|
||||
--timeout-ms 10000
|
||||
)
|
||||
local emitter_log="${row_dir}/rtp_output.log"
|
||||
local receiver_log="${row_dir}/rtp_receiver.log"
|
||||
local sdp_path="${row_dir}/stream.sdp"
|
||||
local port
|
||||
port="$((RTP_PORT_BASE + (order - 1) * 2))"
|
||||
local payload_type=96
|
||||
if [[ "${codec}" == "h265" ]]; then
|
||||
payload_type=98
|
||||
fi
|
||||
|
||||
local row_start_ms row_end_ms duration_ms
|
||||
local row_start_ms
|
||||
row_start_ms="$(date +%s%3N)"
|
||||
|
||||
"${tester_cmd[@]}" > "${tester_log}" 2>&1 &
|
||||
local tester_pid=$!
|
||||
cleanup_pids+=("${tester_pid}")
|
||||
"${BUILD_DIR}/rtp_receiver_tester" \
|
||||
--port "${port}" \
|
||||
--expect-pt "${payload_type}" \
|
||||
--packet-threshold 1 \
|
||||
--timeout-ms 12000 >"${receiver_log}" 2>&1 &
|
||||
local receiver_pid=$!
|
||||
cleanup_pids+=("${receiver_pid}")
|
||||
|
||||
sleep 1
|
||||
: > "${sim_log}"
|
||||
|
||||
"${streamer_cmd[@]}" > "${streamer_log}" 2>&1
|
||||
local streamer_rc=$?
|
||||
set +e
|
||||
"${BUILD_DIR}/rtp_output_tester" \
|
||||
--host 127.0.0.1 \
|
||||
--port "${port}" \
|
||||
--payload-type "${payload_type}" \
|
||||
--codec "${codec}" \
|
||||
--encoder-device software \
|
||||
--sdp-path "${sdp_path}" \
|
||||
--frames 48 \
|
||||
--width 320 \
|
||||
--height 240 \
|
||||
--frame-interval-ms 20 >"${emitter_log}" 2>&1
|
||||
local emitter_rc=$?
|
||||
set -e
|
||||
|
||||
wait_pid "${tester_pid}" 15
|
||||
local tester_rc=$?
|
||||
|
||||
local sim_rc=0
|
||||
set +e
|
||||
wait_pid "${receiver_pid}" 20
|
||||
local receiver_rc=$?
|
||||
set -e
|
||||
|
||||
local row_end_ms
|
||||
row_end_ms="$(date +%s%3N)"
|
||||
duration_ms=$((row_end_ms - row_start_ms))
|
||||
|
||||
local duration_ms=$((row_end_ms - row_start_ms))
|
||||
local status="PASS"
|
||||
local reason="all-processes-ok"
|
||||
|
||||
if (( sim_rc != 0 || streamer_rc != 0 || tester_rc != 0 )); then
|
||||
if (( emitter_rc != 0 || receiver_rc != 0 )); then
|
||||
status="FAIL"
|
||||
reason="sim_rc=${sim_rc},streamer_rc=${streamer_rc},tester_rc=${tester_rc}"
|
||||
reason="emitter_rc=${emitter_rc},receiver_rc=${receiver_rc}"
|
||||
if (( receiver_rc == 0 )) && grep -Eq "Broken pipe|Connection reset by peer" "${emitter_log}"; then
|
||||
status="PASS"
|
||||
reason="receiver exited cleanly after threshold; emitter observed peer close"
|
||||
fi
|
||||
fi
|
||||
|
||||
append_manifest_row \
|
||||
"${order}" \
|
||||
"${row_id}" \
|
||||
"${name}" \
|
||||
"${protocol}" \
|
||||
"RTP + ${codec}" \
|
||||
"rtp" \
|
||||
"${codec}" \
|
||||
"${rtmp_mode}" \
|
||||
"udp" \
|
||||
"${status}" \
|
||||
"${reason}" \
|
||||
"${duration_ms}" \
|
||||
"${sim_rc}" \
|
||||
"${streamer_rc}" \
|
||||
"${tester_rc}" \
|
||||
"${sim_log}" \
|
||||
"${streamer_log}" \
|
||||
"${tester_log}" \
|
||||
"${emitter_rc}" \
|
||||
"${receiver_rc}" \
|
||||
"${emitter_log}" \
|
||||
"${receiver_log}" \
|
||||
"${sdp_path}"
|
||||
|
||||
printf "[%s] %s => %s (%s)\n" "${row_id}" "${name}" "${status}" "${reason}"
|
||||
printf "[%s] RTP + %s => %s (%s)\n" "${row_id}" "${codec}" "${status}" "${reason}"
|
||||
}
|
||||
|
||||
run_rtmp_row() {
|
||||
local order="$1"
|
||||
local row_id="$2"
|
||||
local codec="$3"
|
||||
local transport="$4"
|
||||
|
||||
local row_dir="${RUN_DIR}/${order}-${row_id}"
|
||||
mkdir -p "${row_dir}"
|
||||
|
||||
local emitter_log="${row_dir}/rtmp_output.log"
|
||||
local receiver_log="${row_dir}/rtmp_stub.log"
|
||||
local port
|
||||
port="$((RTMP_PORT_BASE + (order - 3) * 2))"
|
||||
local mode="h264"
|
||||
if [[ "${codec}" == "h265" ]]; then
|
||||
mode="h265-enhanced"
|
||||
fi
|
||||
|
||||
local row_start_ms
|
||||
row_start_ms="$(date +%s%3N)"
|
||||
|
||||
"${BUILD_DIR}/rtmp_stub_tester" \
|
||||
--mode "${mode}" \
|
||||
--listen-host 127.0.0.1 \
|
||||
--listen-port "${port}" \
|
||||
--video-threshold 4 \
|
||||
--timeout-ms 12000 >"${receiver_log}" 2>&1 &
|
||||
local receiver_pid=$!
|
||||
cleanup_pids+=("${receiver_pid}")
|
||||
|
||||
sleep 1
|
||||
|
||||
set +e
|
||||
"${BUILD_DIR}/rtmp_output_tester" \
|
||||
--rtmp-url "rtmp://127.0.0.1:${port}/live/${row_id}" \
|
||||
--transport "${transport}" \
|
||||
--codec "${codec}" \
|
||||
--encoder-device software \
|
||||
--frames 32 \
|
||||
--width 320 \
|
||||
--height 240 \
|
||||
--frame-interval-ms 20 \
|
||||
--linger-ms 200 >"${emitter_log}" 2>&1
|
||||
local emitter_rc=$?
|
||||
set -e
|
||||
|
||||
set +e
|
||||
wait_pid "${receiver_pid}" 20
|
||||
local receiver_rc=$?
|
||||
set -e
|
||||
|
||||
local row_end_ms
|
||||
row_end_ms="$(date +%s%3N)"
|
||||
local duration_ms=$((row_end_ms - row_start_ms))
|
||||
local status="PASS"
|
||||
local reason="all-processes-ok"
|
||||
if (( emitter_rc != 0 || receiver_rc != 0 )); then
|
||||
status="FAIL"
|
||||
reason="emitter_rc=${emitter_rc},receiver_rc=${receiver_rc}"
|
||||
if (( receiver_rc == 0 )) && grep -Eq "Broken pipe|Connection reset by peer" "${emitter_log}"; then
|
||||
status="PASS"
|
||||
reason="receiver exited cleanly after threshold; emitter observed peer close"
|
||||
fi
|
||||
fi
|
||||
|
||||
append_manifest_row \
|
||||
"${order}" \
|
||||
"${row_id}" \
|
||||
"RTMP + ${codec} + ${transport}" \
|
||||
"rtmp" \
|
||||
"${codec}" \
|
||||
"${transport}" \
|
||||
"${status}" \
|
||||
"${reason}" \
|
||||
"${duration_ms}" \
|
||||
"${emitter_rc}" \
|
||||
"${receiver_rc}" \
|
||||
"${emitter_log}" \
|
||||
"${receiver_log}" \
|
||||
""
|
||||
|
||||
printf "[%s] RTMP + %s + %s => %s (%s)\n" "${row_id}" "${codec}" "${transport}" "${status}" "${reason}"
|
||||
}
|
||||
|
||||
main() {
|
||||
local required=(
|
||||
"${BUILD_DIR}/cvmmap_streamer"
|
||||
"${BUILD_DIR}/rtp_receiver_tester"
|
||||
"${BUILD_DIR}/rtmp_stub_tester"
|
||||
local required=(
|
||||
"${BUILD_DIR}/rtp_output_tester"
|
||||
"${BUILD_DIR}/rtp_receiver_tester"
|
||||
"${BUILD_DIR}/rtmp_output_tester"
|
||||
"${BUILD_DIR}/rtmp_stub_tester"
|
||||
)
|
||||
|
||||
local missing=()
|
||||
@@ -273,33 +287,24 @@ local required=(
|
||||
done
|
||||
|
||||
if (( ${#missing[@]} > 0 )); then
|
||||
for idx in 1 2 3 4 5; do
|
||||
append_manifest_row \
|
||||
"${idx}" \
|
||||
"preflight_${idx}" \
|
||||
"preflight missing binary" \
|
||||
"preflight" \
|
||||
"n/a" \
|
||||
"" \
|
||||
"SKIP" \
|
||||
"missing binaries: ${missing[*]}" \
|
||||
"0" \
|
||||
"-1" \
|
||||
"-1" \
|
||||
"-1" \
|
||||
"" \
|
||||
"" \
|
||||
"" \
|
||||
""
|
||||
done
|
||||
else
|
||||
run_matrix_row 1 "rtp_h264" "RTP + H.264" "rtp" "h264" ""
|
||||
run_matrix_row 2 "rtp_h265" "RTP + H.265" "rtp" "h265" ""
|
||||
run_matrix_row 3 "rtmp_h264" "RTMP + H.264" "rtmp" "h264" "enhanced"
|
||||
run_matrix_row 4 "rtmp_h265_enhanced" "RTMP + H.265 enhanced" "rtmp" "h265" "enhanced"
|
||||
run_matrix_row 5 "rtmp_h265_domestic" "RTMP + H.265 domestic" "rtmp" "h265" "domestic"
|
||||
{
|
||||
echo "task=14"
|
||||
echo "run_id=${RUN_ID}"
|
||||
echo "run_dir=${RUN_DIR}"
|
||||
echo "manifest=${MANIFEST_TSV}"
|
||||
echo "missing_binaries=${missing[*]}"
|
||||
} > "${EVIDENCE_TEXT}"
|
||||
echo "missing binaries: ${missing[*]}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
run_rtp_row 1 "rtp_h264" "h264"
|
||||
run_rtp_row 2 "rtp_h265" "h265"
|
||||
run_rtmp_row 3 "rtmp_h264_libavformat" "h264" "libavformat"
|
||||
run_rtmp_row 4 "rtmp_h265_libavformat" "h265" "libavformat"
|
||||
run_rtmp_row 5 "rtmp_h264_ffmpeg_process" "h264" "ffmpeg_process"
|
||||
run_rtmp_row 6 "rtmp_h265_ffmpeg_process" "h265" "ffmpeg_process"
|
||||
|
||||
local finished_at_utc
|
||||
finished_at_utc="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
||||
|
||||
@@ -310,67 +315,61 @@ local required=(
|
||||
--run-dir "${RUN_DIR}" \
|
||||
--started-at "${STARTED_AT_UTC}" \
|
||||
--finished-at "${finished_at_utc}"
|
||||
local summary_rc=$?
|
||||
|
||||
cp -f "${SUMMARY_JSON}" "${LATEST_SUMMARY_JSON}" 2>/dev/null || true
|
||||
|
||||
local total_count pass_count fail_count all_pass
|
||||
total_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json, sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("total", 0))
|
||||
PY
|
||||
)"
|
||||
pass_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json, sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("pass", 0))
|
||||
PY
|
||||
)"
|
||||
fail_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json, sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("fail", 0))
|
||||
PY
|
||||
)"
|
||||
all_pass="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json, sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
print("true" if data.get("all_pass", False) else "false")
|
||||
PY
|
||||
)"
|
||||
|
||||
{
|
||||
echo "task=14"
|
||||
echo "run_id=${RUN_ID}"
|
||||
echo "run_dir=${RUN_DIR}"
|
||||
echo "manifest=${MANIFEST_TSV}"
|
||||
echo "summary_json=${SUMMARY_JSON}"
|
||||
echo "latest_summary_json=${LATEST_SUMMARY_JSON}"
|
||||
echo "started_at=${STARTED_AT_UTC}"
|
||||
echo "finished_at=${finished_at_utc}"
|
||||
echo "counts_total=${total_count}"
|
||||
echo "counts_pass=${pass_count}"
|
||||
echo "counts_fail=${fail_count}"
|
||||
echo "all_pass=${all_pass}"
|
||||
echo "matrix_rows=rtp_h264,rtp_h265,rtmp_h264_libavformat,rtmp_h265_libavformat,rtmp_h264_ffmpeg_process,rtmp_h265_ffmpeg_process"
|
||||
} > "${EVIDENCE_TEXT}"
|
||||
|
||||
if (( summary_rc != 0 )); then
|
||||
echo "summary helper failed with rc=${summary_rc}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local pass_count fail_count skip_count total_count
|
||||
pass_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json
|
||||
import sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("pass", 0))
|
||||
PY
|
||||
)"
|
||||
fail_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json
|
||||
import sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("fail", 0))
|
||||
PY
|
||||
)"
|
||||
skip_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json
|
||||
import sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("skip", 0))
|
||||
PY
|
||||
)"
|
||||
total_count="$(python3 - <<'PY' "${SUMMARY_JSON}"
|
||||
import json
|
||||
import sys
|
||||
data = json.load(open(sys.argv[1], "r", encoding="utf-8"))
|
||||
counts = data.get("counts", {})
|
||||
print(counts.get("total", 0))
|
||||
PY
|
||||
)"
|
||||
|
||||
echo "summary: total=${total_count} pass=${pass_count} fail=${fail_count} skip=${skip_count}"
|
||||
echo "json: ${SUMMARY_JSON}"
|
||||
|
||||
if [[ "${total_count}" == "5" && "${pass_count}" == "5" && "${fail_count}" == "0" && "${skip_count}" == "0" ]]; then
|
||||
if [[ "${all_pass}" == "true" ]]; then
|
||||
echo "acceptance matrix PASS (${pass_count}/${total_count})"
|
||||
echo "summary: ${SUMMARY_JSON}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "acceptance matrix FAIL (${pass_count}/${total_count})" >&2
|
||||
echo "summary: ${SUMMARY_JSON}" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user