Skip to content

chore(deps): bump actions/cache from 5 to 6 #206

chore(deps): bump actions/cache from 5 to 6

chore(deps): bump actions/cache from 5 to 6 #206

Workflow file for this run

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