c4029eed4f
If some benchmark fails in dry-run (compileOnly) mode, the whole process exits with non-zero return code. Also fixes failing engine compiler benchmarks. # Important Notes Manually added failure: ```diff diff --git a/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java b/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java index c8d86cecc..f9f4d7cbc 100644 --- a/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java +++ b/engine/runtime-benchmarks/src/main/java/org/enso/interpreter/bench/benchmarks/semantic/ArrayProxyBenchmarks.java @@ -95,7 +95,8 @@ public class ArrayProxyBenchmarks { @Benchmark public void sumOverComputingProxy(Blackhole matter) { - performBenchmark(matter); + //performBenchmark(matter); + throw new AssertionError("My error"); } @Benchmark ``` Run with `sbt "-Dbench.compileOnly=true runtime-benchmarks/benchOnly org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy"` fails with: ``` [info] Running benchmarks [org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy] in compileOnly mode [info] # JMH version: 1.36 [info] # VM version: JDK 21.0.2, Java HotSpot(TM) 64-Bit Server VM, 21.0.2+13-LTS-jvmci-23.1-b30 [info] # VM invoker: /home/pavel/.sdkman/candidates/java/21.0.2-graal/bin/java [info] # VM options: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions -Dslf4j.provider=org.slf4j.nop.NOPServiceProvider -Dbench.compileOnly=true --module-path=/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/nativeimage/23.1.2/nativeimage-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/word/23.1.2/word-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/jniutils/23.1.2/jniutils-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/sdk/collections/23.1.2/collections-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/23.1.2/polyglot-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-api/23.1.2/truffle-api-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-runtime/23.1.2/truffle-runtime-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-compiler/23.1.2/truffle-compiler-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/js/js-language/23.1.2/js-language-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/regex/regex/23.1.2/regex-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/shadowed/icu4j/23.1.2/icu4j-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/python/python-language/23.1.2/python-language-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/python/python-resources/23.1.2/python-resources-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/llvm/llvm-api/23.1.2/llvm-api-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-nfi/23.1.2/truffle-nfi-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/truffle/truffle-nfi-libffi/23.1.2/truffle-nfi-libffi-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/tools/profiler-tool/23.1.2/profiler-tool-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/graalvm/shadowed/json/23.1.2/json-23.1.2.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/tukaani/xz/1.9/xz-1.9.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar:/home/pavel/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-nop/2.0.9/slf4j-nop-2.0.9.jar:/home/pavel/dev/enso/runtime.jar --add-modules=org.enso.runtime --add-exports=org.slf4j.nop/org.slf4j.nop=org.slf4j [info] # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) [info] # Warmup: <none> [info] # Measurement: 1 iterations, 1 s each [info] # Timeout: 10 min per iteration [info] # Threads: 1 thread, will synchronize iterations [info] # Benchmark mode: Average time, time/op [info] # Benchmark: org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy [info] # Run progress: 0.00% complete, ETA 00:00:01 [info] # Fork: N/A, test runs in the host VM [info] # *** WARNING: Non-forked runs may silently omit JVM options, mess up profilers, disable compiler hints, etc. *** [info] # *** WARNING: Use non-forked runs only for debugging purposes, not for actual performance runs. *** [error] SLF4J: Attempting to load provider "org.slf4j.nop.NOPServiceProvider" specified via "slf4j.provider" system property [info] Iteration 1: <failure> [info] java.lang.AssertionError: My error [info] at org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy(ArrayProxyBenchmarks.java:99) [info] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_avgt_jmhStub(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:232) [info] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_AverageTime(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:173) [info] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) [info] at java.base/java.lang.reflect.Method.invoke(Method.java:580) [info] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:475) [info] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:458) [info] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [info] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) [info] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [info] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) [info] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) [error] Benchmark run failed: Benchmark caught the exception [info] at java.base/java.lang.Thread.run(Thread.java:1583) [error] org.openjdk.jmh.runner.RunnerException: Benchmark caught the exception [error] at org.openjdk.jmh.runner.Runner.runBenchmarks(Runner.java:575) [error] at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:310) [error] at org.openjdk.jmh.runner.Runner.run(Runner.java:209) [error] at org.enso.interpreter.bench.BenchmarksRunner.runCompileOnly(BenchmarksRunner.java:93) [error] at org.enso.interpreter.bench.BenchmarksRunner.run(BenchmarksRunner.java:36) [error] at org.enso.interpreter.bench.benchmarks.RuntimeBenchmarksRunner.main(RuntimeBenchmarksRunner.java:8) [error] Caused by: org.openjdk.jmh.runner.BenchmarkException: Benchmark error during the run [error] at org.openjdk.jmh.runner.BenchmarkHandler.runIteration(BenchmarkHandler.java:424) [error] at org.openjdk.jmh.runner.BaseRunner.runBenchmark(BaseRunner.java:281) [error] at org.openjdk.jmh.runner.BaseRunner.runBenchmark(BaseRunner.java:233) [error] at org.openjdk.jmh.runner.BaseRunner.doSingle(BaseRunner.java:138) [error] at org.openjdk.jmh.runner.BaseRunner.runBenchmarksEmbedded(BaseRunner.java:110) [error] at org.openjdk.jmh.runner.Runner.runBenchmarks(Runner.java:555) [error] ... 5 more [error] Suppressed: java.lang.AssertionError: My error [error] at org.enso.interpreter.bench.benchmarks.semantic.ArrayProxyBenchmarks.sumOverComputingProxy(ArrayProxyBenchmarks.java:99) [error] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_avgt_jmhStub(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:232) [error] at org.enso.interpreter.bench.benchmarks.semantic.jmh_generated.ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.sumOverComputingProxy_AverageTime(ArrayProxyBenchmarks_sumOverComputingProxy_jmhTest.java:173) [error] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) [error] at java.base/java.lang.reflect.Method.invoke(Method.java:580) [error] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:475) [error] at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:458) [error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [error] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) [error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) [error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) [error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) [error] at java.base/java.lang.Thread.run(Thread.java:1583) [error] Nonzero exit code returned from runner: 1 [error] (Compile / run) Nonzero exit code returned from runner: 1 [error] Total time: 5 s, completed Mar 13, 2024, 12:49:59 PM ``` |
||
---|---|---|
.. | ||
base | ||
build | ||
ci_utils | ||
ci-gen | ||
cli | ||
deprecated/rust-scripts | ||
enso-formatter | ||
intellij-run-config-gen | ||
macros | ||
.gitignore | ||
README.md |
[WIP] Enso CI Build Scripts
The code under this directory is under ongoing intensive development. As such it has not been reviewed or cleaned up yet.
General principles
- Written in Rust.
- Portable. Works on any platform that Enso targets.
- Do not duplicate functionality that is already available in tools being part of our tech stack.
- Supports both developers and CI use-cases (and environments). Developers can call it locally to do anything that CI does.
- Does not require much setup work. Where feasible sets things up for the user.
Concepts
Target
- Can be built locally from sources. Building yields artifacts.
- Artifacts are self-contained to a single filesystem directory.
- Artifacts can be downloaded from a remote location rather than built with the same effect.
- Can contain other targets.
- Artifacts can be platform-specific.
- Artifacts must be releasable as CI run artifacts or release assets.
Usage
While the script is invoked using cargo run
, the convenience run
script is
provided in the repository root.
The general usage form is:
./run <command> [options]
The command itself is usually a combination of target name and subcommand, like
ide build
or backend test
.
At every layer, the --help
command can be used to get more information. Note
that the information depends on the command, so running ./run --help
will not
give you the same information as ./run ide --help
nor
./run ide build --help
.
Targets
IDE
IDE is the top level target for our project. It consists of GUI
and Backend
targets.
Sources consist mostly of TS code for the Electron client and packaging.
Artifacts are platform specific and consist of the single image file.
GUI
GUI is the front-end part of the project. It also packages WASM-compiled parser written in rust.
Artifacts are portable across the platforms and consist of the web page that can be served either using Electron client (as IDE does) or using a web server (like the Cloud version of Enso).
Backend
Backend is the back-end part of the project, as seen from the IDE perspective. It contains a Project Manager bundle that includes:
- Project Manager native image;
- Enso Engine distribution (with the Standard Library);
- GraalVM distribution.
These components are not represented as "Targets" (in terms of build script) but could be and likely will be in the future.