Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
75f412f
Add automated port conformance status page
shai-almog Jul 16, 2026
f77107f
Add copyright headers to port status assets
shai-almog Jul 16, 2026
1f09cd1
Populate and expose port status results
shai-almog Jul 16, 2026
f62c9e2
Use successful workflows for initial port status
shai-almog Jul 16, 2026
afc4757
Gate port status website output
shai-almog Jul 16, 2026
fe81b02
Render port status as static snapshot
shai-almog Jul 16, 2026
ed75bf9
Keep port status on page scroll
shai-almog Jul 16, 2026
2d3bf99
Expand port status coverage
shai-almog Jul 16, 2026
0e9c63d
Add deployment and browser evidence
shai-almog Jul 16, 2026
59c03f3
Report absolute performance for every port
shai-almog Jul 16, 2026
861b1d3
Add standard header to shared benchmark
shai-almog Jul 16, 2026
1a886e3
Add standard header to clean target test
shai-almog Jul 16, 2026
63c48f5
Remove duplicate macOS workflow trigger
shai-almog Jul 16, 2026
5309ea2
Separate benchmark workloads from runner
shai-almog Jul 16, 2026
b51436a
Fix minified status validation and JS benchmark
shai-almog Jul 16, 2026
9df6f7a
Allow pre-merge browser evidence dispatch
shai-almog Jul 16, 2026
63b7d54
Run status publishers on manual dispatch
shai-almog Jul 16, 2026
d650b41
Complete nightly performance collection
shai-almog Jul 16, 2026
91eece2
Seed first nightly port evidence
shai-almog Jul 16, 2026
d17e18e
Stop nightly capture after benchmark evidence
shai-almog Jul 16, 2026
e447394
Remove incomparable size and memory metrics
shai-almog Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/ant.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ jobs:

steps:
- uses: actions/checkout@v6
- name: Free disk space for desktop runtime dependencies
run: |
# This Java-only job does not use the preinstalled Android, .NET, or
# Haskell toolchains. cn1-binaries-javase intentionally resolves large
# cross-platform JCEF and FFmpeg artifacts, then integration tests copy
# them into generated applications, so the stock runner otherwise runs
# out of disk while duplicating those artifacts.
sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc
df -h /
- name: Set up JDK 8
uses: actions/setup-java@v5
with:
Expand Down
29 changes: 28 additions & 1 deletion .github/workflows/linux-build-run.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ on:
# diff limit, so pull_request triggers stopped firing -- dispatch with
# gh workflow run <file> --ref <branch>
workflow_dispatch:
schedule:
- cron: '45 1 * * *'
pull_request:
paths:
- '.github/workflows/linux-build-run.yml'
Expand Down Expand Up @@ -355,7 +357,7 @@ jobs:
compare-comment:
name: screenshot-comment
needs: build-run
if: github.event_name == 'pull_request'
if: github.event_name == 'pull_request' || github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
permissions:
contents: read
Expand Down Expand Up @@ -383,6 +385,18 @@ jobs:
name: linux-screenshot-raw-arm64
path: artifacts/linux-port/raw-arm64
continue-on-error: true
- name: Download x64 benchmark binary
uses: actions/download-artifact@v4
with:
name: linux-demo-x64
path: artifacts/linux-port/demo-x64
continue-on-error: true
- name: Download arm64 benchmark binary
uses: actions/download-artifact@v4
with:
name: linux-demo-arm64
path: artifacts/linux-port/demo-arm64
continue-on-error: true

- name: Post screenshots to PR
shell: bash
Expand All @@ -397,6 +411,7 @@ jobs:
# screenshot that has no committed golden (missing_expected).
export CN1SS_FAIL_ON_MISMATCH=1
export CN1SS_ALLOWED_MISSING=0
if [ "${{ github.event_name }}" != "pull_request" ]; then export CN1SS_SKIP_COMMENT=1; fi
for arch in x64 arm64; do
raw="$ART/raw-$arch"
[ -d "$raw" ] || continue
Expand All @@ -409,6 +424,9 @@ jobs:
if [ "$arch" = "arm64" ]; then REF="scripts/linux/screenshots-arm"; else REF="scripts/linux/screenshots"; fi
echo "Posting ${#entries[@]} screenshot(s) for $arch (baseline $REF)"
mkdir -p "$ART/previews-$arch"
export CN1SS_PORT_ID="linux-$arch"
export CN1SS_SUITE_LOG="$raw/app-output.log"
export CN1SS_BINARY_PATH="$ART/demo-$arch/codenameone-linux-demo-$arch"
set +e
CN1SS_COMMENT_MARKER="<!-- CN1SS_LINUX_${arch}_COMMENT -->" \
CN1SS_COMMENT_LOG_PREFIX="[linux-gtk-$arch]" \
Expand All @@ -434,3 +452,12 @@ jobs:
done
if [ "$posted" -eq 0 ]; then echo "No screenshots produced; skipping comment."; fi
if [ "$fail" -ne 0 ]; then echo "Linux screenshot gate failed."; exit 1; fi

- name: Upload Linux port status
if: always()
uses: actions/upload-artifact@v4
with:
name: port-status-linux
path: artifacts/linux-port/port-status-linux-*.json
if-no-files-found: warn
retention-days: 14
34 changes: 28 additions & 6 deletions .github/workflows/parparvm-tests-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@ name: ParparVM Java Tests (Windows)
# is disabled so the x64 leg always runs to completion.

on:
workflow_dispatch:
schedule:
- cron: '5 2 * * *'
pull_request:
paths:
- '.github/workflows/parparvm-tests-windows.yml'
- 'vm/**'
- 'Ports/WindowsPort/**'
- 'scripts/hellocodenameone/**'
- '!vm/**/README.md'
- '!vm/**/readme.md'
- '!vm/**/docs/**'
Expand All @@ -35,6 +39,7 @@ on:
- '.github/workflows/parparvm-tests-windows.yml'
- 'vm/**'
- 'Ports/WindowsPort/**'
- 'scripts/hellocodenameone/**'
- '!vm/**/README.md'
- '!vm/**/readme.md'
- '!vm/**/docs/**'
Expand Down Expand Up @@ -209,12 +214,13 @@ jobs:
# mode -- the app paints into an offscreen Direct2D/WIC bitmap (no window) and
# writes a PNG. The PNG is uploaded as an artifact; the companion comment job
# posts it to the PR. This x64 leg also publishes the compiled core + port
# bytecode for the native arm64 leg (windows-port-screenshot-arm64). PR events
# only (the comment job needs PR context). Separate from the clean-target gate
# so a rendering hiccup never blocks merges.
# bytecode for the native arm64 leg (windows-port-screenshot-arm64). Pull
# requests render review artifacts; master runs also produce the durable
# Windows ARM64 compliance report consumed by the static Port Status page.
# Separate from the clean-target gate so a rendering hiccup never blocks merges.
windows-port-screenshot:
name: screenshot-capture (x64)
if: github.event_name == 'pull_request'
if: github.event_name == 'pull_request' || github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: windows-latest
timeout-minutes: 90
steps:
Expand Down Expand Up @@ -362,6 +368,7 @@ jobs:
env:
JDK_8_HOME: ${{ env.JDK_8_HOME }}
CN1_SHOT_OUTPUT_DIR: ${{ github.workspace }}\artifacts\windows-port\raw
CN1_PERFORMANCE_BINARY_OUT: ${{ github.workspace }}\artifacts\windows-port\raw\benchmark-app.exe
run: |
mvn -B clean package -pl JavaAPI -am -DskipTests
mvn -B test -pl tests -am '-Dtest=CleanTargetIntegrationTest#capturesHelloSuiteOverWebSocket' '-Dsurefire.failIfNoSpecifiedTests=false'
Expand Down Expand Up @@ -399,7 +406,7 @@ jobs:
windows-port-screenshot-arm64:
name: screenshot-capture (arm64)
needs: windows-port-screenshot
if: github.event_name == 'pull_request'
if: github.event_name == 'pull_request' || github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: windows-11-arm
continue-on-error: true
timeout-minutes: 60
Expand Down Expand Up @@ -486,6 +493,8 @@ jobs:
shell: pwsh
env:
CN1_SHOT_OUTPUT_DIR: ${{ github.workspace }}\artifacts\windows-port\raw
CN1_PERFORMANCE_BINARY_OUT: ${{ github.workspace }}\artifacts\windows-port\raw\benchmark-app.exe
CN1_REQUIRE_PERFORMANCE: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}
run: |
mvn -B clean package -pl JavaAPI -am -DskipTests
mvn -B test -pl tests -am '-Dtest=CleanTargetIntegrationTest#capturesHelloSuiteOverWebSocket' '-Dsurefire.failIfNoSpecifiedTests=false'
Expand Down Expand Up @@ -599,7 +608,7 @@ jobs:
windows-port-screenshot-comment-arm64:
name: screenshot-comment (arm64)
needs: windows-port-screenshot-arm64
if: github.event_name == 'pull_request'
if: github.event_name == 'pull_request' || github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
continue-on-error: true
runs-on: ubuntu-latest
permissions:
Expand Down Expand Up @@ -651,6 +660,10 @@ jobs:
# the PR -- but the mismatch is no longer silent.
export CN1SS_FAIL_ON_MISMATCH=1
export CN1SS_ALLOWED_MISSING=0
export CN1SS_PORT_ID=windows-arm64
export CN1SS_BINARY_PATH="$ART/raw/benchmark-app.exe"
export CN1SS_SUITE_LOG="$ART/raw/app-output.log"
if [ "${{ github.event_name }}" != "pull_request" ]; then export CN1SS_SKIP_COMMENT=1; fi
set +e
cn1ss_process_and_report \
"Native Windows port (arm64)" \
Expand All @@ -669,6 +682,15 @@ jobs:
fi
if [ "$fail" -ne 0 ]; then echo "Windows arm64 screenshot gate failed."; exit 1; fi

- name: Upload Windows ARM64 port status
if: always()
uses: actions/upload-artifact@v4
with:
name: port-status-windows-arm64
path: artifacts/windows-port/port-status-windows-arm64.json
if-no-files-found: warn
retention-days: 14

# Widgets Board provider compile check: compiles the one nativeSources TU no
# other CI leg ever compiles -- cn1_windows_widgetboard.cpp, which is gated
# behind CN1_WIDGETBOARD (the default CMake build never defines it and the
Expand Down
70 changes: 70 additions & 0 deletions .github/workflows/port-status-contract.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Validate port status contract

on:
pull_request:
paths:
- '.github/workflows/port-status-contract.yml'
- 'docs/website/data/port_status.json'
- 'docs/website/data/port_status_supplement.json'
- 'docs/website/data/port_status_support.json'
- 'docs/website/data/port_status_environment.json'
- 'docs/website/data/port_status_reports/**'
- 'scripts/hellocodenameone/common/src/main/**'
- 'scripts/hellocodenameone/conformance/**'
- 'scripts/run-javascript-lifecycle-tests.mjs'
- 'scripts/website/collect_browser_evidence.mjs'
- 'scripts/website/sync_port_status_reports.sh'
- '.github/workflows/port-status-nightly.yml'
- 'scripts/android/screenshots/**'
- 'scripts/ios/screenshots/**'
- 'scripts/ios/screenshots-metal/**'
- 'scripts/ios/screenshots-watch/**'
- 'scripts/ios/screenshots-tv/**'
- 'scripts/mac-native/screenshots/**'
- 'scripts/javascript/screenshots/**'
- 'scripts/linux/screenshots/**'
- 'scripts/linux/screenshots-arm/**'
- 'scripts/windows/screenshots/**'
push:
branches: [master]
paths:
- '.github/workflows/port-status-contract.yml'
- 'docs/website/data/port_status.json'
- 'docs/website/data/port_status_supplement.json'
- 'docs/website/data/port_status_support.json'
- 'docs/website/data/port_status_environment.json'
- 'docs/website/data/port_status_reports/**'
- 'scripts/hellocodenameone/common/src/main/**'
- 'scripts/hellocodenameone/conformance/**'
- 'scripts/run-javascript-lifecycle-tests.mjs'
- 'scripts/website/collect_browser_evidence.mjs'
- 'scripts/website/sync_port_status_reports.sh'
- '.github/workflows/port-status-nightly.yml'
- 'scripts/android/screenshots/**'
- 'scripts/ios/screenshots/**'
- 'scripts/ios/screenshots-metal/**'
- 'scripts/ios/screenshots-watch/**'
- 'scripts/ios/screenshots-tv/**'
- 'scripts/mac-native/screenshots/**'
- 'scripts/javascript/screenshots/**'
- 'scripts/linux/screenshots/**'
- 'scripts/linux/screenshots-arm/**'
- 'scripts/windows/screenshots/**'
workflow_dispatch:

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Validate every test and golden mapping
run: python3 scripts/hellocodenameone/conformance/port_status.py validate
- name: Run normalizer tests
working-directory: scripts/hellocodenameone/conformance
run: python3 -m unittest -v test_port_status.py
109 changes: 109 additions & 0 deletions .github/workflows/port-status-nightly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: Nightly platform and browser evidence

on:
workflow_call:
schedule:
- cron: '35 2 * * *'
workflow_dispatch:

permissions:
actions: write
contents: write

jobs:
build-javascript-app:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '8'
cache: maven
- name: Prepare Codename One binaries
run: |
mkdir -p ~/.codenameone
cp maven/UpdateCodenameOne.jar ~/.codenameone/
mvn -B -f maven/pom.xml -pl parparvm -am -DskipTests -Dmaven.javadoc.skip=true package
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'
cache: maven
- name: Install Xvfb
run: bash scripts/ci/apt-get-update.sh && sudo apt-get install -y --no-install-recommends xvfb
- name: Set up workspace
run: xvfb-run ./scripts/setup-workspace.sh -q -DskipTests
- name: Build compliance application for JavaScript
run: SKIP_PARPARVM_BUILD=1 xvfb-run ./scripts/build-javascript-port-hellocodenameone.sh "${GITHUB_WORKSPACE}/hellocodenameone-javascript-port.zip"
- uses: actions/upload-artifact@v4
with:
name: nightly-javascript-app
path: hellocodenameone-javascript-port.zip
retention-days: 2

browser-lifecycle:
needs: build-javascript-app
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
browser: [chromium, firefox, webkit]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '20'
- uses: actions/download-artifact@v4
with:
name: nightly-javascript-app
- name: Install Playwright browser
working-directory: scripts
run: |
npm init -y 2>/dev/null || true
npm install playwright
npx playwright install --with-deps "${{ matrix.browser }}"
- name: Run lifecycle validation
env:
CN1_PLAYWRIGHT_BROWSER: ${{ matrix.browser }}
CN1_LIFECYCLE_TIMEOUT_SECONDS: '120'
CN1_LIFECYCLE_REPORT_DIR: ${{ github.workspace }}/artifacts/browser-${{ matrix.browser }}
run: node scripts/run-javascript-lifecycle-tests.mjs hellocodenameone-javascript-port.zip
- name: Upload browser evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: browser-evidence-${{ matrix.browser }}
path: artifacts/browser-${{ matrix.browser }}
retention-days: 14
if-no-files-found: error

publish-browser-evidence:
if: always() && needs.build-javascript-app.result == 'success'
needs: [build-javascript-app, browser-lifecycle]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/download-artifact@v4
with:
pattern: browser-evidence-*
path: artifacts/browser-evidence
- name: Assemble static browser evidence
run: node scripts/website/collect_browser_evidence.mjs artifacts/browser-evidence artifacts/port-status-environment.json
- uses: actions/upload-artifact@v4
with:
name: port-status-environment
path: artifacts/port-status-environment.json
retention-days: 30
- name: Publish master evidence to the data branch
if: github.ref == 'refs/heads/master'
env:
GH_TOKEN: ${{ github.token }}
run: scripts/hellocodenameone/conformance/publish_port_status_environment.sh artifacts/port-status-environment.json
- name: Rebuild the static website snapshot
if: github.ref == 'refs/heads/master'
env:
GH_TOKEN: ${{ github.token }}
run: gh workflow run website-docs.yml --ref master
Loading
Loading