Feature/perf #24
Workflow file for this run
This file contains 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: 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 | ||
You can simplify the matrix by using a range function in the workflow definition. While GitHub Actions doesn't natively support ranges in YAML, you can generate a matrix dynamically through bash scripting or use a simpler YAML structure. Here's an example using a shell command to create a sequence of numbers (from 1 to 32) and pass it as matrix jobs: | ||
name: Matrix with Range | ||
on: [push, pull_request] | ||
jobs: | ||
test: | ||
runs-on: ubuntu-latest | ||
strategy: | ||
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] | ||
chunk: ${{ fromJSON('[' + range(1, 33).join(',') + ']') }} | ||
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 }} |