fix(persistence): recover_all processes edges before nodes; silent re-link no-op on missing endpoint
#18975
Workflow file for this run
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: Run tests for jaseci | |
| on: | |
| pull_request: | |
| branches: | |
| - main | |
| push: | |
| branches: | |
| - main | |
| workflow_dispatch: | |
| jobs: | |
| test-core-compiler: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v3 | |
| with: | |
| python-version: 3.12 | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| pip install pytest | |
| pip install pytest-xdist | |
| pip install watchdog | |
| - name: Run compiler tests | |
| run: pytest -x jac/tests/compiler -n auto | |
| test-core-runtime: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v3 | |
| with: | |
| python-version: 3.12 | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| pip install pytest | |
| pip install pytest-xdist | |
| pip install watchdog | |
| - name: Run runtime + langserve + language tests | |
| run: pytest -x jac -n auto --ignore=jac/tests/compiler | |
| test-client: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v3 | |
| with: | |
| python-version: 3.12 | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Set up Bun | |
| uses: oven-sh/setup-bun@v2 | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| jac install -e jac-client | |
| pip install pytest | |
| pip install pytest-xdist | |
| pip install playwright | |
| - name: Install Playwright browsers | |
| run: playwright install chromium --with-deps | |
| - name: Set environment for testing | |
| run: | | |
| echo "TEST_ENV=true" >> $GITHUB_ENV | |
| - name: Run all client tests (including E2E in parallel) | |
| run: pytest -x jac-client -n auto | |
| - name: Re-run auth roundtrip e2e against jac-scale backend | |
| run: | | |
| jac install -e jac-scale | |
| pytest -x -vv jac-client/jac_client/tests/test_e2e.jac -k "jacSignup" | |
| test-packages-and-docs: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v3 | |
| with: | |
| python-version: 3.12 | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| jac install -e jac-byllm | |
| pip install pytest | |
| pip install pytest-xdist | |
| - name: Set environment for testing | |
| run: | | |
| echo "TEST_ENV=true" >> $GITHUB_ENV | |
| - name: Run package tests | |
| run: pytest -x jac-byllm | |
| - name: Install docs dependencies | |
| run: jac install -e docs | |
| - name: Build documentation | |
| run: mkdocs build --strict | |
| working-directory: docs | |
| - name: Run documentation validation tests | |
| run: pytest -q -x docs/tests/test_docs.jac | |
| - name: Install Playwright | |
| run: | | |
| pip install playwright | |
| playwright install chromium --with-deps | |
| - name: Run E2E code block tests | |
| run: pytest docs/tests/e2e/test_code_blocks.jac -v | |
| test-mcp: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: 3.12 | |
| - name: Install jac-mcp and test dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| jac install -e jac-mcp | |
| pip install pytest | |
| pip install pytest-xdist | |
| - name: Run jac-mcp tests | |
| run: pytest -x jac-mcp -n auto | |
| test-scale: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v3 | |
| with: | |
| python-version: 3.12 | |
| - name: Set up Bun | |
| uses: oven-sh/setup-bun@v2 | |
| - name: Install base jac-scale and test deps | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| jac install -e jac-scale | |
| jac install -e jac-client | |
| pip install pytest pytest-asyncio | |
| pip install requests watchdog websockets | |
| - name: Run Backend tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_serve.jac | |
| - name: Run middleware async root tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_middleware_async_root.jac | |
| - name: Run SSO tests | |
| run: | | |
| pytest -x jac-scale/jac_scale/tests/test_sso.jac | |
| - name: Run admin API tests | |
| run: | | |
| pytest -x jac-scale/jac_scale/tests/test_admin.jac | |
| - name: Run RestSpec tests | |
| run: | | |
| pytest -x jac-scale/jac_scale/tests/test_restspec.jac | |
| - name: Install jac-scale[aws] and moto | |
| run: | | |
| pip install -e "jac-scale[aws]" | |
| pip install "moto[s3]>=5.0.0" | |
| - name: Run Storage tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_s3_storage.jac | |
| - name: Run Microservice interop tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_microservice.jac | |
| - name: Run jac-client examples | |
| run: | | |
| pytest -x jac-scale/jac_scale/tests/test_examples.jac | |
| - name: Install jac-scale[data] extras | |
| run: | | |
| jac install -e jac-scale --extras data | |
| pip install testcontainers | |
| - name: Run Webhook tests (without and with MongoDB) | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_webhook.jac | |
| - name: Run Memory Hierarchy tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_memory_hierarchy.jac | |
| - name: Run scalar-clobber cross-process regression tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_scalar_clobber_cross_process.jac | |
| - name: Run MongoDB user manager tests | |
| run: | | |
| pytest -x jac-scale/jac_scale/tests/test_mongo_user_manager.jac | |
| - name: Run Serializer tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_serializer_social.jac | |
| - name: Install jac-scale[scheduler] extras | |
| run: | | |
| jac install -e jac-scale --extras scheduler | |
| - name: Run Scheduling tests | |
| run: | | |
| pytest -x -vv -s jac-scale/jac_scale/tests/test_scheduling.jac | |
| test-scale-k8s: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: 3.12 | |
| - name: Install Jaseci scale package | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e jac | |
| jac install -e jac-scale --extras deploy | |
| jac install -e jac-client | |
| pip install pytest | |
| pip install pytest-xdist | |
| pip install pytest-asyncio | |
| - name: Write kind config | |
| run: | | |
| cat <<EOF > /tmp/kind-config.yaml | |
| kind: Cluster | |
| apiVersion: kind.x-k8s.io/v1alpha4 | |
| nodes: | |
| - role: control-plane | |
| extraPortMappings: | |
| - containerPort: 30080 | |
| hostPort: 30080 | |
| protocol: TCP | |
| EOF | |
| - name: Create kind cluster | |
| uses: helm/kind-action@v1 | |
| with: | |
| cluster_name: jaseci-test | |
| wait: 120s | |
| config: /tmp/kind-config.yaml | |
| - name: Run K8 tests | |
| run: | | |
| pytest -s -x jac-scale/jac_scale/tests/test_k8s_utils.jac | |
| pytest -s -x jac-scale/jac_scale/tests/test_deploy_k8s.jac | |
| test-pypi-build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out code | |
| uses: actions/checkout@v5 | |
| with: | |
| submodules: true | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v3 | |
| with: | |
| python-version: 3.12 | |
| - name: Install build package | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install build | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Set up Bun | |
| uses: oven-sh/setup-bun@v2 | |
| - name: Install jaclang for precompilation | |
| run: pip install -e jac | |
| - name: Precompile all packages | |
| run: | | |
| jac run jac/scripts/precompile_bytecode.jac ./jac | |
| jac run jac/scripts/precompile_bytecode.jac ./jac-client | |
| jac run jac/scripts/precompile_bytecode.jac ./jac-scale | |
| jac run jac/scripts/precompile_bytecode.jac ./jac-byllm | |
| - name: Pre-build admin dashboard UI | |
| run: | | |
| jac install -e jac-client | |
| jac install -e jac-scale --extras all | |
| cd jac-scale && jac run scripts/build_admin_ui.jac | |
| - name: Uninstall editable packages | |
| run: | | |
| pip uninstall -y jac-scale jac-client | |
| - name: Clean egg-info to simulate fresh build (like publish-release) | |
| run: | | |
| rm -rf jac/jaclang.egg-info | |
| rm -rf jac-client/*.egg-info jac-client/jac_client/*.egg-info | |
| rm -rf jac-scale/*.egg-info jac-scale/jac_scale/*.egg-info | |
| rm -rf jac-byllm/*.egg-info | |
| - name: Build and install packages | |
| run: | | |
| python -m build jac --wheel | |
| (cd jac-client && jac bundle) | |
| (cd jac-scale && jac bundle) | |
| (cd jac-byllm && jac bundle) | |
| pip install jac/dist/jaclang-*.whl | |
| pip install jac-client/dist/jac_client-*.whl | |
| SCALE_WHL=$(ls jac-scale/dist/jac_scale-*.whl) && pip install "${SCALE_WHL}[all]" | |
| pip install jac-byllm/dist/byllm-*.whl | |
| pip install pytest | |
| pip install pytest-asyncio | |
| - name: Verify cold start with precompiled bytecode | |
| run: | | |
| jac purge | |
| timeout 5 jac --version | |
| - name: Verify bundled guides print from the built wheel | |
| run: bash scripts/check-guide.sh jac | |
| - name: Run integration tests | |
| run: jac run scripts/integration_tests.jac | |
| - name: Run tests on built packages | |
| run: | | |
| jac check jac/tests/compiler/passes/main/fixtures/checker/checker_type_ref.jac | |
| pytest "jac-client/jac_client/tests/test_cli.jac::create jac app" | |
| pytest jac-byllm/tests/test_byllm.jac | |
| # ========== jac-gpt test ========== | |
| - name: Create jac-gpt from jacpack | |
| run: | | |
| jac create jac-gpt --use https://raw.githubusercontent.com/jaseci-labs/jacpacks/refs/heads/main/jac-gpt/jac-gpt.jacpack | |
| cd jac-gpt && jac install | |
| - name: Install Playwright dependencies | |
| run: | | |
| pip install playwright | |
| playwright install chromium --with-deps | |
| - name: Type check jac-gpt | |
| working-directory: jac-gpt | |
| run: jac check main.jac | |
| - name: Restore FAISS index cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: jac-gpt/services/faiss_index | |
| key: jac-gpt-faiss-v1 | |
| - name: Start jac-gpt server in background | |
| working-directory: jac-gpt | |
| env: | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| run: | | |
| timeout 600 jac start main.jac > /tmp/jac-gpt-server.log 2>&1 & | |
| SERVER_PID=$! | |
| echo "JAC_GPT_PID=$SERVER_PID" >> $GITHUB_ENV | |
| echo "jac-gpt server starting with PID $SERVER_PID..." | |
| sleep 10 | |
| if ! kill -0 $SERVER_PID 2>/dev/null; then | |
| echo "Server process died during startup" | |
| cat /tmp/jac-gpt-server.log | |
| exit 1 | |
| fi | |
| - name: Wait for jac-gpt server to be ready | |
| run: | | |
| echo "Waiting for jac-gpt server on port 8000..." | |
| for i in $(seq 1 24); do | |
| if ! kill -0 ${{ env.JAC_GPT_PID }} 2>/dev/null; then | |
| echo "Server process exited unexpectedly" | |
| cat /tmp/jac-gpt-server.log | |
| exit 1 | |
| fi | |
| if curl -sf --max-time 10 http://localhost:8000 -o /dev/null 2>&1; then | |
| echo "jac-gpt server is ready (attempt $i)" | |
| exit 0 | |
| fi | |
| echo "Attempt $i/24: not ready, waiting 15s..." | |
| sleep 15 | |
| done | |
| echo "Server failed to respond after 24 attempts" | |
| tail -100 /tmp/jac-gpt-server.log | |
| exit 1 | |
| - name: Verify jac-gpt HTTP response | |
| run: | | |
| HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 http://localhost:8000) | |
| echo "jac-gpt root endpoint: HTTP $HTTP_CODE" | |
| if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 500 ]; then | |
| echo "jac-gpt server responding correctly" | |
| else | |
| echo "Unexpected HTTP $HTTP_CODE" | |
| exit 1 | |
| fi | |
| - name: Run E2E tests | |
| env: | |
| SERVER_URL: http://localhost:8000 | |
| run: pytest jac-gpt/tests/test_e2e.jac -v | |
| - name: Stop jac-gpt server | |
| if: always() | |
| run: | | |
| if [ -n "${{ env.JAC_GPT_PID }}" ]; then | |
| kill ${{ env.JAC_GPT_PID }} 2>/dev/null || true | |
| sleep 3 | |
| kill -9 ${{ env.JAC_GPT_PID }} 2>/dev/null || true | |
| fi | |
| # ========== Algo test ========== | |
| - name: Create Algo from jacpack | |
| run: | | |
| jac create algo --use https://raw.githubusercontent.com/jaseci-labs/jacpacks/refs/heads/main/Algo/Algo.jacpack | |
| cd algo && jac install | |
| - name: Type check Algo | |
| working-directory: algo | |
| run: jac check main.jac | |
| - name: Start Algo server in background | |
| working-directory: algo | |
| run: | | |
| timeout 600 jac start main.jac > /tmp/algo-server.log 2>&1 & | |
| ALGO_PID=$! | |
| echo "ALGO_PID=$ALGO_PID" >> $GITHUB_ENV | |
| echo "Algo server starting with PID $ALGO_PID..." | |
| sleep 10 | |
| if ! kill -0 $ALGO_PID 2>/dev/null; then | |
| echo "Server process died during startup" | |
| cat /tmp/algo-server.log | |
| exit 1 | |
| fi | |
| - name: Wait for Algo server to be ready | |
| run: | | |
| echo "Waiting for Algo server on port 8000..." | |
| for i in $(seq 1 24); do | |
| if ! kill -0 ${{ env.ALGO_PID }} 2>/dev/null; then | |
| echo "Server process exited unexpectedly" | |
| cat /tmp/algo-server.log | |
| exit 1 | |
| fi | |
| if curl -sf --max-time 10 http://localhost:8000 -o /dev/null 2>&1; then | |
| echo "Algo server is ready (attempt $i)" | |
| exit 0 | |
| fi | |
| echo "Attempt $i/24: not ready, waiting 15s..." | |
| sleep 15 | |
| done | |
| echo "Server failed to respond after 24 attempts" | |
| tail -100 /tmp/algo-server.log | |
| exit 1 | |
| - name: Verify Algo HTTP response | |
| run: | | |
| HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 http://localhost:8000) | |
| echo "Algo root endpoint: HTTP $HTTP_CODE" | |
| if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 500 ]; then | |
| echo "Algo server responding correctly" | |
| else | |
| echo "Unexpected HTTP $HTTP_CODE" | |
| exit 1 | |
| fi | |
| - name: Stop Algo server | |
| if: always() | |
| run: | | |
| if [ -n "${{ env.ALGO_PID }}" ]; then | |
| kill ${{ env.ALGO_PID }} 2>/dev/null || true | |
| sleep 3 | |
| kill -9 ${{ env.ALGO_PID }} 2>/dev/null || true | |
| fi | |
| # ========== fullstack eject smoke ========== | |
| # Structural / codegen correctness of `jac eject` is covered by | |
| # jac/tests/project/test_eject.jac (21 in-process unit tests, ~0.5s). | |
| # The steps below are deliberately end-to-end: they exist to validate | |
| # what the unit tests cannot — that `jac eject` works against the real | |
| # fullstack template and that the ejected backend imports cleanly | |
| # against the wheel-installed jaclang runtime and actually serves HTTP. | |
| # The live `jac start` path is exercised separately by the test-client | |
| # job (`start dev with client does initial compilation`), so this job | |
| # focuses solely on the eject pipeline. | |
| - name: Create fullstack project and eject it | |
| run: | | |
| jac create --use fullstack fs-smoke | |
| jac eject fs-smoke | |
| - name: Install ejected backend and start it | |
| working-directory: fs-smoke-ejected | |
| run: | | |
| pip install -r backend/requirements.txt | |
| PORT=8000 timeout 600 python backend/serve.py > /tmp/fullstack-ejected.log 2>&1 & | |
| EJECTED_PID=$! | |
| echo "EJECTED_PID=$EJECTED_PID" >> $GITHUB_ENV | |
| sleep 5 | |
| if ! kill -0 $EJECTED_PID 2>/dev/null; then | |
| echo "Ejected backend died during startup" | |
| cat /tmp/fullstack-ejected.log | |
| exit 1 | |
| fi | |
| - name: Verify ejected fullstack backend responds | |
| run: | | |
| for i in $(seq 1 12); do | |
| if ! kill -0 ${{ env.EJECTED_PID }} 2>/dev/null; then | |
| echo "Ejected backend exited unexpectedly" | |
| tail -100 /tmp/fullstack-ejected.log | |
| exit 1 | |
| fi | |
| if curl -sf --max-time 5 http://localhost:8000 -o /dev/null 2>&1; then | |
| echo "Ejected backend responding (attempt $i)" | |
| exit 0 | |
| fi | |
| sleep 5 | |
| done | |
| echo "Ejected backend failed to respond" | |
| tail -100 /tmp/fullstack-ejected.log | |
| exit 1 | |
| - name: Stop ejected fullstack server | |
| if: always() | |
| run: | | |
| if [ -n "${{ env.EJECTED_PID }}" ]; then | |
| kill ${{ env.EJECTED_PID }} 2>/dev/null || true | |
| sleep 3 | |
| kill -9 ${{ env.EJECTED_PID }} 2>/dev/null || true | |
| fi | |
| - name: Upload jac-gpt server logs | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: jac-gpt-test-logs | |
| path: /tmp/jac-gpt-server.log | |
| retention-days: 7 | |
| - name: Upload Algo server logs | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: algo-test-logs | |
| path: /tmp/algo-server.log | |
| retention-days: 7 | |
| - name: Upload fullstack ejected backend logs | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: fullstack-ejected-logs | |
| path: /tmp/fullstack-ejected.log | |
| retention-days: 7 | |
| - name: Jac pack test summary | |
| if: always() | |
| run: | | |
| echo "## Jac Pack Smoke Tests" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "| Test | Status |" >> $GITHUB_STEP_SUMMARY | |
| echo "|------|--------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| jac-gpt | \`${{ job.status }}\` |" >> $GITHUB_STEP_SUMMARY | |
| echo "| algo | \`${{ job.status }}\` |" >> $GITHUB_STEP_SUMMARY | |
| echo "| fullstack (ejected) | \`${{ job.status }}\` |" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "| **Trigger** | \`${{ github.event_name }}\` |" >> $GITHUB_STEP_SUMMARY |