fetch_ml/.forgejo/workflows/contract-test.yml
Jeremie Fraeys 96c4c376d8
ci(forgejo): add contract tests and docs deployment
- Add contract-test.yml workflow for API contract testing
- Add docs-deploy.yml for automated documentation deployment
2026-02-20 15:51:29 -05:00

120 lines
3.2 KiB
YAML

name: Contract Tests
on:
workflow_dispatch:
push:
paths:
- 'api/openapi.yaml'
- 'internal/api/server_gen.go'
- 'internal/api/adapter.go'
- '.forgejo/workflows/contract-test.yml'
pull_request:
paths:
- 'api/openapi.yaml'
- 'internal/api/server_gen.go'
- 'internal/api/adapter.go'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
env:
GO_VERSION: '1.25.0'
jobs:
spec-drift-check:
name: Spec Drift Detection
runs-on: self-hosted
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Set up Go
run: |
go version || (wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz && \
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz)
echo "PATH=$PATH:/usr/local/go/bin" >> $GITHUB_ENV
go version
- name: Install oapi-codegen
run: |
go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest
echo "PATH=$PATH:$(go env GOPATH)/bin" >> $GITHUB_ENV
- name: Verify spec matches implementation
run: make openapi-check-implementation
contract-test:
name: API Contract Tests
runs-on: self-hosted
timeout-minutes: 15
needs: spec-drift-check
services:
redis:
image: redis:7
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Set up Go
run: |
go version || (wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz && \
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz)
echo "PATH=$PATH:/usr/local/go/bin" >> $GITHUB_ENV
go version
- name: Build API server
run: |
go build -o api-server ./cmd/api-server
- name: Start API server
run: |
./api-server --config configs/api/dev-local.yaml &
echo "API_PID=$!" >> $GITHUB_ENV
sleep 5
- name: Install schemathesis
run: |
pip install schemathesis
- name: Run contract tests
run: |
schemathesis run api/openapi.yaml \
--base-url http://localhost:8080 \
--checks all \
--max-response-time 5000 \
--hypothesis-max-examples 50
continue-on-error: true # Allow failures until all endpoints are fully implemented
- name: Stop API server
if: always()
run: |
if [ -n "$API_PID" ]; then
kill $API_PID || true
fi
- name: Basic endpoint verification
run: |
echo "Testing /health endpoint..."
curl -s http://localhost:8080/health || echo "Server not running, skipping"
echo "Testing /v1/experiments endpoint..."
curl -s http://localhost:8080/v1/experiments || echo "Server not running, skipping"
echo "Testing /v1/tasks endpoint..."
curl -s http://localhost:8080/v1/tasks || echo "Server not running, skipping"
continue-on-error: true