Reduce total CI duration#536
Conversation
This will now use the same behavior as before the refactor, allowing test-wasm to serve resolc.wasm from localhost.
Replaces full clone with treeless clone of LLVM since the source files are not needed for version detection.
Node 20 will be deprecated. Using node-version 22 for the test-wasm Playwright test due to possible Playwright issues with Node 24.
Prevents running long-running tests for this PR.
| - name: Build (MUSL) | ||
| if: ${{ steps.cache.outputs.cache-hit != 'true' && inputs.build-type == 'musl' }} | ||
| shell: bash | ||
| run: | |
There was a problem hiding this comment.
I'd prefer to use our Dockerfile. Currently a two stage build yielding an alpine image including solc, so maybe we want to split the Dockerfile up.
Or what would be even better, split this action up into build-resolc-native and build-resolc-musl. build-musl just tries to build the Dockerfile and sanity check by using the built image to build a contract. This would build the native and musl linux builds in parallel and also ensure the Dockerfile works on CI.
There was a problem hiding this comment.
Good idea on testing the Dockerfile! Regarding native vs musl linux, I think we should still build the musl here though, because that's the binary we distribute so we'd be more confident if that's the build we're using for differential tests etc.
I looked at ways we could refactor the Dockerfile such that it can still be used as it is today (no semantic change), or optionally skip e.g. the LLVM stage if a prebuilt is passed. This way the Dockerfile will always be used for building the linux musl build and can also use the published LLVM.
The full Dockerfile can be tested via a separate workflow (running in parallel). Since building LLVM will take a while, we could e.g. run that on pushes to main only.
(If we go with the Dockerfile refactor, it may be better to add it as a follow-up PR to keep that change more isolated, and keep the preexisting build logic for this PR.)
| should-run-hardhat-tests: ${{ steps.filter.outputs.should-run-hardhat-tests }} | ||
| steps: | ||
| - name: Check If Relevant Files Changed | ||
| uses: dorny/paths-filter@v4 |
There was a problem hiding this comment.
Not a big fan of such dependencies adding supply chain risks. How much more complicated would it be to implement the same logic without this?
Description
Improves overall time spent for our CI checks to complete. For cache hits, total time decreases from ~70min to ~29min.
Overview
gantt title CI on a PR — BEFORE ~70m vs NOW ~29m dateFormat HH:mm axisFormat %M section BEFORE ~70m [release] build-wasm 20m :r1, 00:00, 20m [release] build-x86_64-apple-darwin 17m :r2, 00:00, 17m [release] build-x86_64-pc-windows-msvc 11m :r3, 00:00, 11m [release] build-x86_64-unknown-linux-musl 10m :r4, 00:00, 10m [release] build-aarch64-apple-darwin 8m :r5, 00:00, 8m [release] create-macos-universal 14s :r6, 00:17, 1m [test-wasm] own duplicate wasm build 19m :w1, 00:00, 19m [test-wasm] test matrix 3m :w2, 00:19, 3m [test] required 12m :crit, t1, 00:00, 12m [differential-tests] build matrix waits 8m for release :crit, t2, 00:12, 8m [differential-tests] macos-x86_64 compile and hash 44m :crit, t3, 00:20, 44m [differential-tests] windows-x86_64 compile and hash 26m :t4, 00:20, 26m [differential-tests] linux-x86_64 compile and hash 20m :t5, 00:20, 20m [differential-tests] macos-arm64 compile and hash 15m :t6, 00:20, 15m [differential-tests] run-e2e-tests parallel 43m :t7, 00:22, 43m [differential-tests] compare-hashes 5m :crit, t8, 01:04, 5m [hardhat] use-hardhat chained 1m :crit, t9, 01:09, 1m section NOW ~29m [release] build-windows 3m :nr1, 00:00, 3m [release] build-x86_64-apple-darwin 7m :nr2, 00:00, 7m [release] build-linux 2m :nr3, 00:00, 2m [release] build-aarch64-apple-darwin 2m :nr4, 00:00, 2m [release] create-macos-universal 23s :nr5, 00:07, 1m [release] build-wasm cache hit ~11s :nr6, 00:15, 1m [test-wasm] shared wasm build 15m :nw1, 00:00, 15m [test-wasm] test matrix 3m :nw2, 00:15, 3m [test] required 6m :crit, nt1, 00:00, 6m [test] check-changes 2s parallel :nt2, 00:00, 1m [differential-tests] per-target cache hits ~1m 30s :crit, nt3, 00:06, 2m [differential-tests] windows-x86_64 compile and hash 19m :crit, nt4, 00:08, 19m [differential-tests] linux-x86_64 compile and hash 16m :nt5, 00:08, 16m [differential-tests] macos-arm64 compile and hash 13m :nt6, 00:08, 13m [differential-tests] run-e2e-tests 16m :nt7, 00:08, 16m [differential-tests] compare-hashes 2m :crit, nt8, 00:27, 2m [hardhat] use-hardhat parallel 1m :nt9, 00:07, 1mMeasurements
testjob (required check)compile-and-hashbuild phaserun-e2e-testsbuild phaselinux-x86_64already available)compile-and-hashjobmacos-x86_64)windows-x86_64)macos-x86_64excluded on PRs)compile-and-hashmatrix start timerun-e2e-testsstart timerun-e2e-testsdurationChanges
reusable-build.ymlintoreusable-build-{linux,macos,windows,wasm}.yml.mainmain.run-e2e-testsduration: ~43min.run-e2e-testsduration: ~19min.get-llvm/action.ymluses more efficient version detection. Building resolc now takes ~2min (~5-7 min on macOS intel).test-wasm.ymlran its own duplicate build.test-wasm.ymluses the reusable Wasm build.polkadot-omni-nodewas unconditionally downloaded (~3-4min).pallet-revive-eth-rpcandrevive-dev-nodeare downloaded from the cache.report-processorretesterwas cached.report-processoris cached for the compilations and export hashes jobs.testjob succeeds, using the reusable Linux build.test-wasm.ymlanddifferential-tests.yml.testjob.test-wasmfailures.test-wasmfailures.Resolved Issues
Closes #533