name: Integration Tests on: push: branches: [ main, develop ] pull_request: branches: [ main ] schedule: # Run daily at 02:00 UTC - cron: '0 2 * * *' env: DOCKER_BUILDKIT: 1 COMPOSE_DOCKER_CLI_BUILD: 1 jobs: integration-tests: name: Docker Integration Tests runs-on: ubuntu-latest timeout-minutes: 30 strategy: matrix: test-suite: - "video_processing" - "procrastinate_worker" - "database_migration" steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Cache Docker layers uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y ffmpeg postgresql-client - name: Verify Docker and FFmpeg run: | docker --version docker-compose --version ffmpeg -version - name: Run integration tests run: | ./scripts/run-integration-tests.sh \ --test-filter "test_${{ matrix.test-suite }}" \ --timeout 1200 \ --verbose - name: Upload test logs if: failure() uses: actions/upload-artifact@v3 with: name: integration-test-logs-${{ matrix.test-suite }} path: test-reports/ retention-days: 7 - name: Upload test results if: always() uses: actions/upload-artifact@v3 with: name: integration-test-results-${{ matrix.test-suite }} path: htmlcov/ retention-days: 7 full-integration-test: name: Full Integration Test Suite runs-on: ubuntu-latest timeout-minutes: 45 needs: integration-tests steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y ffmpeg postgresql-client - name: Run complete integration test suite run: | ./scripts/run-integration-tests.sh \ --timeout 2400 \ --verbose - name: Generate test report if: always() run: | mkdir -p test-reports echo "# Integration Test Report" > test-reports/summary.md echo "- Date: $(date)" >> test-reports/summary.md echo "- Commit: ${{ github.sha }}" >> test-reports/summary.md echo "- Branch: ${{ github.ref_name }}" >> test-reports/summary.md - name: Upload complete test results if: always() uses: actions/upload-artifact@v3 with: name: complete-integration-test-results path: | test-reports/ htmlcov/ retention-days: 30 performance-test: name: Performance & Load Testing runs-on: ubuntu-latest timeout-minutes: 20 if: github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'performance') steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y ffmpeg postgresql-client - name: Run performance tests run: | ./scripts/run-integration-tests.sh \ --test-filter "performance" \ --timeout 1200 \ --verbose - name: Upload performance results if: always() uses: actions/upload-artifact@v3 with: name: performance-test-results path: test-reports/ retention-days: 14 docker-security-scan: name: Docker Security Scan runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout code uses: actions/checkout@v4 - name: Build Docker image run: | docker build -t video-processor:test . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: image-ref: 'video-processor:test' format: 'sarif' output: 'trivy-results.sarif' - name: Upload Trivy scan results uses: github/codeql-action/upload-sarif@v2 if: always() with: sarif_file: 'trivy-results.sarif' notify-status: name: Notify Test Status runs-on: ubuntu-latest needs: [integration-tests, full-integration-test] if: always() steps: - name: Notify success if: needs.integration-tests.result == 'success' && needs.full-integration-test.result == 'success' run: | echo "✅ All integration tests passed successfully!" - name: Notify failure if: needs.integration-tests.result == 'failure' || needs.full-integration-test.result == 'failure' run: | echo "❌ Integration tests failed. Check the logs for details." exit 1