Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
759e429
feat(ci): parallelize reference tests via bucketing
jkrumbiegel Apr 16, 2026
586ee5a
fix(wglmakie): make reference tests independent of execution order
jkrumbiegel Apr 17, 2026
55abaf8
ci: apply bucketing to new reusable workflow structure
jkrumbiegel Apr 17, 2026
8d02ac5
ci: share Julia cache across buckets of same backend+version
jkrumbiegel Apr 17, 2026
15c4800
refactor: use contiguous chunks instead of interleaved bucket assignment
jkrumbiegel Apr 17, 2026
edac37d
ci: add precompilation setup job, reduce Cairo/GL to 2 buckets
jkrumbiegel Apr 17, 2026
87f3c6a
ci: use Pkg.test for setup precompilation via PRECOMPILE_ONLY
jkrumbiegel Apr 17, 2026
f186eef
ci: transfer precompiled depot via artifact instead of cache
jkrumbiegel Apr 17, 2026
a6e2064
fix(ci): transfer Manifest.toml with depot, skip install in buckets
jkrumbiegel Apr 17, 2026
297d176
fix(ci): create ~/.julia before restoring depot artifact
jkrumbiegel Apr 17, 2026
faaa76e
fix(ci): split depot and Manifest into separate artifacts
jkrumbiegel Apr 17, 2026
8ba4882
revert: drop setup job, use shared caches only
jkrumbiegel Apr 17, 2026
bbb5b25
ci: use tar-based depot artifact to preserve file permissions
jkrumbiegel Apr 17, 2026
4dc850c
refactor: replace counting pass with regex-based test count
jkrumbiegel Apr 17, 2026
b6a78c1
fix(wglmakie): reset Electron window size before each screenshot
jkrumbiegel Apr 17, 2026
e3d32a7
fix(wglmakie): normalize EScreenshot size to logical content dimensions
jkrumbiegel Apr 17, 2026
15a8ac8
fix(wglmakie): revert snapshot_figure changes, remove wrong activate!…
jkrumbiegel Apr 18, 2026
8e739d4
ci: make benchmark comment-triggered with /benchmark command
jkrumbiegel Apr 18, 2026
2692ac8
ci: compress depot tarball with zstd to speed up upload/download
jkrumbiegel Apr 18, 2026
d932aaa
fix(ci): create monorepo/ dir before extracting Manifest
jkrumbiegel Apr 18, 2026
6ded860
ci: disable auto-precompilation during pkg dev step
jkrumbiegel Apr 18, 2026
36ef14e
ci: disable auto-precompile in compute-pipeline and makie workflows too
jkrumbiegel Apr 18, 2026
d2b9642
ci: decouple Julia versions so bucket jobs don't wait across versions
jkrumbiegel Apr 18, 2026
77e6aae
debug: add JULIA_DEBUG=loading to CairoMakie bucket 1 to diagnose 1.1…
jkrumbiegel Apr 18, 2026
1fc0cd9
fix(ci): match coverage=true in setup precompile to avoid flag mismatch
jkrumbiegel Apr 18, 2026
062759e
ci: remove unused coverage from backend test workflows
jkrumbiegel Apr 18, 2026
f5e13ae
debug: add JULIA_DEBUG=loading to all setup jobs
jkrumbiegel Apr 19, 2026
b366a3c
ci: set JULIA_CPU_TARGET for portable pkgimages across runner fleet
jkrumbiegel Apr 19, 2026
1a4de46
ci: unify backend workflows into single parameterized _backend-tests.yml
jkrumbiegel Apr 20, 2026
d53028f
Merge branch 'master' into jk/parallel-reftests
jkrumbiegel Apr 20, 2026
97d0a18
fix(ci): replace shell input with test-prefix (shell doesn't support …
jkrumbiegel Apr 20, 2026
573e609
fix(ci): use compact jq output for bucket list
jkrumbiegel Apr 20, 2026
a2f0076
ci: remove JULIA_DEBUG=loading from setup jobs
jkrumbiegel Apr 20, 2026
23ac427
ci: add comments about pkgimage cache mismatches and coverage
jkrumbiegel Apr 20, 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
7 changes: 0 additions & 7 deletions .codecov.yml

This file was deleted.

120 changes: 120 additions & 0 deletions .github/workflows/_backend-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: Backend tests
on:
workflow_call:
inputs:
julia-version:
required: true
type: string
backend:
required: true
type: string
description: 'Backend name, e.g. CairoMakie, GLMakie, WGLMakie'
nbuckets:
required: false
type: number
default: 2
system-packages:
required: false
type: string
default: ''
description: 'apt packages to install (space-separated)'
test-prefix:
required: false
type: string
default: ''
description: 'Command prefix for test execution, e.g. "DISPLAY=:0 xvfb-run -s \"-screen 0 1024x768x24\""'

jobs:
setup:
name: Setup ${{ inputs.backend }} Julia ${{ inputs.julia-version }}
runs-on: ubuntu-latest
outputs:
bucket-list: ${{ steps.buckets.outputs.list }}
steps:
- id: buckets
run: echo "list=$(seq 1 ${{ inputs.nbuckets }} | jq -cs .)" >> $GITHUB_OUTPUT
- uses: actions/checkout@v6
- uses: julia-actions/setup-julia@v2
with:
version: ${{ inputs.julia-version }}
- uses: julia-actions/cache@v3
with:
cache-name: julia-cache-${{ inputs.backend }}-${{ inputs.julia-version }}
include-matrix: false
- name: Install system dependencies
if: inputs.system-packages != ''
run: sudo apt-get update && sudo apt-get install -y ${{ inputs.system-packages }}
- name: Install Julia dependencies
shell: julia --project=monorepo {0}
env:
# Don't precompile here; Pkg.test below handles it with the correct
# test environment and flags.
JULIA_PKG_PRECOMPILE_AUTO: '0'
run: |
using Pkg;
pkg"registry up"
Pkg.update()
pkg"dev ./Makie ./${{ inputs.backend }} ./ReferenceTests ./ComputePipeline"
- name: Precompile via Pkg.test
env:
PRECOMPILE_ONLY: 'true'
# Portable CPU target so pkgimages work across GitHub's heterogeneous
# runner fleet (mix of AMD Zen3, Intel Haswell, etc.).
JULIA_CPU_TARGET: 'generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)'
# NOTE: coverage is intentionally omitted. On Julia 1.10, coverage=true
# disables pkgimages (use_pkgimages=false), causing cache flag mismatches
# between setup and bucket jobs. If coverage is re-enabled, this must be
# set identically here and in the bucket test step.
run: ${{ inputs.test-prefix }} julia --color=yes --project=monorepo -e 'using Pkg; Pkg.test("${{ inputs.backend }}")'
- name: Package depot and Manifest
run: >
cp monorepo/Manifest.toml ~/.julia/monorepo-Manifest.toml &&
tar -cf /tmp/depot.tar.zst --use-compress-program zstdmt -C ~
.julia/compiled .julia/packages .julia/artifacts .julia/scratchspaces .julia/monorepo-Manifest.toml
- name: Upload depot tarball
uses: actions/upload-artifact@v7
with:
name: julia-depot-${{ inputs.backend }}-${{ inputs.julia-version }}
path: /tmp/depot.tar.zst
retention-days: 1

test:
name: ${{ inputs.backend }} Julia ${{ inputs.julia-version }} bucket ${{ matrix.bucket }}/${{ inputs.nbuckets }}
needs: setup
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
bucket: ${{ fromJSON(needs.setup.outputs.bucket-list) }}
steps:
- uses: actions/checkout@v6
- uses: julia-actions/setup-julia@v2
with:
version: ${{ inputs.julia-version }}
- name: Download depot tarball
uses: actions/download-artifact@v8
with:
name: julia-depot-${{ inputs.backend }}-${{ inputs.julia-version }}
- name: Extract depot and Manifest
run: tar -xf depot.tar.zst --use-compress-program unzstd -C ~ && mkdir -p monorepo && cp ~/.julia/monorepo-Manifest.toml monorepo/Manifest.toml
- name: Install system dependencies
if: inputs.system-packages != ''
run: sudo apt-get update && sudo apt-get install -y ${{ inputs.system-packages }}
- name: Run the tests
continue-on-error: true
env:
REFTEST_BUCKET: ${{ matrix.bucket }}
REFTEST_NBUCKETS: ${{ inputs.nbuckets }}
JULIA_CPU_TARGET: 'generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)'
run: >
${{ inputs.test-prefix }}
julia --color=yes --project=monorepo -e 'using Pkg; Pkg.test("${{ inputs.backend }}")'
&& echo "TESTS_SUCCESSFUL=true" >> $GITHUB_ENV
- name: Upload test Artifacts
uses: actions/upload-artifact@v7
with:
name: ReferenceImages_${{ inputs.backend }}_${{ inputs.julia-version }}_${{ matrix.bucket }}
path: ./${{ inputs.backend }}/test/reference_images/
- name: Fail after artifacts if tests failed
if: ${{ env.TESTS_SUCCESSFUL != 'true' }}
run: exit 1
53 changes: 0 additions & 53 deletions .github/workflows/_cairomakie.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .github/workflows/_compute-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ jobs:
- uses: julia-actions/cache@v3
- name: Develop and test ComputePipeline
shell: julia --project=monorepo {0}
env:
JULIA_PKG_PRECOMPILE_AUTO: '0'
run: |
using Pkg
# dev mono repo versions
Expand Down
58 changes: 0 additions & 58 deletions .github/workflows/_glmakie.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .github/workflows/_makie.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ jobs:
- uses: julia-actions/cache@v3
- name: Develop and test Makie
shell: julia --project=monorepo {0}
env:
JULIA_PKG_PRECOMPILE_AUTO: '0'
run: |
using Pkg
# dev mono repo versions
Expand Down
104 changes: 73 additions & 31 deletions .github/workflows/_reference-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,56 +4,98 @@ on:

jobs:
cairomakie:
uses: ./.github/workflows/_cairomakie.yml
strategy:
matrix:
julia-version: ['1.10', '1']
uses: ./.github/workflows/_backend-tests.yml
with:
julia-version: ${{ matrix.julia-version }}
backend: CairoMakie

glmakie:
uses: ./.github/workflows/_glmakie.yml
strategy:
matrix:
julia-version: ['1.10', '1']
uses: ./.github/workflows/_backend-tests.yml
with:
julia-version: ${{ matrix.julia-version }}
backend: GLMakie
system-packages: xorg-dev mesa-utils xvfb libgl1 freeglut3-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev xsettingsd x11-xserver-utils
test-prefix: 'DISPLAY=:0 xvfb-run -s "-screen 0 1024x768x24"'

wglmakie:
uses: ./.github/workflows/_wglmakie.yml
strategy:
matrix:
julia-version: ['1.10', '1']
uses: ./.github/workflows/_backend-tests.yml
with:
julia-version: ${{ matrix.julia-version }}
backend: WGLMakie
nbuckets: 4
system-packages: xorg-dev libosmesa6 libgl1-mesa-dri mesa-utils xvfb libgl1 freeglut3-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev
test-prefix: 'DISPLAY=:0 xvfb-run -s "-screen 0 2048x2048x24"'

consolidation:
name: Merge artifacts
runs-on: ubuntu-latest
if: always()
needs: [cairomakie, glmakie, wglmakie]
steps:
- uses: actions/download-artifact@v8
with:
name: ReferenceImages_WGLMakie_1
path: ./ReferenceImages/WGLMakie
- uses: actions/download-artifact@v8
- name: Download all bucket artifacts for Julia 1
uses: actions/download-artifact@v8
with:
name: ReferenceImages_CairoMakie_1
path: ./ReferenceImages/CairoMakie
- uses: actions/download-artifact@v8
with:
name: ReferenceImages_GLMakie_1
path: ./ReferenceImages/GLMakie
pattern: ReferenceImages_*_1_*
path: ./BucketArtifacts/
- name: Consolidate reference image folders
run: |
baseDir="./ReferenceImages"
baseDir="./BucketArtifacts"
outDir="./ReferenceImagesCombined"
mkdir -p "$outDir"

# Copy reference images from the first available artifact (same across all buckets/backends)
first_artifact=$(ls -d ${baseDir}/ReferenceImages_*_1_*/ 2>/dev/null | head -1)
if [ -n "$first_artifact" ] && [ -d "${first_artifact}/reference" ]; then
cp -r "${first_artifact}/reference/." "$outDir/reference/"
fi

# Initialize output files
> "$outDir/scores.tsv"
> "$outDir/new_files.txt"
> "$outDir/missing_files.txt"

for backend in CairoMakie GLMakie WGLMakie; do
mkdir -p "$outDir/recorded/${backend}/"

# Merge all buckets for this backend
for bucket_dir in ${baseDir}/ReferenceImages_${backend}_1_*/; do
[ -d "$bucket_dir" ] || continue

# Copy recorded images (no overlap between buckets)
if [ -d "${bucket_dir}/recorded/${backend}/" ]; then
cp -r "${bucket_dir}/recorded/${backend}/." "$outDir/recorded/${backend}/"
fi

# Create new top-level directory for combined files
mkdir -p "./ReferenceImagesCombined"
# Concatenate scores and new_files from each bucket
[ -f "${bucket_dir}/scores.tsv" ] && cat "${bucket_dir}/scores.tsv" >> "$outDir/scores.tsv"
[ -f "${bucket_dir}/new_files.txt" ] && cat "${bucket_dir}/new_files.txt" >> "$outDir/new_files.txt"
done

# Copy the reference folder from GLMakie, it's the same for all backends
cp -r "${baseDir}/GLMakie/reference/." "./ReferenceImagesCombined/reference/"
# Compute missing_files: reference files that were neither recorded nor skipped
if [ -d "$outDir/reference/${backend}" ]; then
first_bucket=$(ls -d ${baseDir}/ReferenceImages_${backend}_1_*/ 2>/dev/null | head -1)

# Initialize empty files for concatenation
> "./ReferenceImagesCombined/scores.tsv"
> "./ReferenceImagesCombined/new_files.txt"
# Build sorted list of files that are accounted for (recorded + skipped)
{
[ -d "$outDir/recorded/${backend}" ] && (cd "$outDir/recorded" && find "${backend}" -type f)
[ -n "$first_bucket" ] && [ -f "${first_bucket}/skipped_names.txt" ] && cat "${first_bucket}/skipped_names.txt"
} | sort -u > /tmp/have_or_skip.txt

# Loop through the directories and concatenate the files, and copy recorded folders
for dir in WGLMakie CairoMakie GLMakie; do
# Concatenate scores.tsv, new_files.txt and missing_files.txt
cat "${baseDir}/${dir}/scores.tsv" >> "./ReferenceImagesCombined/scores.tsv"
cat "${baseDir}/${dir}/new_files.txt" >> "./ReferenceImagesCombined/new_files.txt"
cat "${baseDir}/${dir}/missing_files.txt" >> "./ReferenceImagesCombined/missing_files.txt"
# Reference files
(cd "$outDir/reference" && find "${backend}" -type f) | sort > /tmp/ref_files.txt

# Copy recorded folder
mkdir -p "./ReferenceImagesCombined/recorded/${dir}/"
cp -r "${baseDir}/${dir}/recorded/${dir}/." "./ReferenceImagesCombined/recorded/${dir}/"
# Missing = reference - (recorded ∪ skipped)
comm -23 /tmp/ref_files.txt /tmp/have_or_skip.txt >> "$outDir/missing_files.txt"
fi
done

echo "Files and folders have been successfully combined into ReferenceImagesCombined."
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/_rprmakie.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ jobs:
- uses: julia-actions/cache@v3
- name: Install Julia dependencies
shell: julia --project=monorepo {0}
env:
JULIA_PKG_PRECOMPILE_AUTO: '0'
run: |
using Pkg;
pkg"registry up"
Expand Down
Loading
Loading