# Phase 36 Step 11 — build and test on every push/PR. # Fixtures read ConnectionStrings__* / Redis__* / RabbitMq__* / Kafka__* from the # environment (see ApiFixture / GatewayApiFixture). Dependencies come from # docker-compose.yml so Kafka, ES, and MinIO match local integration tests — # ApiFixture starts hosted services that require those brokers. name: CI on: push: branches: [master] pull_request: branches: [master] jobs: backend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Start dependency stack run: | docker compose up -d postgres redis rabbitmq kafka elasticsearch minio docker compose --profile ward-gateway up -d ward-gateway-db ward-gateway-redis ward-gateway-rabbitmq - name: Wait for Postgres (API + gateway) run: | for i in $(seq 1 60); do docker compose exec -T postgres pg_isready -U postgres && break sleep 2 done docker compose exec -T postgres pg_isready -U postgres docker compose exec -T ward-gateway-db pg_isready -U postgres - name: Wait for Kafka run: | for i in $(seq 1 90); do if docker compose exec -T kafka \ /opt/kafka/bin/kafka-broker-api-versions.sh \ --bootstrap-server localhost:9092 >/dev/null 2>&1; then echo "Kafka is ready" exit 0 fi echo "waiting for Kafka ($i)..." sleep 2 done echo "Kafka failed to become ready" >&2 docker compose logs --tail=100 kafka exit 1 - name: Wait for Redis / RabbitMQ / Elasticsearch run: | for i in $(seq 1 60); do docker compose exec -T redis redis-cli ping 2>/dev/null | grep -q PONG \ && docker compose exec -T ward-gateway-redis redis-cli ping 2>/dev/null | grep -q PONG \ && docker compose exec -T rabbitmq rabbitmq-diagnostics -q ping \ && docker compose exec -T ward-gateway-rabbitmq rabbitmq-diagnostics -q ping \ && docker compose exec -T elasticsearch curl -sf http://localhost:9200/_cluster/health >/dev/null \ && echo "Redis, RabbitMQ, and Elasticsearch are ready" && exit 0 echo "waiting for brokers ($i)..." sleep 2 done echo "Brokers failed to become ready" >&2 docker compose ps docker compose logs --tail=50 redis rabbitmq elasticsearch ward-gateway-redis ward-gateway-rabbitmq exit 1 - name: Create test databases run: | docker compose exec -T postgres psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname='vigilcare_test'" \ | grep -q 1 \ || docker compose exec -T postgres psql -U postgres -c "CREATE DATABASE vigilcare_test" docker compose exec -T ward-gateway-db psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname='vigilcare_ward_test'" \ | grep -q 1 \ || docker compose exec -T ward-gateway-db psql -U postgres -c "CREATE DATABASE vigilcare_ward_test" - name: Setup .NET 8 uses: actions/setup-dotnet@v4 with: dotnet-version: "8.0.x" - name: Restore run: dotnet restore VigilCareClinical.sln - name: Build run: dotnet build VigilCareClinical.sln -c Release --no-restore - name: Test env: # act_runner runs in its own container; Compose publishes ports on the VM. # host.docker.internal reaches those published ports (requires extra_hosts # host-gateway on the runner). RabbitMQ guest remote access is enabled in # infra/rabbitmq/rabbitmq.conf for this topology. ConnectionStrings__DefaultConnection: "Host=host.docker.internal;Port=5436;Database=vigilcare_test;Username=postgres;Password=password" ConnectionStrings__GatewayDb: "Host=host.docker.internal;Port=5437;Database=vigilcare_ward_test;Username=postgres;Password=password" Redis__ConnectionString: "host.docker.internal:6382,defaultDatabase=1,allowAdmin=true" Gateway__Redis__ConnectionString: "host.docker.internal:6383,defaultDatabase=2,allowAdmin=true" RabbitMq__Host: "host.docker.internal" RabbitMq__Port: "5674" Gateway__RabbitMq__Host: "host.docker.internal" Gateway__RabbitMq__Port: "5675" Kafka__BootstrapServers: "host.docker.internal:9092" Kafka__ReplicationFactor: "1" Kafka__SecurityProtocol: "Plaintext" Elasticsearch__Uri: "http://host.docker.internal:9200" Minio__Endpoint: "host.docker.internal:9005" Minio__UseSSL: "false" ASPNETCORE_ENVIRONMENT: "Testing" run: | dotnet test VigilCareClinical.sln -c Release --no-build \ --logger "trx;LogFileName=test-results.trx" \ --results-directory ./TestResults - name: Publish test results if: always() uses: actions/upload-artifact@v3 with: name: test-results path: ./TestResults - name: Tear down stack if: always() run: docker compose --profile ward-gateway down -v frontend: runs-on: ubuntu-latest container: image: node:22-alpine steps: - uses: actions/checkout@v4 - name: Install working-directory: vigilcare-dashboard run: npm ci - name: Test working-directory: vigilcare-dashboard run: npm run test - name: Build working-directory: vigilcare-dashboard run: npm run build