chore(deps): bump actions/cache from 5 to 6 #206
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 | |
| on: | |
| push: | |
| branches: | |
| - main | |
| pull_request: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: "37 6 * * *" | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: ci-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| main-ci: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-main-ci-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Compile | |
| run: mix compile --warnings-as-errors | |
| - name: Test | |
| run: mix test --exclude integration --exclude docs_contract --include requires_clean_workspace | |
| repo-hygiene: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - name: Validate release-please-config.json | |
| run: jq empty release-please-config.json | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| priv/plts | |
| key: ${{ runner.os }}-quality-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Run repository hygiene gate (`mix verify --exclude integration`) | |
| run: mix verify --exclude integration | |
| release-truth: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-release-truth-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Run release-truth gate (`mix verify.phase11`) | |
| run: mix verify.phase11 | |
| phase99-trust: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-phase99-trust-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Run phase99 trust gate (`mix verify.phase99`) | |
| run: mix verify.phase99 | |
| compatibility-truth: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - elixir-version: "1.17.3" | |
| otp-version: "26.2.5" | |
| - elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: ${{ matrix.elixir-version }} | |
| otp-version: ${{ matrix.otp-version }} | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-compatibility-truth-${{ matrix.elixir-version }}-${{ matrix.otp-version }}-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Compile | |
| run: mix compile --warnings-as-errors | |
| - name: Test | |
| run: mix test --exclude integration --exclude docs_contract --include requires_clean_workspace | |
| deep-quality: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| priv/plts | |
| key: ${{ runner.os }}-deep-quality-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Compile scrypath_ops without optional deps (SIGRA-02) | |
| working-directory: scrypath_ops | |
| env: | |
| MIX_ENV: test | |
| run: | | |
| mix deps.get | |
| mix compile --no-optional-deps --warnings-as-errors | |
| - name: Run namespace fence (`mix scrypath.namespace_fence`) | |
| run: mix scrypath.namespace_fence | |
| - name: Audit Hex dependencies | |
| run: mix hex.audit | |
| - name: Run Dialyzer | |
| run: mix dialyzer | |
| adopter-verify: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-adopter-verify-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Adopter verify (`mix verify.adopter`) | |
| run: mix verify.adopter | |
| phase5-verification: | |
| runs-on: ubuntu-latest | |
| services: | |
| meilisearch: | |
| image: getmeili/meilisearch:v1.15 | |
| ports: | |
| - 7700:7700 | |
| env: | |
| MEILI_NO_ANALYTICS: "true" | |
| env: | |
| SCRYPATH_INTEGRATION: "1" | |
| SCRYPATH_MEILISEARCH_URL: http://127.0.0.1:7700 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-phase5-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Wait for Meilisearch | |
| run: | | |
| for _ in $(seq 1 30); do | |
| if curl --silent --fail "$SCRYPATH_MEILISEARCH_URL/health" >/dev/null; then | |
| exit 0 | |
| fi | |
| sleep 2 | |
| done | |
| echo "Meilisearch failed to start" | |
| exit 1 | |
| - name: Backfill + integration verification (`mix verify.phase5`) | |
| run: mix verify.phase5 | |
| phase13-verification: | |
| runs-on: ubuntu-latest | |
| services: | |
| meilisearch: | |
| image: getmeili/meilisearch:v1.15 | |
| ports: | |
| - 7700:7700 | |
| env: | |
| MEILI_NO_ANALYTICS: "true" | |
| env: | |
| SCRYPATH_INTEGRATION: "1" | |
| SCRYPATH_MEILISEARCH_URL: http://127.0.0.1:7700 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.0" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-phase13-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Wait for Meilisearch | |
| run: | | |
| for _ in $(seq 1 30); do | |
| if curl --silent --fail "$SCRYPATH_MEILISEARCH_URL/health" >/dev/null; then | |
| exit 0 | |
| fi | |
| sleep 2 | |
| done | |
| echo "Meilisearch failed to start" | |
| exit 1 | |
| - name: Operator integration verification (`mix verify.phase13`) | |
| run: mix verify.phase13 | |
| meilisearch-smoke: | |
| runs-on: ubuntu-latest | |
| services: | |
| meilisearch: | |
| image: getmeili/meilisearch:v1.15 | |
| ports: | |
| - 7700:7700 | |
| env: | |
| MEILI_NO_ANALYTICS: "true" | |
| env: | |
| SCRYPATH_INTEGRATION: "1" | |
| SCRYPATH_MEILISEARCH_URL: http://127.0.0.1:7700 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| key: ${{ runner.os }}-meilisearch-smoke-${{ hashFiles('mix.lock') }} | |
| - name: Install dependencies | |
| run: mix deps.get | |
| - name: Wait for Meilisearch | |
| run: | | |
| for _ in $(seq 1 30); do | |
| if curl --silent --fail "$SCRYPATH_MEILISEARCH_URL/health" >/dev/null; then | |
| exit 0 | |
| fi | |
| sleep 2 | |
| done | |
| echo "Meilisearch failed to start" | |
| exit 1 | |
| - name: Run Meilisearch integration smoke | |
| run: mix verify.meilisearch_smoke | |
| phoenix-example-integration: | |
| runs-on: ubuntu-latest | |
| services: | |
| postgres: | |
| image: postgres:16-alpine | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| ports: | |
| - 5433:5432 | |
| meilisearch: | |
| image: getmeili/meilisearch:v1.15 | |
| ports: | |
| - 7700:7700 | |
| env: | |
| MEILI_NO_ANALYTICS: "true" | |
| env: | |
| PGPORT: "5433" | |
| SCRYPATH_MEILISEARCH_URL: http://127.0.0.1:7700 | |
| SCRYPATH_EXAMPLE_INTEGRATION: "1" | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| examples/phoenix_meilisearch/deps | |
| examples/phoenix_meilisearch/_build | |
| key: ${{ runner.os }}-phx-example-${{ hashFiles('examples/phoenix_meilisearch/mix.lock') }}-${{ hashFiles('mix.lock') }} | |
| - name: Install postgres client (pg_isready) | |
| run: sudo apt-get update -qq && sudo apt-get install -y postgresql-client | |
| - name: Wait for Postgres | |
| run: | | |
| for _ in $(seq 1 60); do | |
| if pg_isready -h 127.0.0.1 -p "$PGPORT" -U postgres; then | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "Postgres failed to become ready" | |
| exit 1 | |
| - name: Wait for Meilisearch | |
| run: | | |
| for _ in $(seq 1 30); do | |
| if curl --silent --fail "$SCRYPATH_MEILISEARCH_URL/health" >/dev/null; then | |
| exit 0 | |
| fi | |
| sleep 2 | |
| done | |
| echo "Meilisearch failed to start" | |
| exit 1 | |
| - name: Phoenix example integration (`cd examples/phoenix_meilisearch && mix deps.get && mix test`) | |
| run: | | |
| cd examples/phoenix_meilisearch | |
| mix deps.get | |
| mix test | |
| # Path gate for OPSUI: always run on push to main; on pull_request only when | |
| # library or scrypath_ops paths change (see phase 47 CONTEXT D-03). | |
| scrypath-ops-path-check: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| run: ${{ steps.check.outputs.run }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - name: Decide whether OPSUI CI should run | |
| id: check | |
| shell: bash | |
| run: | | |
| if [[ "${GITHUB_EVENT_NAME}" == "push" && "${GITHUB_REF}" == "refs/heads/main" ]]; then | |
| echo "run=true" >> "$GITHUB_OUTPUT" | |
| exit 0 | |
| fi | |
| if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then | |
| git fetch origin "${GITHUB_BASE_REF}" --depth=1 | |
| if git diff --name-only "origin/${GITHUB_BASE_REF}...HEAD" | grep -qE '^(scrypath_ops/|lib/|mix\.exs|mix\.lock|scrypath_ops/mix\.lock)'; then | |
| echo "run=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "run=false" >> "$GITHUB_OUTPUT" | |
| fi | |
| exit 0 | |
| fi | |
| echo "run=false" >> "$GITHUB_OUTPUT" | |
| scrypath-ops: | |
| needs: scrypath-ops-path-check | |
| if: needs.scrypath-ops-path-check.outputs.run == 'true' | |
| runs-on: ubuntu-latest | |
| services: | |
| postgres: | |
| image: postgres:16-alpine | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| ports: | |
| - 5433:5432 | |
| env: | |
| PGPORT: "5433" | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| scrypath_ops/deps | |
| scrypath_ops/_build | |
| key: ${{ runner.os }}-scrypath-ops-${{ hashFiles('mix.lock', 'scrypath_ops/mix.lock') }} | |
| - name: Install postgres client (pg_isready) | |
| run: sudo apt-get update -qq && sudo apt-get install -y postgresql-client | |
| - name: Wait for Postgres | |
| run: | | |
| for _ in $(seq 1 60); do | |
| if pg_isready -h 127.0.0.1 -p "$PGPORT" -U postgres; then | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "Postgres failed to become ready" | |
| exit 1 | |
| - name: ScrypathOps tests | |
| run: | | |
| cd scrypath_ops | |
| mix deps.get | |
| mix test | |
| phase105-e2e: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| services: | |
| postgres: | |
| image: postgres:16-alpine | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| POSTGRES_DB: scrypath_ecommerce_test | |
| ports: | |
| - 5433:5432 | |
| meilisearch: | |
| image: getmeili/meilisearch:v1.15 | |
| ports: | |
| - 7700:7700 | |
| env: | |
| MEILI_NO_ANALYTICS: "true" | |
| env: | |
| MIX_ENV: test | |
| PGPORT: "5433" | |
| SCRYPATH_MEILISEARCH_URL: http://127.0.0.1:7700 | |
| PLAYWRIGHT_BASE_URL: http://127.0.0.1:4002 | |
| PHASE105_EVIDENCE_PATH: examples/scrypath_ecommerce/test-results/phase105-evidence.ndjson | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - uses: erlef/setup-beam@v1 | |
| with: | |
| elixir-version: "1.19.0" | |
| otp-version: "28.1" | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: "22" | |
| cache: npm | |
| cache-dependency-path: examples/scrypath_ecommerce/package-lock.json | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| deps | |
| _build | |
| examples/scrypath_ecommerce/deps | |
| examples/scrypath_ecommerce/_build | |
| key: ${{ runner.os }}-phase105-e2e-${{ hashFiles('mix.lock', 'examples/scrypath_ecommerce/mix.lock') }} | |
| - name: Install postgres client (pg_isready) | |
| run: sudo apt-get update -qq && sudo apt-get install -y postgresql-client | |
| - name: Wait for Postgres | |
| run: | | |
| for _ in $(seq 1 60); do | |
| if pg_isready -h 127.0.0.1 -p "$PGPORT" -U postgres; then | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "Postgres failed to become ready" | |
| exit 1 | |
| - name: Wait for Meilisearch | |
| run: | | |
| for _ in $(seq 1 60); do | |
| if curl --silent --fail "$SCRYPATH_MEILISEARCH_URL/health" >/dev/null; then | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "Meilisearch failed to become ready" | |
| exit 1 | |
| - name: Install root dependencies | |
| run: mix deps.get | |
| - name: Install example dependencies and prepare DB | |
| working-directory: examples/scrypath_ecommerce | |
| run: | | |
| mix deps.get | |
| mix e2e.prepare | |
| - name: Install Playwright dependencies | |
| working-directory: examples/scrypath_ecommerce | |
| run: | | |
| npm ci | |
| npx playwright install --with-deps chromium | |
| # priv/static/assets is gitignored and built by the dev watchers, so a fresh CI | |
| # checkout has no app.js/app.css. Without them the LiveView client never loads and | |
| # every interactive (phx-change / phx-click) test fails. Build the assets explicitly | |
| # so the storefront + operator UIs are actually interactive under Playwright. | |
| - name: Build example assets (LiveView client JS + CSS) | |
| working-directory: examples/scrypath_ecommerce | |
| run: | | |
| mix esbuild.install --if-missing | |
| mix tailwind.install --if-missing | |
| mix esbuild scrypath_ecommerce | |
| mix tailwind scrypath_ecommerce | |
| - name: Start example Phoenix server | |
| working-directory: examples/scrypath_ecommerce | |
| env: | |
| # test.exs gates the endpoint on PHX_SERVER=true (server: + bind ip:). Without it, | |
| # the listener only starts via mix phx.server's serve_endpoints override, which races | |
| # endpoint init in CI and leaves the process alive but nothing bound on :4002. | |
| PHX_SERVER: "true" | |
| # Run the e2e server against a persistent, NON-sandbox DB so the real | |
| # create_product -> Oban enqueue -> drain -> active index path persists across | |
| # the separate HTTP requests Playwright makes (see config/runtime.exs). Set on this | |
| # step only; `mix e2e.prepare` stays on the default sandbox path. | |
| SCRYPATH_E2E_NO_SANDBOX: "1" | |
| run: | | |
| # Compile synchronously first so the readiness window below times boot, not compile. | |
| mix compile | |
| mix phx.server > /tmp/phase105-e2e-phx.log 2>&1 & | |
| echo $! > /tmp/phase105-e2e-phx.pid | |
| - name: Wait for app readiness | |
| run: | | |
| for _ in $(seq 1 120); do | |
| if curl --silent --fail "$PLAYWRIGHT_BASE_URL" >/dev/null; then | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "Phoenix app failed to become ready" | |
| echo "--- verbose curl (connection state / HTTP status) ---" | |
| curl -sv --max-time 5 "$PLAYWRIGHT_BASE_URL" 2>&1 | tail -n 40 || true | |
| echo "--- server process alive? ---" | |
| (kill -0 "$(cat /tmp/phase105-e2e-phx.pid 2>/dev/null)" 2>/dev/null && echo "phx.server pid alive") || echo "phx.server pid NOT alive" | |
| echo "--- phx boot log ---" | |
| tail -n 200 /tmp/phase105-e2e-phx.log || true | |
| exit 1 | |
| - name: Run phase 105 browser E2E lane | |
| working-directory: examples/scrypath_ecommerce | |
| run: | | |
| STARTED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" | |
| echo "PHASE105_E2E_STARTED_AT=${STARTED_AT}" >> "$GITHUB_ENV" | |
| set +e | |
| npm run test:e2e | |
| STATUS=$? | |
| ENDED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" | |
| echo "PHASE105_E2E_ENDED_AT=${ENDED_AT}" >> "$GITHUB_ENV" | |
| if [ "$STATUS" -eq 0 ]; then | |
| echo "PHASE105_E2E_CONCLUSION=success" >> "$GITHUB_ENV" | |
| else | |
| echo "PHASE105_E2E_CONCLUSION=failure" >> "$GITHUB_ENV" | |
| fi | |
| exit "$STATUS" | |
| - name: Generate phase105 evidence summary | |
| if: always() | |
| run: scripts/ci/phase105_evidence.sh | |
| - name: Append phase105 evidence to job summary | |
| if: always() | |
| run: cat examples/scrypath_ecommerce/test-results/phase105-evidence-summary.md >> "$GITHUB_STEP_SUMMARY" | |
| - name: Upload phase105-e2e failure artifacts | |
| if: failure() | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: phase105-e2e-artifacts | |
| path: | | |
| /tmp/phase105-e2e-phx.log | |
| examples/scrypath_ecommerce/playwright-report | |
| examples/scrypath_ecommerce/test-results | |
| examples/scrypath_ecommerce/test-results/phase105-evidence.ndjson | |
| examples/scrypath_ecommerce/test-results/phase105-evidence.json | |
| examples/scrypath_ecommerce/test-results/phase105-evidence-summary.md | |
| if-no-files-found: warn |