Skip to content

ci: fix CI pipeline to use docker compose network instead of isolated… #117

ci: fix CI pipeline to use docker compose network instead of isolated…

ci: fix CI pipeline to use docker compose network instead of isolated… #117

Workflow file for this run

# 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