diff --git a/modules/nf-core/bclconvert/Dockerfile b/modules/nf-core/bclconvert/Dockerfile index eda841681f49..c5594cf2f09b 100644 --- a/modules/nf-core/bclconvert/Dockerfile +++ b/modules/nf-core/bclconvert/Dockerfile @@ -2,6 +2,24 @@ # Dockerfile to create container with bcl-convert # Push to nfcore/bclconvert: +# Build stage: unpack the RPM file +FROM debian:bullseye-slim AS build +ARG BCLCONVERT_VERSION="4.4.6" + +# Install tools needed to extract RPM +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + rpm2cpio \ + cpio \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Extract bcl-convert from RPM +COPY bcl-convert-4.4.6-2.el8.x86_64.rpm bcl-convert.rpm +RUN rpm2cpio bcl-convert.rpm | cpio -idmv \ + && rm bcl-convert.rpm + +# Final stage: minimal image with only necessary components FROM debian:bullseye-slim ARG BCLCONVERT_VERSION="4.4.6" LABEL org.opencontainers.image.description="Docker image containing bcl-convert" @@ -12,20 +30,16 @@ LABEL org.opencontainers.image.vendor="nf-core" LABEL org.opencontainers.image.license="https://github.com/nf-core/modules/blob/master/modules/nf-core/bclconvert/LICENSE" # Disclaimer: this container is not provided nor supported by Illumina -# 'ps' command is need by some nextflow executions to collect system stats -# Install procps and clean apt cache +# Install procps (for 'ps' command needed by Nextflow) and rclone (for parallel file transfers) RUN apt-get update \ && apt-get install -y --no-install-recommends \ procps \ - rpm2cpio \ - cpio \ + rclone \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* + # Link hostname cmd to fix hardcoded path RUN ln -s /bin/hostname /usr/bin/hostname -# Install bcl-convert -COPY bcl-convert-4.4.6-2.el8.x86_64.rpm bcl-convert.rpm -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN rpm2cpio bcl-convert.rpm | cpio -idmv \ - && rm bcl-convert.rpm -RUN rm -rf /var/log/bcl-convert && ln -sfT /tmp /var/log/bcl-convert + +# Copy bcl-convert executable from build stage +COPY --from=build /usr/bin/bcl-convert /usr/bin/bcl-convert diff --git a/modules/nf-core/bclconvert/main.nf b/modules/nf-core/bclconvert/main.nf index 82ad6b1992e8..c7842e66e615 100644 --- a/modules/nf-core/bclconvert/main.nf +++ b/modules/nf-core/bclconvert/main.nf @@ -2,7 +2,7 @@ process BCLCONVERT { tag {"$meta.lane" ? "$meta.id"+"."+"$meta.lane" : "$meta.id" } label 'process_high' - container "nf-core/bclconvert:4.4.6" + container "nf-core/bclconvert:4.4.6_1" input: tuple val(meta), path(samplesheet), path(run_dir) @@ -12,10 +12,10 @@ process BCLCONVERT { tuple val(meta), path("output/**_S[1-9]*_I?_00?.fastq.gz") , emit: fastq_idx , optional:true tuple val(meta), path("output/**Undetermined_S0*_R?_00?.fastq.gz"), emit: undetermined , optional:true tuple val(meta), path("output/**Undetermined_S0*_I?_00?.fastq.gz"), emit: undetermined_idx, optional:true - tuple val(meta), path("output/Reports") , emit: reports - tuple val(meta), path("output/Logs") , emit: logs - tuple val(meta), path("output/InterOp/*.bin") , emit: interop , optional:true - path("versions.yml") , emit: versions + tuple val(meta), path("output/Reports/*") , emit: reports + tuple val(meta), path("output/Logs/*") , emit: logs + tuple val(meta), path("output/InterOp/*.bin") , emit: interop + tuple val("${task.process}"), val('bclconvert'), eval("bcl-convert -V 2>&1 | head -n 1 | sed 's/^.*Version //'"), topic: versions, emit: versions_bclconvert when: task.ext.when == null || task.ext.when @@ -65,11 +65,6 @@ process BCLCONVERT { # copy the InterOp folder contents to ensure it gets picked up when using fusion mkdir -p output/InterOp/ cp -n **/InterOp/*.bin output/InterOp/ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bclconvert: \$(bcl-convert -V 2>&1 | head -n 1 | sed 's/^.*Version //') - END_VERSIONS """ stub: @@ -102,10 +97,6 @@ process BCLCONVERT { touch output/InterOp/IndexMetricsOut.bin touch output/InterOp/QMetricsOut.bin touch output/InterOp/TileMetricsOut.bin - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bclconvert: \$(bcl-convert -V 2>&1 | head -n 1 | sed 's/^.*Version //') - END_VERSIONS """ } diff --git a/modules/nf-core/bclconvert/meta.yml b/modules/nf-core/bclconvert/meta.yml index e1cd3e0131e4..925dd71d3b57 100644 --- a/modules/nf-core/bclconvert/meta.yml +++ b/modules/nf-core/bclconvert/meta.yml @@ -99,13 +99,18 @@ output: description: Interop files pattern: "*.{bin}" ontologies: [] +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bclconvert: + type: string + description: The tool name + - "bcl-convert -V 2>&1 | head -n 1 | sed 's/^.*Version //'": + type: string + description: The command used to generate the version of the tool + authors: - "@matthdsm" maintainers: diff --git a/modules/nf-core/bclconvert/tests/main.nf.test b/modules/nf-core/bclconvert/tests/main.nf.test index b2971c020732..13b27167d557 100644 --- a/modules/nf-core/bclconvert/tests/main.nf.test +++ b/modules/nf-core/bclconvert/tests/main.nf.test @@ -34,12 +34,11 @@ nextflow_process { process.out.undetermined.collect { meta, fastq -> file(fastq).name }, process.out.undetermined_idx, process.out.reports, - process.out.logs.collect { meta, logs -> file(logs).list().sort() }, + process.out.logs.collect { meta, logs -> logs.sort() }, process.out.interop.collect { meta, interop -> interop.findAll { interopfile -> file(interopfile).name != "IndexMetricsOut.bin" } }, - process.out.versions, - path(process.out.versions[0]).yaml + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } @@ -76,13 +75,12 @@ nextflow_process { process.out.undetermined.collect { meta, fastq -> file(fastq).name }, process.out.undetermined_idx, process.out.reports, - process.out.logs.collect { meta, logs -> file(logs).list().sort() }, + process.out.logs.collect { meta, logs -> logs.sort() }, process.out.interop, process.out.interop.collect { meta, interop -> interop.findAll { interopfile -> file(interopfile).name != "IndexMetricsOut.bin" } }, - process.out.versions, - path(process.out.versions[0]).yaml + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } diff --git a/modules/nf-core/bclconvert/tests/main.nf.test.snap b/modules/nf-core/bclconvert/tests/main.nf.test.snap index b7838a5eec2c..c872fc3baab7 100644 --- a/modules/nf-core/bclconvert/tests/main.nf.test.snap +++ b/modules/nf-core/bclconvert/tests/main.nf.test.snap @@ -42,10 +42,10 @@ ], [ [ - "Errors.log", - "FastqComplete.txt", - "Info.log", - "Warnings.log" + "Errors.log:md5,d41d8cd98f00b204e9800998ecf8427e", + "FastqComplete.txt:md5,081aedbb6928d0f348031f9ca49ac468", + "Info.log:md5,bec9273b64edca95b3b53c929dd8fdfc", + "Warnings.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], [ @@ -92,20 +92,21 @@ "TileMetricsOut.bin:md5,21388348d81fa9be326d30ef6d348464" ] ], - [ - "versions.yml:md5,a7ddd79ad04a69cb254185a11296f1b6" - ], { - "BCLCONVERT": { - "bclconvert": "4.4.6" - } + "versions_bclconvert": [ + [ + "BCLCONVERT", + "bclconvert", + "4.4.6" + ] + ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.7" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-23T10:12:42.943671245" + "timestamp": "2025-12-02T14:58:16.031029" }, "homo_sapiens illumina [bcl] - stub": { "content": [ @@ -188,7 +189,11 @@ ] ], "7": [ - "versions.yml:md5,a7ddd79ad04a69cb254185a11296f1b6" + [ + "BCLCONVERT", + "bclconvert", + "4.4.6" + ] ], "fastq": [ [ @@ -267,16 +272,20 @@ "undetermined_idx": [ ], - "versions": [ - "versions.yml:md5,a7ddd79ad04a69cb254185a11296f1b6" + "versions_bclconvert": [ + [ + "BCLCONVERT", + "bclconvert", + "4.4.6" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.7" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-23T10:12:55.362214653" + "timestamp": "2025-12-02T14:30:30.75002" }, "homo_sapiens illumina [bcl]": { "content": [ @@ -323,10 +332,10 @@ ], [ [ - "Errors.log", - "FastqComplete.txt", - "Info.log", - "Warnings.log" + "Errors.log:md5,d41d8cd98f00b204e9800998ecf8427e", + "FastqComplete.txt:md5,388544f10d63d386a8d20865abf22557", + "Info.log:md5,2f3fa352080124ed5ee62afbdbc999d4", + "Warnings.log:md5,a7ec94ec82336a0e81409fe13b922f4a" ] ], [ @@ -339,19 +348,20 @@ "TileMetricsOut.bin:md5,83891751ec1c91a425a524b476b6ca3c" ] ], - [ - "versions.yml:md5,a7ddd79ad04a69cb254185a11296f1b6" - ], { - "BCLCONVERT": { - "bclconvert": "4.4.6" - } + "versions_bclconvert": [ + [ + "BCLCONVERT", + "bclconvert", + "4.4.6" + ] + ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.7" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-23T10:12:18.369689549" + "timestamp": "2025-12-02T14:57:47.218447" } } \ No newline at end of file diff --git a/subworkflows/nf-core/bcl_demultiplex/main.nf b/subworkflows/nf-core/bcl_demultiplex/main.nf index bfe1ae8325cd..e5302e8eb59a 100644 --- a/subworkflows/nf-core/bcl_demultiplex/main.nf +++ b/subworkflows/nf-core/bcl_demultiplex/main.nf @@ -51,7 +51,6 @@ workflow BCL_DEMULTIPLEX { ch_interop = ch_interop.mix(BCLCONVERT.out.interop) ch_reports = ch_reports.mix(BCLCONVERT.out.reports) ch_logs = ch_logs.mix(BCLCONVERT.out.logs) - ch_versions = ch_versions.mix(BCLCONVERT.out.versions.first()) } // MODULE: bcl2fastq diff --git a/subworkflows/nf-core/bcl_demultiplex/tests/main.nf.test.snap b/subworkflows/nf-core/bcl_demultiplex/tests/main.nf.test.snap index 537c7efea96a..942b6615bf66 100644 --- a/subworkflows/nf-core/bcl_demultiplex/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bcl_demultiplex/tests/main.nf.test.snap @@ -130,7 +130,12 @@ "id": "HMTFYDRXX", "lane": 1 }, - "Logs" + [ + "Errors.log", + "FastqComplete.txt", + "Info.log", + "Warnings.log" + ] ] ], "reports": [ @@ -160,15 +165,15 @@ ], "versions": [ - "versions.yml:md5,b1427a2b3abad63b04f1dd62c8f40e2e" + ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-11-04T16:13:41.469897018" + "timestamp": "2025-12-02T14:30:56.578335" }, "bcl2fastq": { "content": [