From fb046fad2801a3401daf469573c397917a437d0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 07:15:13 +0000 Subject: [PATCH 1/7] chore(deps): Bump python-dotenv from 1.2.1 to 1.2.2 Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/theskumar/python-dotenv/releases) - [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md) - [Commits](https://github.com/theskumar/python-dotenv/compare/v1.2.1...v1.2.2) --- updated-dependencies: - dependency-name: python-dotenv dependency-version: 1.2.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d81d69..5e1b59f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,7 +35,7 @@ flake8==7.3.0 mypy==1.19.1 # Environment management -python-dotenv==1.2.1 +python-dotenv==1.2.2 # Logging structlog==25.5.0 From 6a68ec0bb8b81a9b4b08b1aedb740d5e354e1391 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 07:14:24 +0000 Subject: [PATCH 2/7] chore(deps): Bump uvicorn[standard] from 0.41.0 to 0.42.0 Bumps [uvicorn[standard]](https://github.com/Kludex/uvicorn) from 0.41.0 to 0.42.0. - [Release notes](https://github.com/Kludex/uvicorn/releases) - [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/uvicorn/compare/0.41.0...0.42.0) --- updated-dependencies: - dependency-name: uvicorn[standard] dependency-version: 0.42.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d81d69..42795d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ requests>=2.31.0,<3 # Core API framework fastapi==0.129.0 -uvicorn[standard]==0.41.0 +uvicorn[standard]==0.42.0 # Data validation and serialization pydantic==2.12.5 From c8f2df8942f931215956192b38fcbabc0ebc5c41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:14:36 +0000 Subject: [PATCH 3/7] chore(deps): Bump fastapi from 0.129.0 to 0.135.2 Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.129.0 to 0.135.2. - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](https://github.com/fastapi/fastapi/compare/0.129.0...0.135.2) --- updated-dependencies: - dependency-name: fastapi dependency-version: 0.135.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d81d69..8a5b450 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ requests>=2.31.0,<3 # Core API framework -fastapi==0.129.0 +fastapi==0.135.2 uvicorn[standard]==0.41.0 # Data validation and serialization From 2571113a80501af7071cf951bdad373979bedefb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:14:46 +0000 Subject: [PATCH 4/7] chore(deps): Bump redis from 7.2.0 to 7.4.0 Bumps [redis](https://github.com/redis/redis-py) from 7.2.0 to 7.4.0. - [Release notes](https://github.com/redis/redis-py/releases) - [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES) - [Commits](https://github.com/redis/redis-py/compare/v7.2.0...v7.4.0) --- updated-dependencies: - dependency-name: redis dependency-version: 7.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d81d69..007ae23 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ pydantic-settings==2.13.1 httpx==0.28.1 # Redis for session management -redis==7.2.0 +redis==7.4.0 # SQLite async support for metrics aiosqlite>=0.19.0 From 273f1708eefcb292f8478b3affab224dbd06e717 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:14:51 +0000 Subject: [PATCH 5/7] chore(deps): Bump pytest-cov from 4.1.0 to 7.1.0 Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 4.1.0 to 7.1.0. - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v4.1.0...v7.1.0) --- updated-dependencies: - dependency-name: pytest-cov dependency-version: 7.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d81d69..0ca6236 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,7 +26,7 @@ python-dateutil==2.9.0.post0 # Testing framework pytest==9.0.2 pytest-asyncio==1.3.0 -pytest-cov==4.1.0 +pytest-cov==7.1.0 pytest-mock==3.15.1 # Development tools From bd6c7cb56835ba7b8dd82cfbb167bb1cc8555a70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 02:28:38 +0000 Subject: [PATCH 6/7] chore(deps): Bump pytest from 9.0.2 to 9.0.3 Bumps [pytest](https://github.com/pytest-dev/pytest) from 9.0.2 to 9.0.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/9.0.2...9.0.3) --- updated-dependencies: - dependency-name: pytest dependency-version: 9.0.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d81d69..1be40e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,7 +24,7 @@ python-dateutil==2.9.0.post0 # Testing framework -pytest==9.0.2 +pytest==9.0.3 pytest-asyncio==1.3.0 pytest-cov==4.1.0 pytest-mock==3.15.1 From 74bb00160fe41fd4326d827fc41e72385639aff5 Mon Sep 17 00:00:00 2001 From: Joe Licata Date: Thu, 7 May 2026 02:11:56 +0000 Subject: [PATCH 7/7] =?UTF-8?q?chore:=20Simplify=20CI/CD=20=E2=80=94=20rem?= =?UTF-8?q?ove=20nightly,=20lean=20PR=20checks,=20keep=20release=20pipelin?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove nightly.yml entirely - Slim ci.yml from 11 jobs to 3 (static, unit, integration) — PR checks only, no Docker builds - Release.yml (unchanged) handles multi-arch image builds on merge to main/dev Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/ci.yml | 330 +--------------------------------- .github/workflows/nightly.yml | 232 ------------------------ 2 files changed, 4 insertions(+), 558 deletions(-) delete mode 100644 .github/workflows/nightly.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8764169..da2301b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 }} @@ -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: @@ -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 @@ -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/ diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml deleted file mode 100644 index e598c08..0000000 --- a/.github/workflows/nightly.yml +++ /dev/null @@ -1,232 +0,0 @@ -name: Nightly Validation - -on: - schedule: - - cron: '23 4 * * *' - workflow_dispatch: - -concurrency: - group: nightly-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - -env: - PYTHON_VERSION: "3.11" - LOCAL_API_IMAGE_AMD64: code-interpreter:nightly-amd64 - LOCAL_API_IMAGE_ARM64: code-interpreter:nightly-arm64 - -jobs: - full-live-amd64: - runs-on: ubuntu-24.04 - timeout-minutes: 75 - 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 nightly amd64 image - run: | - docker buildx build \ - --load \ - --target app \ - --tag "${LOCAL_API_IMAGE_AMD64}" \ - --cache-from "type=gha,scope=nightly-app-amd64" \ - --cache-to "type=gha,scope=nightly-app-amd64,mode=max" \ - . - - - name: Start nightly 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 full live functional 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/ -m live_api -v --junitxml=test-results/nightly-full-live-amd64.xml - - - name: Capture compose logs on failure - if: failure() - run: docker compose logs --no-color > nightly-full-amd64.log - - - name: Upload nightly full artifacts - if: always() - uses: actions/upload-artifact@v4 - with: - name: nightly-full-live-amd64 - path: | - test-results/ - nightly-full-amd64.log - if-no-files-found: ignore - - - name: Stop nightly stack - if: always() - run: docker compose down -v - - slow-live-amd64: - runs-on: ubuntu-24.04 - timeout-minutes: 75 - 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 nightly amd64 image - run: | - docker buildx build \ - --load \ - --target app \ - --tag "${LOCAL_API_IMAGE_AMD64}" \ - --cache-from "type=gha,scope=nightly-app-amd64" \ - --cache-to "type=gha,scope=nightly-app-amd64,mode=max" \ - . - - - name: Start nightly 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 slow live 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/ -m slow -v --junitxml=test-results/nightly-slow-live-amd64.xml - - - name: Capture compose logs on failure - if: failure() - run: docker compose logs --no-color > nightly-slow-amd64.log - - - name: Upload nightly slow artifacts - if: always() - uses: actions/upload-artifact@v4 - with: - name: nightly-slow-live-amd64 - path: | - test-results/ - nightly-slow-amd64.log - if-no-files-found: ignore - - - name: Stop nightly stack - if: always() - run: docker compose down -v - - arm64-smoke: - runs-on: ubuntu-24.04-arm - timeout-minutes: 40 - 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 nightly arm64 image - run: | - docker buildx build \ - --load \ - --target app \ - --tag "${LOCAL_API_IMAGE_ARM64}" \ - --cache-from "type=gha,scope=nightly-app-arm64" \ - --cache-to "type=gha,scope=nightly-app-arm64,mode=max" \ - . - - - name: Start nightly arm64 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 nightly 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/nightly-arm64-smoke.xml - - - name: Capture compose logs on failure - if: failure() - run: docker compose logs --no-color > nightly-arm64.log - - - name: Upload nightly arm64 artifacts - if: always() - uses: actions/upload-artifact@v4 - with: - name: nightly-arm64-smoke - path: | - test-results/ - nightly-arm64.log - if-no-files-found: ignore - - - name: Stop nightly arm64 stack - if: always() - run: docker compose down -v