#!/usr/bin/env bash # CI helper for DEVOPS-CI-110-001 # - Warms NuGet cache from local sources # - Ensures OpenSSL 1.1 compatibility if available # - Runs targeted Concelier and Excititor test slices with TRX output # - Writes artefacts under ops/devops/artifacts/ci-110// set -euo pipefail ROOT="${ROOT:-$(git rev-parse --show-toplevel)}" TIMESTAMP="${TIMESTAMP:-$(date -u +%Y%m%dT%H%M%SZ)}" ARTIFACT_ROOT="${ARTIFACT_ROOT:-"$ROOT/ops/devops/artifacts/ci-110/$TIMESTAMP"}" LOG_DIR="$ARTIFACT_ROOT/logs" TRX_DIR="$ARTIFACT_ROOT/trx" NUGET_SOURCES_DEFAULT="$ROOT/local-nugets;$ROOT/.nuget/packages;https://api.nuget.org/v3/index.json" NUGET_SOURCES="${NUGET_SOURCES:-$NUGET_SOURCES_DEFAULT}" export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 export DOTNET_CLI_TELEMETRY_OPTOUT=1 export DOTNET_RESTORE_DISABLE_PARALLEL="${DOTNET_RESTORE_DISABLE_PARALLEL:-1}" mkdir -p "$LOG_DIR" "$TRX_DIR" log() { printf '[%s] %s\n' "$(date -u +%H:%M:%S)" "$*" } ensure_openssl11() { if openssl version 2>/dev/null | grep -q "1\\.1."; then log "OpenSSL 1.1 detected: $(openssl version)" return fi if command -v apt-get >/dev/null 2>&1; then log "OpenSSL 1.1 not found; attempting install via apt-get (libssl1.1)" sudo DEBIAN_FRONTEND=noninteractive apt-get update -y >/dev/null || true sudo DEBIAN_FRONTEND=noninteractive apt-get install -y libssl1.1 || true if openssl version 2>/dev/null | grep -q "1\\.1."; then log "OpenSSL 1.1 available after install: $(openssl version)" return fi fi log "OpenSSL 1.1 still unavailable. Provide it via LD_LIBRARY_PATH if required." } restore_solution() { local sln="$1" log "Restore $sln" dotnet restore "$sln" --source "$NUGET_SOURCES" --verbosity minimal | tee "$LOG_DIR/restore-$(basename "$sln").log" } run_test_slice() { local proj="$1" local filter="$2" local name="$3" log "Test $name ($proj, filter='$filter')" dotnet test "$proj" \ -c Debug \ --no-build \ ${filter:+--filter "$filter"} \ --logger "trx;LogFileName=${name}.trx" \ --results-directory "$TRX_DIR" \ --blame-hang \ --blame-hang-timeout 8m \ --blame-hang-dump-type none \ | tee "$LOG_DIR/test-${name}.log" } main() { log "Starting CI-110 runner; artefacts -> $ARTIFACT_ROOT" ensure_openssl11 restore_solution "$ROOT/concelier-webservice.slnf" restore_solution "$ROOT/src/Excititor/StellaOps.Excititor.sln" # Concelier: lightweight health slice to validate runner + Mongo wiring run_test_slice "$ROOT/src/Concelier/__Tests/StellaOps.Concelier.WebService.Tests/StellaOps.Concelier.WebService.Tests.csproj" \ "HealthAndReadyEndpointsRespond" \ "concelier-health" # Excititor: airgap import surface (chunk-path) smoke run_test_slice "$ROOT/src/Excititor/__Tests/StellaOps.Excititor.WebService.Tests/StellaOps.Excititor.WebService.Tests.csproj" \ "FullyQualifiedName~AirgapImportEndpointTests" \ "excititor-airgapimport" log "Done. TRX files in $TRX_DIR" } main "$@"