This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # CI integration workflow: builds services with docker compose and checks basic health endpoints. | |
| # Runs on push and pull_request for main and feature branches. | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| - "feature/**" | |
| - "feat/**" | |
| pull_request: | |
| branches: | |
| - main | |
| - master | |
| jobs: | |
| integration: | |
| name: Integration tests (docker-compose) | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 40 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Build frontend Docker image | |
| run: | | |
| docker buildx build --load -f server/frontend/Dockerfile -t xrwvm-frontend:ci server/frontend | |
| - name: Ensure docker-compose is available | |
| run: | | |
| docker version | |
| docker compose version | |
| - name: Start docker-compose services | |
| run: docker-compose -f server/database/docker-compose.yml up -d | |
| - name: Wait for sentiment endpoint (http://localhost:8080/analyze/hello%20world) | |
| run: | | |
| set -e | |
| url="http://localhost:8080/analyze/hello%20world" | |
| echo "Waiting for $url" | |
| n=0 | |
| max=30 | |
| until curl --silent --fail --show-error -o /tmp/sentiment_resp.txt "$url"; do | |
| n=$((n+1)) | |
| echo "Sentiment not ready, retry $n/$max..." | |
| if [ $n -ge $max ]; then | |
| echo "Sentiment endpoint failed to respond after $max attempts" | |
| exit 1 | |
| fi | |
| sleep 5 | |
| done | |
| echo "Sentiment OK:" | |
| cat /tmp/sentiment_resp.txt | |
| - name: Wait for Django proxy endpoint (http://localhost:8000/api/dealers/) | |
| run: | | |
| set -e | |
| url="http://localhost:8000/api/dealers/" | |
| echo "Waiting for $url" | |
| n=0 | |
| max=30 | |
| until curl --silent --fail --show-error -o /tmp/django_resp.txt "$url"; do | |
| n=$((n+1)) | |
| echo "Django proxy not ready, retry $n/$max..." | |
| if [ $n -ge $max ]; then | |
| echo "Django proxy failed to respond after $max attempts" | |
| exit 1 | |
| fi | |
| sleep 5 | |
| done | |
| echo "Django proxy OK:" | |
| head -n 200 /tmp/django_resp.txt || true | |
| - name: Run Django tests inside container (if available) | |
| run: | | |
| set -e | |
| echo "Attempting to run Django tests inside django container" | |
| docker compose exec -T django sh -c "if [ -f manage.py ]; then python manage.py test --verbosity=2 || true; else echo 'No manage.py found in container'; fi" | |
| - name: Run Node (Express) tests inside container (if available) | |
| run: | | |
| set -e | |
| echo "Attempting to run Node tests inside express-service container" | |
| docker compose exec -T express-service sh -c "if [ -f package.json ] && grep -q '\"test\"' package.json; then npm test || true; else echo 'No tests defined or package.json missing'; fi" | |
| - name: Run lightweight smoke checks | |
| run: | | |
| echo "Smoke checks passed; services reachable." | |
| - name: Tear down docker compose (success) | |
| if: success() | |
| run: | | |
| docker compose logs --no-color > compose-success-logs.txt || true | |
| docker compose down -v || true | |
| - name: Upload compose success logs (on success) | |
| if: success() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: compose-success-logs | |
| path: compose-success-logs.txt | |
| - name: Collect docker-compose logs (always) | |
| if: always() | |
| run: | | |
| set +e | |
| docker compose logs --no-color > compose-logs.txt || true | |
| echo "Logs collected to compose-logs.txt" | |
| - name: Upload compose logs (always) | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: compose-logs | |
| path: compose-logs.txt | |
| - name: Upload compose logs on failure | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: compose-failure-logs | |
| path: compose-logs.txt |