-
Notifications
You must be signed in to change notification settings - Fork 37
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #178 from maxulysse/nf-test-automatic-shard
implement automatic sharding for nf-test
- Loading branch information
Showing
25 changed files
with
383 additions
and
166 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
name: "Get number of shards" | ||
description: "Get the number of nf-test shards for the current CI job" | ||
inputs: | ||
max_shards: | ||
description: "Maximum number of shards allowed" | ||
required: true | ||
paths: | ||
description: "Component paths to test" | ||
required: false | ||
outputs: | ||
shard: | ||
description: "Array of shard numbers" | ||
value: ${{ steps.shards.outputs.shard }} | ||
total_shards: | ||
description: "Total number of shards" | ||
value: ${{ steps.shards.outputs.total_shards }} | ||
runs: | ||
using: "composite" | ||
steps: | ||
- name: Install nf-test | ||
uses: nf-core/setup-nf-test@v1 | ||
with: | ||
version: ${{ env.NFT_VER }} | ||
- name: Get number of shards | ||
id: shards | ||
shell: bash | ||
run: | | ||
# Run nf-test with dynamic parameter | ||
nftest_output=$(nf-test test \ | ||
--dry-run \ | ||
--profile +docker \ | ||
--filter function,workflow,pipeline \ | ||
--ci \ | ||
--changed-since HEAD^) || { | ||
echo "nf-test command failed with exit code $?" | ||
echo "Full output: $nftest_output" | ||
exit 1 | ||
} | ||
echo "nf-test dry-run output: $nftest_output" | ||
# Default values for shard and total_shards | ||
shard="[]" | ||
total_shards=0 | ||
# Check if there are related tests | ||
if echo "$nftest_output" | grep -q 'No tests to execute'; then | ||
echo "No related tests found." | ||
else | ||
# Extract the number of related tests | ||
number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') | ||
if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then | ||
shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) | ||
shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) | ||
total_shards="$shards_to_run" | ||
else | ||
echo "Unexpected output format. Falling back to default values." | ||
fi | ||
fi | ||
# Write to GitHub Actions outputs | ||
echo "shard=$shard" >> $GITHUB_OUTPUT | ||
echo "total_shards=$total_shards" >> $GITHUB_OUTPUT | ||
# Debugging output | ||
echo "Final shard array: $shard" | ||
echo "Total number of shards: $total_shards" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
name: "nf-test Action" | ||
description: "Runs nf-test with common setup steps" | ||
inputs: | ||
profile: | ||
description: "Profile to use" | ||
required: true | ||
shard: | ||
description: "Shard number for this CI job" | ||
required: true | ||
total_shards: | ||
description: "Total number of test shards(NOT the total number of matrix jobs)" | ||
required: true | ||
paths: | ||
description: "Test paths" | ||
required: true | ||
|
||
runs: | ||
using: "composite" | ||
steps: | ||
- name: Setup Nextflow | ||
uses: nf-core/setup-nextflow@v2 | ||
with: | ||
version: "${{ env.NXF_VERSION }}" | ||
|
||
- name: Set up Python | ||
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 | ||
with: | ||
python-version: "3.11" | ||
|
||
- name: Install nf-test | ||
uses: nf-core/setup-nf-test@v1 | ||
with: | ||
version: "${{ env.NFT_VER }}" | ||
|
||
- name: Setup apptainer | ||
if: contains(inputs.profile, 'singularity') | ||
uses: eWaterCycle/setup-apptainer@main | ||
|
||
- name: Set up Singularity | ||
if: contains(inputs.profile, 'singularity') | ||
shell: bash | ||
run: | | ||
mkdir -p $NXF_SINGULARITY_CACHEDIR | ||
mkdir -p $NXF_SINGULARITY_LIBRARYDIR | ||
- name: Conda setup | ||
if: ${{inputs.profile == 'conda'}} | ||
uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 | ||
with: | ||
auto-update-conda: true | ||
conda-solver: libmamba | ||
conda-remove-defaults: true | ||
|
||
- name: Install pdiff | ||
shell: bash | ||
run: | | ||
python -m pip install pdiff | ||
# TODO Skip failing conda tests and document their failures | ||
# https://github.com/nf-core/modules/issues/7017 | ||
- name: Run nf-test | ||
shell: bash | ||
env: | ||
NFT_DIFF: ${{ env.NFT_DIFF }} | ||
NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} | ||
NFT_WORKDIR: ${{ env.NFT_WORKDIR }} | ||
run: | | ||
nf-test test \ | ||
--profile=+${{ inputs.profile }} \ | ||
--tap=test.tap \ | ||
--verbose \ | ||
--ci \ | ||
--shard ${{ inputs.shard }}/${{ inputs.total_shards }} \ | ||
--filter function,workflow,pipeline | ||
# Save the absolute path of the test.tap file to the output | ||
echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT | ||
- name: Generate test summary | ||
if: always() | ||
shell: bash | ||
run: | | ||
# Add header if it doesn't exist (using a token file to track this) | ||
if [ ! -f ".summary_header" ]; then | ||
echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY | ||
echo "" >> $GITHUB_STEP_SUMMARY | ||
echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY | ||
echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY | ||
touch .summary_header | ||
fi | ||
if [ -f test.tap ]; then | ||
while IFS= read -r line; do | ||
if [[ $line =~ ^ok ]]; then | ||
test_name="${line#ok }" | ||
# Remove the test number from the beginning | ||
test_name="${test_name#* }" | ||
echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY | ||
elif [[ $line =~ ^not\ ok ]]; then | ||
test_name="${line#not ok }" | ||
# Remove the test number from the beginning | ||
test_name="${test_name#* }" | ||
echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY | ||
fi | ||
done < test.tap | ||
else | ||
echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY | ||
fi | ||
- name: Clean up | ||
if: always() | ||
shell: bash | ||
run: | | ||
sudo rm -rf /home/ubuntu/tests/ |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.