ci: fix CI pipeline to use docker compose network instead of isolated… #117
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
| # name: CI Pipeline | |
| # on: | |
| # push: | |
| # branches: [main, develop] | |
| # pull_request: | |
| # branches: [main, develop] | |
| # jobs: | |
| # test: | |
| # runs-on: ubuntu-latest | |
| # strategy: | |
| # matrix: | |
| # node-version: [18.x, 20.x] | |
| # services: | |
| # postgres: | |
| # image: postgres:16-alpine | |
| # env: | |
| # POSTGRES_USER: hooktrace | |
| # POSTGRES_PASSWORD: hooktrace_test | |
| # POSTGRES_DB: hooktrace_test | |
| # options: >- | |
| # --health-cmd pg_isready | |
| # --health-interval 10s | |
| # --health-timeout 5s | |
| # --health-retries 5 | |
| # ports: | |
| # - 5432:5432 | |
| # redis: | |
| # image: redis:7-alpine | |
| # options: >- | |
| # --health-cmd "redis-cli ping" | |
| # --health-interval 10s | |
| # --health-timeout 5s | |
| # --health-retries 5 | |
| # ports: | |
| # - 6379:6379 | |
| # env: | |
| # DATABASE_URL: postgresql://hooktrace:hooktrace_test@localhost:5432/hooktrace_test | |
| # REDIS_URL: redis://localhost:6379 | |
| # steps: | |
| # - uses: actions/checkout@v4 | |
| # # ---------- Node ---------- | |
| # - name: Setup Node.js ${{ matrix.node-version }} | |
| # uses: actions/setup-node@v4 | |
| # with: | |
| # node-version: ${{ matrix.node-version }} | |
| # cache: npm | |
| # - name: Install Node dependencies | |
| # run: npm ci | |
| # - name: Lint Node code | |
| # run: npm run lint | |
| # - name: Run Node tests | |
| # run: npm test | |
| # - name: Build Node app | |
| # run: npm run build | |
| # # ---------- Python ---------- | |
| # - name: Setup Python | |
| # uses: actions/setup-python@v5 | |
| # with: | |
| # python-version: "3.11" | |
| # - name: Install Python dependencies | |
| # run: | | |
| # pip install -r services/worker/requirements.txt | |
| # - name: Lint Python (ruff) | |
| # run: | | |
| # pip install ruff | |
| # ruff check services/worker | |
| # - name: Test Python worker | |
| # run: | | |
| # pytest services/worker || true | |
| # docker-build: | |
| # runs-on: ubuntu-latest | |
| # needs: test | |
| # if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| # steps: | |
| # - uses: actions/checkout@v4 | |
| # - name: Set up Docker Buildx | |
| # uses: docker/setup-buildx-action@v3 | |
| # - name: Build Docker image | |
| # uses: docker/build-push-action@v5 | |
| # with: | |
| # context: . | |
| # push: false | |
| # tags: hooktrace:latest | |
| # cache-from: type=gha | |
| # cache-to: type=gha,mode=max | |
| # - name: Verify container starts | |
| # run: | | |
| # docker run -d -p 3000:3000 hooktrace:latest | |
| # sleep 10 | |
| # docker ps | |
| # name: CI Pipeline | |
| # on: | |
| # push: | |
| # branches: [main, develop] | |
| # pull_request: | |
| # branches: [main, develop] | |
| # jobs: | |
| # infra-check: | |
| # runs-on: ubuntu-latest | |
| # services: | |
| # postgres: | |
| # image: postgres:16-alpine | |
| # env: | |
| # POSTGRES_USER: hooktrace | |
| # POSTGRES_PASSWORD: hooktrace_test | |
| # POSTGRES_DB: hooktrace_test | |
| # options: >- | |
| # --health-cmd pg_isready | |
| # --health-interval 10s | |
| # --health-timeout 5s | |
| # --health-retries 5 | |
| # ports: | |
| # - 5432:5432 | |
| # redis: | |
| # image: redis:7-alpine | |
| # options: >- | |
| # --health-cmd "redis-cli ping" | |
| # --health-interval 10s | |
| # --health-timeout 5s | |
| # --health-retries 5 | |
| # ports: | |
| # - 6379:6379 | |
| # steps: | |
| # - uses: actions/checkout@v4 | |
| # - name: Check Docker Compose config | |
| # run: docker compose config | |
| # - name: Verify Postgres is reachable | |
| # run: | | |
| # sudo apt-get install -y postgresql-client | |
| # PGPASSWORD=hooktrace_test psql -h localhost -U hooktrace -d hooktrace_test -c "SELECT 1;" | |
| # - name: Verify Redis is reachable | |
| # run: | | |
| # sudo apt-get install -y redis-tools | |
| # redis-cli -h localhost ping | |
| # name: CI Pipeline | |
| # on: | |
| # push: | |
| # branches: [main, develop] | |
| # pull_request: | |
| # branches: [main, develop] | |
| # jobs: | |
| # infra-check: | |
| # runs-on: ubuntu-latest | |
| # services: | |
| # postgres: | |
| # image: postgres:16-alpine | |
| # env: | |
| # POSTGRES_USER: hooktrace | |
| # POSTGRES_PASSWORD: hooktrace_test | |
| # POSTGRES_DB: hooktrace_test | |
| # options: >- | |
| # --health-cmd pg_isready | |
| # --health-interval 10s | |
| # --health-timeout 5s | |
| # --health-retries 5 | |
| # ports: | |
| # - 5432:5432 | |
| # redis: | |
| # image: redis:7-alpine | |
| # options: >- | |
| # --health-cmd "redis-cli ping" | |
| # --health-interval 10s | |
| # --health-timeout 5s | |
| # --health-retries 5 | |
| # ports: | |
| # - 6379:6379 | |
| # steps: | |
| # - uses: actions/checkout@v4 | |
| # - name: Check Docker Compose config | |
| # run: docker compose config | |
| # # Wait a bit for services to be fully ready | |
| # - name: Wait for services | |
| # run: sleep 5 | |
| # # Postgres check via container (no apt install) | |
| # - name: Verify Postgres is reachable | |
| # run: | | |
| # POSTGRES_CONTAINER=$(docker ps --filter "ancestor=postgres:16-alpine" --format "{{.ID}}" | head -n 1) | |
| # docker exec $POSTGRES_CONTAINER psql -U hooktrace -d hooktrace_test -c "SELECT 1;" | |
| # # Redis check via container (no apt install) | |
| # - name: Verify Redis is reachable | |
| # run: | | |
| # REDIS_CONTAINER=$(docker ps --filter "ancestor=redis:7-alpine" --format "{{.ID}}" | head -n 1) | |
| # docker exec $REDIS_CONTAINER redis-cli ping | |
| name: CI Pipeline | |
| on: | |
| push: | |
| branches: [main, develop] | |
| pull_request: | |
| branches: [main, develop] | |
| jobs: | |
| infra-check: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| # ------------------------------- | |
| # BUILD & START SERVICES | |
| # ------------------------------- | |
| - name: Build and start all services | |
| run: | | |
| docker compose up -d --build postgres redis api | |
| env: | |
| DATABASE_URL: postgresql://hooktrace:hooktrace_dev@postgres:5432/hooktrace | |
| REDIS_URL: redis://redis:6379 | |
| - name: Wait for Postgres to be healthy | |
| run: | | |
| echo "Waiting for Postgres..." | |
| for i in $(seq 1 20); do | |
| docker exec hooktrace-db pg_isready -U hooktrace && break | |
| echo " attempt $i/20 — not ready yet" | |
| sleep 3 | |
| done | |
| - name: Wait for Redis to be healthy | |
| run: | | |
| echo "Waiting for Redis..." | |
| for i in $(seq 1 20); do | |
| docker exec hooktrace-redis redis-cli ping | grep -q PONG && break | |
| echo " attempt $i/20 — not ready yet" | |
| sleep 3 | |
| done | |
| - name: Wait for API to be healthy | |
| run: | | |
| echo "Waiting for API..." | |
| for i in $(seq 1 20); do | |
| curl -sf http://localhost:3001/health && break | |
| echo " attempt $i/20 — not ready yet" | |
| sleep 5 | |
| done | |
| # ------------------------------- | |
| # VERIFY SERVICES | |
| # ------------------------------- | |
| - name: Verify Postgres is reachable | |
| run: | | |
| docker exec hooktrace-db psql -U hooktrace -d hooktrace -c "SELECT 1;" | |
| - name: Verify Redis is reachable | |
| run: | | |
| docker exec hooktrace-redis redis-cli ping | |
| - name: Debug API logs (pre-test) | |
| run: docker logs hooktrace-api | |
| # ------------------------------- | |
| # SYSTEM INTEGRATION TEST | |
| # ------------------------------- | |
| - name: Send test webhook | |
| run: | | |
| RESPONSE=$(curl -s -o /tmp/webhook_response.txt -w "%{http_code}" \ | |
| -X POST http://localhost:3001/webhook \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"event":"ci_test","data":{"source":"github-actions"}}') | |
| echo "Response code: $RESPONSE" | |
| echo "Response body: $(cat /tmp/webhook_response.txt)" | |
| if [ "$RESPONSE" -ge 400 ]; then | |
| echo "Webhook failed with status $RESPONSE" | |
| exit 1 | |
| fi | |
| - name: Wait for processing | |
| run: sleep 5 | |
| - name: Verify webhook stored in DB | |
| run: | | |
| docker exec hooktrace-db psql -U hooktrace -d hooktrace -c \ | |
| "SELECT * FROM events ORDER BY created_at DESC LIMIT 1;" | |
| # ------------------------------- | |
| # TEARDOWN | |
| # ------------------------------- | |
| - name: Show all container logs on failure | |
| if: failure() | |
| run: | | |
| echo "=== API logs ===" && docker logs hooktrace-api || true | |
| echo "=== DB logs ===" && docker logs hooktrace-db || true | |
| echo "=== Redis logs ===" && docker logs hooktrace-redis || true | |
| - name: Stop all services | |
| if: always() | |
| run: docker compose down -v |