Skip to content

Build o1js

Build o1js #23

Workflow file for this run

name: Build o1js
on:
push:
#branches:
# - feature/perf
# - perf-recording
# - main
# - develop
# - *
pull_request:
workflow_dispatch: {}
jobs:
Prepare:
runs-on: ubuntu-latest
outputs:
test_count: ${{ steps.count_tests.outputs.test_count }}
chunk_count: 32 # This is hardcoded to 8, but it can be changed to any number.
steps:
- name: Checkout repository with submodules
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Cache dependencies and build
uses: actions/cache@v4
id: cache
with:
path: |
~/.npm
node_modules
dist
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.ts', '**/*.js') }}
- name: Build o1js
if: steps.cache.outputs.cache-hit != 'true'
run: |
npm ci
npm run build
- name: Count tests
id: count_tests
run: |
TEST_COUNT=$(find ./dist/node -name "*.unit-test.js" | wc -l)
echo "test_count=${TEST_COUNT}" >> "$GITHUB_OUTPUT"
echo "Total test count: ${TEST_COUNT}"
- name: Cache repository
uses: actions/cache@v4
with:
path: .
key: repo-${{ github.sha }}
Build-And-Test-Server:
needs: Prepare
timeout-minutes: 210
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
test_type:
[
'Simple integration tests',
'Reducer integration tests',
'DEX integration tests',
'DEX integration test with proofs',
'Voting integration tests',
'Verification Key Regression Check 1',
'Verification Key Regression Check 2',
'CommonJS test',
]
steps:
- name: Restore repository
uses: actions/cache@v4
with:
path: .
key: repo-${{ github.sha }}
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Restore cache
uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
dist
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.ts', '**/*.js') }}
- name: Prepare for tests
run: touch profiling.md
- name: Execute tests
env:
TEST_TYPE: ${{ matrix.test_type }}
run: sh run-ci-tests.sh
- name: Add to job summary
if: always()
run: |
echo "### Test Results for ${{ matrix.test_type }}" >> "$GITHUB_STEP_SUMMARY"
cat profiling.md >> "$GITHUB_STEP_SUMMARY"
Run-Unit-Tests:
needs: Prepare
name: Run unit tests parallel
timeout-minutes: 60 # lets keep the individual jobs shorter
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
chunk: [
#1,2,3,4,5,6,7,8,9,10,11,12,
13
#,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
]
perf: [
no,
prof, heap, cpu,
all]
node_version: [
18,20,22
]
steps:
- name: Restore repository
uses: actions/cache@v4
with:
path: .
key: repo-${{ github.sha }}
- name: Setup Node
uses: actions/setup-node@v4
with:
# FIXME change to use matrix
node-version: ${{ matrix.node_version }}
- name: Restore cache
uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
dist
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.ts', '**/*.js') }}
- name: Prepare for tests
run: touch profiling.md
- name: create dir
run: mkdir -p profile/profile-data
#- name: create dirs
# from https://stackoverflow.com/questions/75985925/how-to-replace-slashes-with-dashes-and-set-it-an-environment-variable-in-github
- name: Sets MODIFIED_BRANCH_NAME
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
run: |
MODIFIED_BRANCH_NAME=${BRANCH_NAME/\//-}
OUTPUT_DIR="profile/profile-data/${MODIFIED_BRANCH_NAME}"
OUTPUT_TEST_DIR="${OUTPUT_DIR}/profile-data-${{matrix.chunk}}-${{ matrix.perf }}-${{ matrix.node_version }}"
echo "MODIFIED_BRANCH_NAME=${MODIFIED_BRANCH_NAME}" >> "$GITHUB_ENV"
echo "OUTPUT_DIR=${OUTPUT_DIR}" >> "$GITHUB_ENV"
echo "OUTPUT_TEST_DIR=${OUTPUT_TEST_DIR}" >> "$GITHUB_ENV"
- name: create dir
run: mkdir -p ${{env.OUTPUT_TEST_DIR}}
- name: Run unit tests
timeout-minutes: 30
env:
TOTAL_TESTS: ${{ needs.Prepare.outputs.test_count }}
CHUNK: ${{ matrix.chunk }}
CHUNKS: 32
run: |
echo "Total tests: $TOTAL_TESTS"
echo "Current chunk: $CHUNK"
echo "Total chunks: $CHUNKS"
if [ -z "$TOTAL_TESTS" ] || [ "$TOTAL_TESTS" -eq 0 ]; then
echo "Error: TOTAL_TESTS is not set or is zero. Exiting."
exit 1
fi
start_index=$(( (TOTAL_TESTS * (CHUNK - 1) / CHUNKS) ))
end_index=$(( (TOTAL_TESTS * CHUNK / CHUNKS) ))
echo "Running tests from index $start_index to $end_index"
shopt -s globstar
test_files=(./dist/node/**/*.unit-test.js)
#set -o pipefail
for ((i=start_index; i<end_index && i<${#test_files[@]}; i++)); do
echo "Running test: ${test_files[$i]}"
# NO prof
if [ "${{ matrix.perf }}" == "no" ]; then
echo no prof
(node --enable-source-maps "${test_files[$i]}" | tee -a profiling.md) || echo skip errors
fi
# cpu prof
if [ "${{ matrix.perf }}" == "cpu" ]; then
echo cpu
(node --cpu-prof --expose-gc --enable-source-maps "${test_files[$i]}" | tee -a profiling.md) || echo skip errors
fi
# HEAP
if [ "${{ matrix.perf }}" == "heap" ]; then
echo heap prof
(node --heap-prof --expose-gc --enable-source-maps "${test_files[$i]}" | tee -a profiling.md) || echo skip errors
fi
# PROF
if [ "${{ matrix.perf }}" == "prof" ]; then
echo prof
(node --prof --expose-gc --enable-source-maps "${test_files[$i]}" | tee -a profiling.md) || echo skip errors
fi
# ALL
if [ "${{ matrix.perf }}" == "all" ]; then
echo all prof
(node --prof --heap-prof --cpu-prof --expose-gc --enable-source-maps "${test_files[$i]}" | tee -a profiling.md) || echo skip errors
fi
# sweep up results
mv isolate-*-v8.log "${OUTPUT_TEST_DIR}" || echo ok
mv Heap.*.heapprofile "${OUTPUT_TEST_DIR}" || echo ok
mv CPU.*.cpuprofile "${OUTPUT_TEST_DIR}" || echo ok
done
continue-on-error: true
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-${{env.MODIFIED_BRANCH_NAME}}-${{ matrix.chunk }}-${{ matrix.perf }}-${{ matrix.node_version }}
path: ${{env.OUTPUT_TEST_DIR}}
- name: Add to job summary
if: always()
run: |
echo "### Test Results for Unit Tests Chunk ${{ matrix.chunk }}" >> "$GITHUB_STEP_SUMMARY"
cat profiling.md >> "$GITHUB_STEP_SUMMARY"
Build-And-Test-Server-Unit-Tests:
name: Build-And-Test-Server (Unit tests)
needs: [Run-Unit-Tests]
runs-on: ubuntu-latest
steps:
- run: echo "All unit tests completed successfully"
Build-And-Test-Web:
needs: Prepare
timeout-minutes: 90
runs-on: ubuntu-latest
steps:
- name: Restore repository
uses: actions/cache@v4
with:
path: .
key: repo-${{ github.sha }}
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Restore npm cache
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
- name: Cache Playwright browsers
uses: actions/cache@v4
id: playwright-cache
with:
path: ~/.cache/ms-playwright
key: ${{ runner.OS }}-playwright-${{ hashFiles('**/package-lock.json') }}
- name: Install Playwright browsers
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: npm run e2e:install
- name: Build o1js and prepare the web server
run: |
npm run build:web
npm run e2e:prepare-server
- name: Execute E2E tests
run: npm run test:e2e
- name: Upload E2E test artifacts
uses: actions/upload-artifact@v4
continue-on-error: true
if: always()
with:
if-no-files-found: ignore
name: e2e-tests-report
# playwrite data
path: tests/report/
retention-days: 30
Release-on-NPM:
if: github.ref == 'refs/heads/main'
timeout-minutes: 180
runs-on: ubuntu-latest
needs: [Build-And-Test-Server, Run-Unit-Tests, Build-And-Test-Web]
steps:
- name: Restore repository
uses: actions/cache@v4
with:
path: .
key: repo-${{ github.sha }}
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Build o1js
run: |
npm ci
npm run prepublishOnly
- name: Publish to NPM if version has changed
uses: JS-DevTools/npm-publish@v3
with:
token: ${{ secrets.NPM_TOKEN }}
strategy: upgrade
env:
INPUT_TOKEN: ${{ secrets.NPM_TOKEN }}
Release-mina-signer-on-NPM:
if: github.ref == 'refs/heads/main'
timeout-minutes: 180
runs-on: ubuntu-latest
needs: [Build-And-Test-Server, Run-Unit-Tests, Build-And-Test-Web]
steps:
- name: Restore repository
uses: actions/cache@v4
with:
path: .
key: repo-${{ github.sha }}
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Build mina-signer
run: |
npm ci
cd src/mina-signer
npm ci
npm run prepublishOnly
- name: Publish to NPM if version has changed
uses: JS-DevTools/npm-publish@v3
with:
token: ${{ secrets.NPM_TOKEN }}
package: './src/mina-signer/package.json'
strategy: upgrade
env:
INPUT_TOKEN: ${{ secrets.NPM_TOKEN }}