View Build Status Dashboard - Live results for all tested Vaadin versions
This project continuously validates that Vaadin add-ons and applications build successfully against the latest Vaadin framework versions, including unreleased snapshots. It helps detect compatibility issues early, before they affect end users.
The more projects we test, the better! Each additional project increases test coverage and helps the Vaadin team catch regressions before releases. When your project is included:
- Early warning: You'll know about breaking changes in Vaadin before they're released
- Help Vaadin: Your real-world usage patterns help catch edge cases that unit tests miss
- Stay compatible: Automatic testing against snapshots means fewer surprises when updating
Even just verifying that your project compiles against new Vaadin versions is valuable. But it's even better if your project has actual tests that run during mvn verify:
- Unit tests - Basic component and logic testing
- Integration tests - Spring context, database, etc.
- E2E tests - Selenium, TestBench, Playwright, or similar
Tests run on a dedicated GitHub Actions runner with plenty of resources (we can add more if needed). A reasonable build time is a few minutes per project. If your project needs custom Maven flags or profiles, we can configure that.
This is currently an unofficial proof-of-concept by @mstahv, but the plan is to make this an official tool maintained by the Vaadin team in the future.
Create an issue to propose your add-on or application. Both public add-ons and example applications are welcome.
A JBang script for testing Vaadin ecosystem projects (add-ons and applications) against different Vaadin framework versions.
Security Warning: This tool clones and builds external repositories, executing Maven plugins and code without verification. Run this only in an isolated environment such as a container, VM, or CI runner. Never run on a machine with sensitive data or credentials.
- Java 21 or higher
- JBang installed
- Git
- Maven
- SDKMAN (optional, for per-project Java version switching)
Run the script directly with JBang:
./EcosystemBuild.javaOr explicitly with JBang:
jbang EcosystemBuild.java| Option | Description | Default |
|---|---|---|
-v, --vaadin.version |
Vaadin version to test against | latest from Maven Central |
-w, --work-dir |
Working directory for cloning projects | work |
-c, --clean |
Clean version-specific output directory before running | false |
-p, --projects |
Comma-separated list of project names to test | all |
-j, --buildThreads |
Number of concurrent builds | 1 |
-q, --quiet-downloads |
Silence Maven download progress messages | false |
-t, --timeout |
Build timeout per project in minutes | 2 |
-h, --help |
Show help message | |
-V, --version |
Print version info |
Test against the default Vaadin version:
./EcosystemBuild.javaTest against a specific Vaadin version:
./EcosystemBuild.java -v 24.6.0Clean the work directory and run fresh:
./EcosystemBuild.java --clean -v 25.0.5Test only specific projects:
./EcosystemBuild.java -p hugerte-for-flow,super-fieldsRun builds in parallel (4 concurrent jobs):
./EcosystemBuild.java -j 4Edit the ADDONS and APPS lists at the top of EcosystemBuild.java:
private static final List<AddonProject> ADDONS = List.of(
new AddonProject() {{
name = "my-addon";
repoUrl = "https://github.com/org/my-addon";
}},
new AddonProject() {{
name = "complex-addon";
repoUrl = "https://github.com/org/complex-addon";
buildSubdir = "addon-module";
javaVersion = "21-tem";
}}
);
private static final List<AppProject> APPS = List.of(
new AppProject() {{
name = "my-app";
repoUrl = "https://github.com/org/my-vaadin-app";
}}
);| Field | Description |
|---|---|
name |
Directory name for the cloned repository |
repoUrl |
Git repository URL |
branch |
Branch to checkout (optional, auto-detects default) |
buildSubdir |
Subdirectory to run Maven in (optional, for multi-module projects) |
javaVersion |
SDKMAN Java version identifier (e.g., "21-tem", auto-installs if missing) |
useAddonsRepo |
Enable Vaadin Directory repository for dependencies |
extraMvnArgs |
Additional Maven arguments |
ignored |
Skip this project if true |
ignoreReason |
Reason for ignoring (shown in output) |
When a custom Vaadin version is specified (via -v), the script automatically uses settings.xml which includes the Vaadin pre-release and snapshot repositories:
https://maven.vaadin.com/vaadin-prereleases- For beta, RC, and snapshot versions
This allows testing projects against unreleased Vaadin versions:
# Test against a beta version
./EcosystemBuild.java -v 25.1.0.beta1
# Test against a snapshot
./EcosystemBuild.java -v 25.1-SNAPSHOTThe repository includes a GitHub Actions workflow with:
- Every 3 hours: Tests against Vaadin
25.0-SNAPSHOTand25.1-SNAPSHOT(staggered) to catch regressions early - Daily: Tests against
24.9-SNAPSHOT(5:00 UTC) and the latest stable release from Maven Central (6:00 UTC) - Runs on self-hosted runner with work directory preserved between runs
- Creates a GitHub issue with
build-failurelabel if the build fails - Issues include the specific Vaadin version for tracking
- Watch the repository to get notified of new issues
If a project fails but has an open GitHub issue that mentions both the project name and the Vaadin version being tested, it will be marked as "known issue" instead of failing the build. This prevents repeated notifications for already-tracked problems.
- Go to Actions tab in GitHub
- Select Ecosystem Build workflow
- Click Run workflow
- Optionally specify a Vaadin version (defaults to latest stable)
- Build logs are uploaded as artifacts for inspection
- Clones (or updates) each configured project repository into the work directory
- Auto-detects the default branch (main/master/etc.) from the remote
- Installs and switches Java version via SDKMAN if configured (auto-installs if missing)
- Updates
vaadin.versionproperty using Maven versions plugin - Runs
mvn clean verifyfor each project - Displays a live status table grouped by project type with build progress
- Saves full build logs to
work/<project-name>-build.log - Reports success/failure status with colored output and timing information
- Returns exit code 0 if all tests pass, 1 otherwise