Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
0dc767a
Merge pull request #65 from usnavy13/dev
usnavy13 Mar 3, 2026
fb046fa
chore(deps): Bump python-dotenv from 1.2.1 to 1.2.2
dependabot[bot] Mar 6, 2026
c612471
Merge pull request #73 from usnavy13/dev
usnavy13 Mar 11, 2026
553b34c
Merge pull request #76 from usnavy13/dev
usnavy13 Mar 13, 2026
6a68ec0
chore(deps): Bump uvicorn[standard] from 0.41.0 to 0.42.0
dependabot[bot] Mar 20, 2026
c8f2df8
chore(deps): Bump fastapi from 0.129.0 to 0.135.2
dependabot[bot] Mar 27, 2026
2571113
chore(deps): Bump redis from 7.2.0 to 7.4.0
dependabot[bot] Mar 27, 2026
273f170
chore(deps): Bump pytest-cov from 4.1.0 to 7.1.0
dependabot[bot] Mar 27, 2026
4dc8883
Merge pull request #82 from usnavy13/dev
usnavy13 Apr 10, 2026
5bd8910
Merge pull request #83 from usnavy13/dev
usnavy13 Apr 10, 2026
bd6c7cb
chore(deps): Bump pytest from 9.0.2 to 9.0.3
dependabot[bot] Apr 14, 2026
fe92d13
Merge remote-tracking branch 'origin/dependabot/pip/python-dotenv-1.2…
usnavy13 May 7, 2026
a0f1838
Merge remote-tracking branch 'origin/dependabot/pip/pytest-9.0.3' int…
usnavy13 May 7, 2026
31e2fae
Merge remote-tracking branch 'origin/dependabot/pip/uvicorn-standard-…
usnavy13 May 7, 2026
980d473
Merge remote-tracking branch 'origin/dependabot/pip/redis-7.4.0' into…
usnavy13 May 7, 2026
ece6478
Merge remote-tracking branch 'origin/dependabot/pip/pytest-cov-7.1.0'…
usnavy13 May 7, 2026
2724c97
Merge remote-tracking branch 'origin/dependabot/pip/fastapi-0.135.2' …
usnavy13 May 7, 2026
74bb001
chore: Simplify CI/CD — remove nightly, lean PR checks, keep release …
usnavy13 May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
330 changes: 4 additions & 326 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ name: CI
on:
pull_request:
branches: [main, dev]
push:
branches: [main, dev]
tags: ["v*.*.*"]
merge_group:

concurrency:
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
Expand All @@ -17,33 +13,8 @@ permissions:

env:
PYTHON_VERSION: "3.11"
LOCAL_API_IMAGE_AMD64: code-interpreter:ci-amd64
LOCAL_API_IMAGE_ARM64: code-interpreter:ci-arm64

jobs:
changes:
runs-on: ubuntu-latest
outputs:
runtime: ${{ steps.filter.outputs.runtime }}
container: ${{ steps.filter.outputs.container }}
steps:
- uses: actions/checkout@v4

- id: filter
uses: dorny/paths-filter@v3
with:
filters: |
runtime:
- 'Dockerfile'
- 'docker/requirements/**'
container:
- 'Dockerfile'
- 'docker/**'
- 'src/**'
- 'dashboard/**'
- 'requirements.txt'
- 'docker-compose.yml'

static:
runs-on: ubuntu-latest
steps:
Expand Down Expand Up @@ -91,48 +62,9 @@ jobs:
pip install pytest pytest-asyncio pytest-cov pytest-mock

- name: Run unit tests
run: |
mkdir -p test-results
pytest tests/unit/ --junitxml=test-results/unit.xml

- name: Upload unit results
if: always()
uses: actions/upload-artifact@v4
with:
name: unit-results
path: test-results/
if-no-files-found: ignore

integration-contract:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v6
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: pip
run: pytest tests/unit/

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-asyncio pytest-cov pytest-mock

- name: Run contract integration tests
run: |
mkdir -p test-results
pytest tests/integration/ -m contract_only --junitxml=test-results/integration-contract.xml

- name: Upload contract integration results
if: always()
uses: actions/upload-artifact@v4
with:
name: integration-contract-results
path: test-results/
if-no-files-found: ignore

integration-core:
integration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand All @@ -148,259 +80,5 @@ jobs:
pip install -r requirements.txt
pip install pytest pytest-asyncio pytest-cov pytest-mock

- name: Run core integration tests
run: |
mkdir -p test-results
pytest tests/integration/ -m "not contract_only" --junitxml=test-results/integration-core.xml

- name: Upload core integration results
if: always()
uses: actions/upload-artifact@v4
with:
name: integration-core-results
path: test-results/
if-no-files-found: ignore

build-app-amd64:
needs: [changes]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4

- uses: docker/setup-buildx-action@v3

- name: Build amd64 app candidate
run: |
docker buildx build \
--load \
--target app \
--tag "${LOCAL_API_IMAGE_AMD64}" \
--cache-from "type=gha,scope=app-amd64" \
--cache-to "type=gha,scope=app-amd64,mode=max" \
.

- name: Inspect amd64 image
run: docker image inspect "${LOCAL_API_IMAGE_AMD64}" >/dev/null

functional-smoke-amd64:
needs: [changes]
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v6
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: pip

- uses: docker/setup-buildx-action@v3

- name: Install test dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-asyncio pytest-cov pytest-mock

- name: Build local amd64 test image
run: |
docker buildx build \
--load \
--target app \
--tag "${LOCAL_API_IMAGE_AMD64}" \
--cache-from "type=gha,scope=app-amd64" \
--cache-to "type=gha,scope=app-amd64,mode=max" \
.

- name: Start live stack
env:
API_IMAGE: ${{ env.LOCAL_API_IMAGE_AMD64 }}
run: |
cp .env.example .env
docker compose up -d

- name: Wait for API
run: |
if ! scripts/ci/wait_for_api.sh http://localhost:8000/health 24 5; then
docker compose logs --no-color api
exit 1
fi

- name: Run live smoke tests
env:
API_BASE: http://localhost:8000
API_KEY: your-secure-api-key-here-change-this-in-production
run: |
mkdir -p test-results
pytest tests/functional/ \
-m "live_api and not slow and not client_replay" \
-v \
--junitxml=test-results/functional-smoke-amd64.xml

- name: Capture compose logs on failure
if: failure()
run: docker compose logs --no-color > compose-amd64.log

- name: Upload functional smoke artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: functional-smoke-amd64
path: |
test-results/
compose-amd64.log
if-no-files-found: ignore

- name: Stop live stack
if: always()
run: docker compose down -v

client-replay-amd64:
needs: [changes]
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v6
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: pip

- uses: docker/setup-buildx-action@v3

- name: Install test dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-asyncio pytest-cov pytest-mock

- name: Build local amd64 replay image
run: |
docker buildx build \
--load \
--target app \
--tag "${LOCAL_API_IMAGE_AMD64}" \
--cache-from "type=gha,scope=app-amd64" \
--cache-to "type=gha,scope=app-amd64,mode=max" \
.

- name: Start live stack
env:
API_IMAGE: ${{ env.LOCAL_API_IMAGE_AMD64 }}
run: |
cp .env.example .env
docker compose up -d

- name: Wait for API
run: |
if ! scripts/ci/wait_for_api.sh http://localhost:8000/health 24 5; then
docker compose logs --no-color api
exit 1
fi

- name: Run client replay tests
env:
API_BASE: http://localhost:8000
API_KEY: your-secure-api-key-here-change-this-in-production
run: |
mkdir -p test-results
pytest tests/functional/ \
-m client_replay \
-v \
--junitxml=test-results/client-replay-amd64.xml

- name: Capture compose logs on failure
if: failure()
run: docker compose logs --no-color > compose-client-replay.log

- name: Upload client replay artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: client-replay-amd64
path: |
test-results/
compose-client-replay.log
if-no-files-found: ignore

- name: Stop live stack
if: always()
run: docker compose down -v

arm64-smoke-conditional:
if: needs.changes.outputs.container == 'true'
needs: [changes]
runs-on: ubuntu-24.04-arm
timeout-minutes: 35
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v6
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: pip

- uses: docker/setup-buildx-action@v3

- name: Install test dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-asyncio pytest-cov pytest-mock

- name: Build local arm64 test image
run: |
docker buildx build \
--load \
--target app \
--tag "${LOCAL_API_IMAGE_ARM64}" \
--cache-from "type=gha,scope=app-arm64" \
--cache-to "type=gha,scope=app-arm64,mode=max" \
.

- name: Start live stack
env:
API_IMAGE: ${{ env.LOCAL_API_IMAGE_ARM64 }}
run: |
cp .env.example .env
docker compose up -d

- name: Wait for API
run: |
if ! scripts/ci/wait_for_api.sh http://localhost:8000/health 24 5; then
docker compose logs --no-color api
exit 1
fi

- name: Run arm64 smoke suite
env:
API_BASE: http://localhost:8000
API_KEY: your-secure-api-key-here-change-this-in-production
run: |
mkdir -p test-results
pytest \
tests/functional/test_health.py \
tests/functional/test_exec_workflow.py::TestSessionWorkflow::test_execution_creates_session \
tests/functional/test_files.py::TestFileUpload::test_upload_single_file \
tests/functional/test_ptc.py::TestPTCInitialExecution::test_ptc_simple_code_completes \
-v \
--junitxml=test-results/arm64-smoke.xml

- name: Capture compose logs on failure
if: failure()
run: docker compose logs --no-color > compose-arm64.log

- name: Upload arm64 smoke artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: arm64-smoke
path: |
test-results/
compose-arm64.log
if-no-files-found: ignore

- name: Stop live stack
if: always()
run: docker compose down -v
- name: Run integration tests
run: pytest tests/integration/
Loading
Loading