From 13fa0ccb3a87470f393dbe1ff3da2bed2a0021f7 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 30 Apr 2025 12:26:08 +0000 Subject: [PATCH 1/3] Template update for nf-core/tools version 3.2.1 --- .github/workflows/awsfulltest.yml | 41 ++---- .github/workflows/ci.yml | 1 + .nf-core.yml | 19 ++- assets/email_template.html | 141 ++++++--------------- assets/nf-core-bactmap_logo_light.png | Bin 75729 -> 75733 bytes docs/images/nf-core-bactmap_logo_dark.png | Bin 28573 -> 28533 bytes docs/images/nf-core-bactmap_logo_light.png | Bin 24636 -> 24513 bytes nextflow.config | 2 +- ro-crate-metadata.json | 23 +++- 9 files changed, 79 insertions(+), 148 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 8b87c69f..7547da8f 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -4,44 +4,23 @@ name: nf-core AWS full size tests # It runs the -profile 'test_full' on AWS batch on: - pull_request: - branches: - - main - - master workflow_dispatch: pull_request_review: types: [submitted] + release: + types: [published] jobs: run-platform: name: Run AWS full tests - # run only if the PR is approved by at least 2 reviewers and against the master branch or manually triggered - if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'master' || github.event_name == 'workflow_dispatch' + # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered + if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - - name: Get PR reviews - uses: octokit/request-action@v2.x - if: github.event_name != 'workflow_dispatch' - id: check_approvals - continue-on-error: true - with: - route: GET /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews?per_page=100 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check for approvals - if: ${{ failure() && github.event_name != 'workflow_dispatch' }} - run: | - echo "No review approvals found. At least 2 approvals are required to run this action automatically." - exit 1 - - - name: Check for enough approvals (>=2) - id: test_variables - if: github.event_name != 'workflow_dispatch' + - name: Set revision variable + id: revision run: | - JSON_RESPONSE='${{ steps.check_approvals.outputs.data }}' - CURRENT_APPROVALS_COUNT=$(echo $JSON_RESPONSE | jq -c '[.[] | select(.state | contains("APPROVED")) ] | length') - test $CURRENT_APPROVALS_COUNT -ge 2 || exit 1 # At least 2 approvals are required + echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 @@ -52,12 +31,12 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - revision: ${{ github.sha }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/bactmap/work-${{ github.sha }} + revision: ${{ steps.revision.outputs.revision }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/bactmap/work-${{ steps.revision.outputs.revision }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/bactmap/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/bactmap/results-${{ steps.revision.outputs.revision }}" } profiles: test_full diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df615bda..953beb7b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,5 +83,6 @@ jobs: uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} run: | nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.nf-core.yml b/.nf-core.yml index 29b98257..cea52597 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,16 +1,13 @@ -repository_type: pipeline - -nf_core_version: 3.2.0 - lint: {} - +nf_core_version: 3.2.1 +repository_type: pipeline template: - org: nf-core - name: bactmap - description: A mapping-based pipeline for bacterial whole genome sequences author: Andries J. van Tonder - version: 2.0.0dev - force: true + description: A mapping-based pipeline for bacterial whole genome sequences + force: false + is_nfcore: true + name: bactmap + org: nf-core outdir: . skip_features: [] - is_nfcore: true + version: 2.0.0dev diff --git a/assets/email_template.html b/assets/email_template.html index 8387659b..3619691a 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,110 +1,53 @@ - - - - + + + + - - nf-core/bactmap Pipeline Report - - -
- + + nf-core/bactmap Pipeline Report + + +
-

nf-core/bactmap ${version}

-

Run Name: $runName

+ - <% if (!success){ out << """ -
-

nf-core/bactmap execution completed unsuccessfully!

+

nf-core/bactmap ${version}

+

Run Name: $runName

+ +<% if (!success){ + out << """ +
+

nf-core/bactmap execution completed unsuccessfully!

The exit status of the task that caused the workflow execution to fail was: $exitStatus.

The full error message was:

-
${errorReport}
-
- """ } else { out << """ -
+
${errorReport}
+
+ """ +} else { + out << """ +
nf-core/bactmap execution completed successfully! -
- """ } %> +
+ """ +} +%> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
-$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> " - - - - - " }.join("\n") %> - -
- $k - -
$v
-
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> "" }.join("\n") %> + +
$k
$v
-

nf-core/bactmap

-

https://github.com/nf-core/bactmap

-
- +

nf-core/bactmap

+

https://github.com/nf-core/bactmap

+ +
+ + diff --git a/assets/nf-core-bactmap_logo_light.png b/assets/nf-core-bactmap_logo_light.png index 47f376d82d8ea6f72a04c485049cb28464b9b5df..9fd8de13841288f24191c6f76e72c4a60cba2f84 100644 GIT binary patch delta 23702 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 diff --git a/docs/images/nf-core-bactmap_logo_dark.png b/docs/images/nf-core-bactmap_logo_dark.png index 9e7daef524cad4349f42c9732b1ece524dcfcaf6..4d3f130c9ccadc3378a784b66cff223f9be4253a 100644 GIT binary patch delta 27822 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 andcxSeLvzd27Go8VtCaQQLX3l;Qs(I{{o8u diff --git a/docs/images/nf-core-bactmap_logo_light.png b/docs/images/nf-core-bactmap_logo_light.png index f86b9a7e3719e5b9a515f1b76b914c1496b82f24..819530b03df9c3c42c6a2fa1e822f361dbdfc514 100644 GIT binary patch literal 24513 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 bDACjkf-Ad%&eWbM!` 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 b!S5dFi417Nm4!hAehAXnF-E=6a*q2itq#&l literal 24636 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%0DMIV_J~~>PX0oEV$~7vgshQ1?7AQVM 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 diff --git a/nextflow.config b/nextflow.config index d02a30c2..9831397d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -249,7 +249,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 6dc91e48..39a50c70 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-03-13T14:15:46+00:00", + "datePublished": "2025-04-30T12:25:50+00:00", "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#2ba10903-33af-4faa-9ee1-d7e45a8f2fc1" + "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f" } ], "name": "nf-core/bactmap" @@ -122,8 +122,13 @@ { "@id": "main.nf", "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], + "creator": [ + { + "@id": "#ajv37@shgb2monitor.vet.private.cam.ac.uk" + } + ], "dateCreated": "", - "dateModified": "2025-03-13T14:15:46Z", + "dateModified": "2025-04-30T12:25:50Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -160,11 +165,11 @@ "version": "!>=24.04.2" }, { - "@id": "#2ba10903-33af-4faa-9ee1-d7e45a8f2fc1", + "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f", "@type": "TestSuite", "instance": [ { - "@id": "#3f5008e2-1065-44ff-89de-ac416b610232" + "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b" } ], "mainEntity": { @@ -173,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#3f5008e2-1065-44ff-89de-ac416b610232", + "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/ci.yml", @@ -300,6 +305,12 @@ "@type": "Organization", "name": "nf-core", "url": "https://nf-co.re/" + }, + { + "@id": "#ajv37@shgb2monitor.vet.private.cam.ac.uk", + "@type": "Person", + "email": "ajv37@shgb2monitor.vet.private.cam.ac.uk", + "name": "Andries Van Tonder" } ] } From 6d080acf9fc53e6a9ea91258d4a6122c2024ceec Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 3 Jun 2025 11:01:27 +0000 Subject: [PATCH 2/3] Template update for nf-core/tools version 3.3.1 --- .editorconfig | 37 ----- .github/CONTRIBUTING.md | 2 +- .github/actions/get-shards/action.yml | 69 +++++++++ .github/actions/nf-test/action.yml | 113 ++++++++++++++ .github/workflows/awsfulltest.yml | 4 +- .github/workflows/awstest.yml | 2 +- .github/workflows/ci.yml | 88 ----------- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 20 +-- .../{fix-linting.yml => fix_linting.yml} | 4 +- .github/workflows/linting.yml | 15 +- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 142 ++++++++++++++++++ .github/workflows/release-announcements.yml | 2 +- ...mment.yml => template-version-comment.yml} | 2 +- .nf-core.yml | 2 +- .pre-commit-config.yaml | 26 +++- .prettierrc.yml | 5 + README.md | 7 +- conf/base.config | 5 +- nextflow.config | 17 ++- nf-test.config | 24 +++ ro-crate-metadata.json | 16 +- .../utils_nfcore_bactmap_pipeline/main.nf | 1 - tests/.nftignore | 10 ++ tests/default.nf.test | 35 +++++ tests/nextflow.config | 12 ++ 27 files changed, 487 insertions(+), 179 deletions(-) delete mode 100644 .editorconfig create mode 100644 .github/actions/get-shards/action.yml create mode 100644 .github/actions/nf-test/action.yml delete mode 100644 .github/workflows/ci.yml rename .github/workflows/{fix-linting.yml => fix_linting.yml} (96%) create mode 100644 .github/workflows/nf-test.yml rename .github/workflows/{template_version_comment.yml => template-version-comment.yml} (95%) create mode 100644 nf-test.config create mode 100644 tests/.nftignore create mode 100644 tests/default.nf.test create mode 100644 tests/nextflow.config diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74cc..00000000 --- a/.editorconfig +++ /dev/null @@ -1,37 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -[/subworkflows/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset - -[/assets/email*] -indent_size = unset - -# ignore python and markdown -[*.{py,md}] -indent_style = unset - -# ignore ro-crate metadata files -[**/ro-crate-metadata.json] -insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index eecca486..9ae86e78 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -78,7 +78,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. +8. If applicable, add a new test in the `tests` directory. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..34085279 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +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 + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + 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 \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --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" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 00000000..243e7823 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,113 @@ +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 + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +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@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - 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: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + conda-remove-defaults: true + + # 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 }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # 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/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 7547da8f..90140f5e 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: run-platform: name: Run AWS full tests # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered - if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' + if: github.repository == 'nf-core/bactmap' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' runs-on: ubuntu-latest steps: - name: Set revision variable @@ -40,7 +40,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 51d0ba90..c10dc2cb 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 953beb7b..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - workflow_dispatch: - -env: - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/bactmap') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.04.2" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - fetch-depth: 0 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f27..ac030fd5 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index ab06316e..999bcc38 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,14 +12,6 @@ on: required: true default: "dev" pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - - master - pull_request_target: branches: - main - master @@ -52,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: Setup Apptainer @@ -120,6 +112,7 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts + id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} @@ -132,3 +125,10 @@ jobs: else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 96% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index b43736ff..e6c0586d 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5a..f2d7d1dd 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,9 +3,6 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] @@ -17,9 +14,9 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit @@ -36,13 +33,13 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.1.0 + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -74,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 95b6b6af..7e8050fb 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 + uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..f03aea0c --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,142 @@ +name: Run nf-test +on: + push: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.2" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use self-hosted runners + - runs-on=$-nf-test-changes + - runner=4cpu-linux-x64 + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use self-hosted runners + - runs-on=$-nf-test + - runner=4cpu-linux-x64 + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "24.04.2" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: Run nf-test + uses: ./.github/actions/nf-test + env: + NFT_DIFF: ${{ env.NFT_DIFF }} + NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use self-hosted runners + - runs-on=$-confirm-pass + - runner=2cpu-linux-x64 + steps: + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" + + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + if: always() + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 76a9e67e..4abaf484 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@80dbe0a7697de18c15ad22f4619919ceb5ccf597 # v0.1.0 + - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 95% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529bc..beb5c77f 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -14,7 +14,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@v0.0.2 + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.nf-core.yml b/.nf-core.yml index cea52597..304e9155 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.2.1 +nf_core_version: 3.3.1 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec8650..9d0b248d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,24 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 - - - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.1.2" + - prettier@3.5.0 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 hooks: - - id: editorconfig-checker - alias: ec + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/README.md b/README.md index decae49f..a4f31d0f 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction @@ -28,7 +29,7 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/guidelines/graphic_design/workflow_diagrams#examples for examples. --> 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage diff --git a/conf/base.config b/conf/base.config index a037a4f4..139dcbbd 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -59,4 +59,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + } } diff --git a/nextflow.config b/nextflow.config index 9831397d..49c7c0b5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -160,16 +160,25 @@ profiles { ] } } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different Institutions -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load nf-core/bactmap custom profiles from different institutions. +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" + // Load nf-core/bactmap custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/bactmap.config" : "/dev/null" +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/bactmap.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -249,7 +258,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..889df760 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +config { + // location for all nf-test tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + + // run all test with defined profile(s) from the main nextflow.config + profile "test" + + // list of filenames or patterns that should be trigger a full test run + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 39a50c70..5668bec2 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-04-30T12:25:50+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-06-03T11:01:23+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f" + "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33" } ], "name": "nf-core/bactmap" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-04-30T12:25:50Z", + "dateModified": "2025-06-03T11:01:23Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -165,11 +165,11 @@ "version": "!>=24.04.2" }, { - "@id": "#a5c89635-4eb5-448f-8d64-97e8af04e96f", + "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33", "@type": "TestSuite", "instance": [ { - "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b" + "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c" } ], "mainEntity": { @@ -178,10 +178,10 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#59ab53b9-7a7b-4769-8ff5-e7eb2f15d71b", + "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", - "resource": "repos/nf-core/bactmap/actions/workflows/ci.yml", + "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 105a4e63..3aeb4206 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -261,4 +261,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..c10bc1f1 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,10 @@ +.DS_Store +multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +fastqc/*_fastqc.{html,zip} +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..8bb40337 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + assertAll( + { assert workflow.success}, + { assert snapshot( + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_bactmap_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..b42ec1ea --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,12 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params.modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' +params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From d57c2a799e65e08bdc3eff01c1cfce92fd195dd3 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 8 Jul 2025 11:38:24 +0000 Subject: [PATCH 3/3] Template update for nf-core/tools version 3.3.2 --- .github/actions/nf-test/action.yml | 4 - .github/workflows/linting.yml | 2 +- .github/workflows/linting_comment.yml | 2 +- .github/workflows/nf-test.yml | 45 +++---- .github/workflows/release-announcements.yml | 2 +- .nf-core.yml | 2 +- .pre-commit-config.yaml | 2 +- README.md | 6 +- assets/schema_input.json | 4 +- conf/base.config | 1 + modules.json | 4 +- modules/nf-core/fastqc/environment.yml | 2 + modules/nf-core/fastqc/main.nf | 2 +- modules/nf-core/fastqc/meta.yml | 23 ++-- modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 110 ++++++++++-------- .../nf-core/multiqc/tests/main.nf.test.snap | 18 +-- nextflow.config | 5 +- nf-test.config | 2 +- ro-crate-metadata.json | 16 +-- .../tests/nextflow.config | 2 +- tests/.nftignore | 1 + tests/nextflow.config | 6 +- 24 files changed, 146 insertions(+), 123 deletions(-) diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 243e7823..bf44d961 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -54,13 +54,9 @@ runs: conda-solver: libmamba conda-remove-defaults: true - # 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 \ diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index f2d7d1dd..8b0f88c3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: python-version: "3.13" diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 7e8050fb..d43797d9 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index f03aea0c..e7b58449 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -1,12 +1,5 @@ name: Run nf-test on: - push: - paths-ignore: - - "docs/**" - - "**/meta.yml" - - "**/*.md" - - "**/*.png" - - "**/*.svg" pull_request: paths-ignore: - "docs/**" @@ -35,7 +28,7 @@ jobs: nf-test-changes: name: nf-test-changes runs-on: # use self-hosted runners - - runs-on=$-nf-test-changes + - runs-on=${{ github.run_id }}-nf-test-changes - runner=4cpu-linux-x64 outputs: shard: ${{ steps.set-shards.outputs.shard }} @@ -69,7 +62,7 @@ jobs: needs: [nf-test-changes] if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} runs-on: # use self-hosted runners - - runs-on=$-nf-test + - runs-on=${{ github.run_id }}-nf-test - runner=4cpu-linux-x64 strategy: fail-fast: false @@ -85,7 +78,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.04.2" + - "24.10.5" - "latest-everything" env: NXF_ANSI_LOG: false @@ -97,23 +90,39 @@ jobs: fetch-depth: 0 - name: Run nf-test + id: run_nf_test uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + confirm-pass: needs: [nf-test] if: always() runs-on: # use self-hosted runners - - runs-on=$-confirm-pass + - runs-on=${{ github.run_id }}-confirm-pass - runner=2cpu-linux-x64 steps: - - name: One or more tests failed + - name: One or more tests failed (excluding latest-everything) if: ${{ contains(needs.*.result, 'failure') }} run: exit 1 @@ -132,11 +141,3 @@ jobs: echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" echo "::endgroup::" - - - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner - if: always() - run: | - ls -la ./ - rm -rf ./* || true - rm -rf ./.??* || true - ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 4abaf484..0f732495 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 + - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.nf-core.yml b/.nf-core.yml index 304e9155..3958ca07 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,5 @@ lint: {} -nf_core_version: 3.3.1 +nf_core_version: 3.3.2 repository_type: pipeline template: author: Andries J. van Tonder diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9d0b248d..bb41beec 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.5.0 + - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: diff --git a/README.md b/README.md index a4f31d0f..4e4334cc 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,12 @@ -[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml) +[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) diff --git a/assets/schema_input.json b/assets/schema_input.json index 3023bb46..6fecd108 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -17,14 +17,14 @@ "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, "fastq_2": { "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" } }, diff --git a/conf/base.config b/conf/base.config index 139dcbbd..4ea51b37 100644 --- a/conf/base.config +++ b/conf/base.config @@ -61,5 +61,6 @@ process { } withLabel: process_gpu { ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } } } diff --git a/modules.json b/modules.json index d910b83f..0fc67f90 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "08108058ea36a63f141c25c4e75f9f872a5b2296", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "f0719ae309075ae4a291533883847c3f7c441dad", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml index 691d4c76..f9f54ee9 100644 --- a/modules/nf-core/fastqc/environment.yml +++ b/modules/nf-core/fastqc/environment.yml @@ -1,3 +1,5 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 033f4154..23e16634 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -29,7 +29,7 @@ process FASTQC { // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB').toFloat() / task.cpus : null + def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 2b2e62b8..c8d9d025 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -29,9 +29,10 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. + ontologies: [] output: - - html: - - meta: + html: + - - meta: type: map description: | Groovy Map containing sample information @@ -40,8 +41,9 @@ output: type: file description: FastQC report pattern: "*_{fastqc.html}" - - zip: - - meta: + ontologies: [] + zip: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,11 +52,14 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index a27122ce..812fc4c5 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.27 + - bioconda::multiqc=1.29 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 58d9313c..0ac3c369 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : - 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : + 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c1879..ce30eb73 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7b7c1322..88e90571 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:29:57.631982377" + "timestamp": "2025-05-22T11:50:41.182332996" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:34.743726958" + "timestamp": "2025-05-22T11:51:22.448739369" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:21.44383553" + "timestamp": "2025-05-22T11:51:06.198928424" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 49c7c0b5..a6fee8e8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -235,7 +235,6 @@ dag { manifest { name = 'nf-core/bactmap' - author = """Andries J. van Tonder""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -251,14 +250,14 @@ manifest { description = """A mapping-based pipeline for bacterial whole genome sequences""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.04.2' + nextflowVersion = '!>=24.10.5' version = '2.0.0dev' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config index 889df760..3a1fff59 100644 --- a/nf-test.config +++ b/nf-test.config @@ -9,7 +9,7 @@ config { configFile "tests/nextflow.config" // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' // run all test with defined profile(s) from the main nextflow.config profile "test" diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 5668bec2..30dfe891 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-06-03T11:01:23+00:00", - "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-07-08T11:38:19+00:00", + "description": "

\n \n \n \"nf-core/bactmap\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/bactmap/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/bactmap/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/bactmap/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/bactmap)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23bactmap-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/bactmap)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/bactmap** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/bactmap \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/bactmap/usage) and the [parameter documentation](https://nf-co.re/bactmap/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/bactmap/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/bactmap/output).\n\n## Credits\n\nnf-core/bactmap was originally written by Andries J. van Tonder.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#bactmap` channel](https://nfcore.slack.com/channels/bactmap) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33" + "@id": "#3e097423-0ff9-4730-9d8d-aa366d021c38" } ], "name": "nf-core/bactmap" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-06-03T11:01:23Z", + "dateModified": "2025-07-08T11:38:19Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -162,14 +162,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=24.10.5" }, { - "@id": "#608f327c-9110-49dd-9976-f8e1a48a7d33", + "@id": "#3e097423-0ff9-4730-9d8d-aa366d021c38", "@type": "TestSuite", "instance": [ { - "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c" + "@id": "#f7e01228-e890-4c53-ad20-3d01691d92e9" } ], "mainEntity": { @@ -178,7 +178,7 @@ "name": "Test suite for nf-core/bactmap" }, { - "@id": "#bbd42029-a57c-4aae-9989-91f4e2574e0c", + "@id": "#f7e01228-e890-4c53-ad20-3d01691d92e9", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/bactmap", "resource": "repos/nf-core/bactmap/actions/workflows/nf-test.yml", diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58..09ef842a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.4.2" } validation { diff --git a/tests/.nftignore b/tests/.nftignore index c10bc1f1..158c83c5 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,5 +1,6 @@ .DS_Store multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/BETA-multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt diff --git a/tests/nextflow.config b/tests/nextflow.config index b42ec1ea..fbaf64d9 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -6,7 +6,9 @@ // TODO nf-core: Specify any additional parameters here // Or any resources requirements -params.modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' -params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/bactmap' +} aws.client.anonymous = true // fixes S3 access issues on self-hosted runners