Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
6ce88a0
perf: bump to dna-seq-benchmark 1.14.1
famosab Nov 25, 2025
9542093
Merge branch 'main' into perf/bump
johanneskoester Dec 9, 2025
45f3fbf
chore: Update snakemake-github-action to version 2.0.3
BiancaStoecker Dec 18, 2025
5c11a72
try: dividing into subcategories
famosab Jan 23, 2026
6c50241
test: add back secrets
famosab Jan 23, 2026
307f3a1
fix: args syntax
famosab Jan 23, 2026
66b6c3b
fix: args syntax
famosab Jan 23, 2026
939d4e6
fix: action version
famosab Jan 23, 2026
de17e28
fix: dl reference
famosab Jan 23, 2026
6e73b80
test: split matrix by benchmark
famosab Jan 23, 2026
d314bf1
test: change matrix
famosab Jan 26, 2026
53ef4cf
fix: full matrix
famosab Jan 26, 2026
3e95dd4
fix: add token
famosab Jan 26, 2026
2e41623
fix: tmp
famosab Jan 26, 2026
b19d15b
test: add rule all
famosab Jan 27, 2026
89e1adc
test: modify snakemake command
famosab Jan 27, 2026
2a31f63
fix: move target
famosab Jan 27, 2026
d2a6438
fix: move target
famosab Jan 27, 2026
801c558
fix: rule all
famosab Jan 27, 2026
2e74f12
fix: rule all
famosab Jan 27, 2026
843c5b6
fix: move target
famosab Jan 27, 2026
e26c476
test: other rerun trigger
famosab Jan 27, 2026
6e915d3
test: change directory
famosab Jan 27, 2026
4442b4b
test: add debug
famosab Jan 27, 2026
e1aab9f
test: add dry-run
famosab Jan 27, 2026
51d4094
test: different structure of gha
famosab Jan 27, 2026
503cf5c
test: more debug
famosab Jan 27, 2026
6d81500
test: create conda envs separately
famosab Jan 27, 2026
89d77f2
test: new gha structure
famosab Jan 27, 2026
894f40b
fix: workflow
famosab Jan 27, 2026
fe4cf19
fix: bm analysis
famosab Jan 27, 2026
9b98961
fix: envs
famosab Jan 27, 2026
a112fc7
fix: envs
famosab Jan 27, 2026
6d8060e
fix: envs
famosab Jan 27, 2026
9837a89
test: new gha
famosab Jan 27, 2026
c95a2f4
fix: upgrade version
famosab Jan 27, 2026
eeabfbb
fix: add analysis and downstream
famosab Jan 27, 2026
4363cac
fix: target
famosab Jan 30, 2026
cee58a8
fix: change target
famosab Jan 30, 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
87 changes: 54 additions & 33 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,37 @@ name: benchmark

on:
push:
branches:
- main
branches: [main]
pull_request:
workflow_dispatch:


concurrency:
# Cancel concurrent flows
group: ci-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

jobs:
# 1. SETUP: Dynamically find the samples
setup:
runs-on: ubuntu-latest
outputs:
samples: ${{ steps.set-matrix.outputs.samples }}
steps:
- uses: actions/checkout@v4
- id: set-matrix
run: |
# Auto-discover benchmarks from resources/regions/, but only keep
# those that include a target regions BED (required by the workflow).
SAMPLES=$(for d in resources/regions/*/; do [ -f "$d/target-regions.bed" ] && basename "$d"; done | jq -R -s -c 'split("\n")[:-1]')
echo "samples=$SAMPLES" >> $GITHUB_OUTPUT

# 2. EVALUATE: The matrix-based analysis
evaluate:
needs: setup
runs-on: ubuntu-latest
permissions:
actions: write
strategy:
fail-fast: false
matrix:
sample: ${{ fromJson(needs.setup.outputs.samples) }}
env:
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
ZENODO_TOKEN: ${{ secrets.ZENODO_TOKEN }}
Expand All @@ -27,26 +42,12 @@ jobs:
BO_CORE_UNIT_TOKEN: ${{ secrets.BO_CORE_UNIT_TOKEN }}
BENCHMARK_GIAB_NA12878_TWIST_TOKEN: ${{ secrets.BENCHMARK_GIAB_NA12878_TWIST_TOKEN }}
SNAKEMAKE_STORAGE_ZENODO_ACCESS_TOKEN: ${{ secrets.SNAKEMAKE_STORAGE_ZENODO_ACCESS_TOKEN }}
steps:
- uses: 8BitJonny/gh-get-current-pr@3.0.0
id: pr
with:
sha: ${{ github.event.pull_request.head.sha }}
filterOutClosed: true

- run: |
echo "is PR: ${{ steps.pr.outputs.pr_found }}"
echo "current branch: ${{ github.ref }}"

steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@v1.3.1
with:
# this might remove tools that are actually needed,
# if set to "true" but frees about 6 GB
tool-cache: false

# all of these default to true, but feel free to set to
# "false" if necessary for your workflow
android: true
dotnet: true
haskell: true
Expand All @@ -58,7 +59,7 @@ jobs:
uses: actions/checkout@v4

- name: Download reference genome
uses: snakemake/snakemake-github-action@v2
uses: snakemake/snakemake-github-action@v2.0.3
with:
directory: "."
snakefile: "workflow/Snakefile"
Expand All @@ -68,25 +69,22 @@ jobs:
pip install snakemake-storage-plugin-http

- name: Download truthsets
uses: snakemake/snakemake-github-action@v2
uses: snakemake/snakemake-github-action@v2.0.3
with:
directory: "."
snakefile: "workflow/Snakefile"
args: "--sdm conda --cores 1 --conda-cleanup-pkgs cache --until benchmark_get_truth"
args: "--sdm conda --cores 1 --conda-cleanup-pkgs cache --until benchmark_get_truth --config benchmark=${{ matrix.sample }}"
stagein: |
pip install snakemake-storage-plugin-zenodo
pip install snakemake-storage-plugin-http

# This step is necessary (after downloading the truthsets above) to ensure
# that the files coming from the git repo are not triggering reruns
# because their modification dates are too new or too old.
# (as git does not preserve modification dates)
- name: Fix modification dates
uses: snakemake/snakemake-github-action@v2
uses: snakemake/snakemake-github-action@v2.0.3
with:
directory: "."
snakefile: "workflow/Snakefile"
args: "--cores 1 --sdm conda --touch resources/regions/*/test-regions.cov-*.bed"
# Only touch the files for THIS matrix sample
args: "--cores 1 --sdm conda --touch resources/regions/${{ matrix.sample }}/test-regions.cov-*.bed"
stagein: |
pip install snakemake-storage-plugin-zenodo
pip install snakemake-storage-plugin-http
Expand All @@ -97,11 +95,35 @@ jobs:
directory: "."
snakefile: "workflow/Snakefile"
args: >
benchmark_all
--config benchmark=${{ matrix.sample }}
--cores 4 --sdm conda --conda-cleanup-pkgs cache --rerun-triggers mtime --all-temp
stagein: |
pip install snakemake-storage-plugin-zenodo
pip install snakemake-storage-plugin-http

- name: Upload results
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.sample }}
# Upload the workflow outputs (keeps the on-disk paths Snakemake expects).
path: results/
retention-days: 1

# 3. REPORT: Combine and Deploy
report:
needs: evaluate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Download all results
uses: actions/download-artifact@v4
with:
# Merge all benchmark artifacts back into the workspace so Snakemake sees `results/`.
path: .
merge-multiple: true

- name: Create report
uses: snakemake/snakemake-github-action@v2
with:
Expand All @@ -112,15 +134,14 @@ jobs:
pip install snakemake-storage-plugin-zenodo
pip install snakemake-storage-plugin-http

- name: Upload report as artifact

- name: Upload final report
uses: actions/upload-artifact@v4
with:
name: report
path: report.zip

- name: Trigger homepage build
if: ${{ (steps.pr.outputs.pr_found != 'true') && (github.ref == 'refs/heads/main') }}
if: github.ref == 'refs/heads/main'
uses: benc-uk/workflow-dispatch@v1
with:
workflow: deploy-page
Expand Down
2 changes: 1 addition & 1 deletion workflow/Snakefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ module benchmark:
github(
"snakemake-workflows/dna-seq-benchmark",
path="workflow/Snakefile",
tag="v1.13.0",
tag="v1.14.1",
)
config:
config
Expand Down
20 changes: 20 additions & 0 deletions workflow/rules/common.smk
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,26 @@ def get_zenodo_tag(entry):
return "zenodo"


# Filter callsets by subcategory if specified via --config subcategory=...
# This allows running benchmarks in parallel across multiple CI runners
if "subcategory" in config:
config["variant-calls"] = {
key: callset
for key, callset in config["variant-calls"].items()
if callset.get("subcategory") == config["subcategory"]
}


# Filter callsets by benchmark if specified via --config benchmark=...
# This allows splitting CI work further (e.g. giab-NA12878-agilent-75M vs 200M).
if "benchmark" in config:
config["variant-calls"] = {
key: callset
for key, callset in config["variant-calls"].items()
if callset.get("benchmark") == config["benchmark"]
}


# add path to callsets
for key, callset in config["variant-calls"].items():
if "zenodo" in callset:
Expand Down
Loading