diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..832cdc4 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,207 @@ +name: Run Linting +on: + pull_request: + branches: [main, develop, release/*] + # workflow_dispatch: + # inputs: + # runners: + # description: "Runners to test on" + # type: choice + # options: + # - "ubuntu-latest" + # - "self-hosted" + # default: "self-hosted" + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + # renovate: datasource=github-releases depName=nextflow/nextflow versioning=semver + NXF_VER: "25.10.2" + NXF_SYNTAX_PARSER: "v2" + +jobs: + # pre-commit: + # runs-on: ${{ github.event.inputs.runners || github.run_number > 1 && 'ubuntu-latest' || 'self-hosted' }} + # steps: + # - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + # - uses: nf-core/setup-nextflow@v2 + # - name: Run prek + # uses: j178/prek-action@53276d8b0d10f8b6672aa85b4588c6921d0370cc # v2.0.1 + # with: + # extra_args: "" + + ################### + # nf-core linting # + ################### + # TODO Move these to pre-commit + # https://github.com/nf-core/tools/pull/3141 + nf-core-changes: + name: nf-core-changes + runs-on: + - runs-on=${{ github.run_id }}-nf-core-changes + - runner=4cpu-linux-x64 + - image=ubuntu22-full-x64 + outputs: + # https://github.com/dorny/paths-filter?tab=readme-ov-file#custom-processing-of-changed-files + modules: ${{ steps.filter.outputs.modules }} + modules_files: ${{ steps.module_names.outputs.result }} + subworkflows: ${{ steps.filter.outputs.subworkflows }} + subworkflows_files: ${{ steps.subworkflow_names.outputs.result }} + steps: + - name: Clean workspace + run: | + sudo rm -rf ./* || true + sudo rm -rf ./.* || true + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 2 # To retrieve the preceding commit. + + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4 + id: filter + with: + filters: | + modules: + - added|modified: 'modules/nf-core/**' + subworkflows: + - added|modified: 'subworkflows/nf-core/**' + token: "" + list-files: "json" + + - name: Get module name + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + id: module_names + with: + script: | + return [...new Set(${{ steps.filter.outputs.modules_files }} + .filter(x => x.endsWith('main.nf') || x.endsWith('.nf.test.snap')) + .map(path => path + .replace('modules/nf-core/', '') + .replace(/\/(main\.nf|tests\/.*)$/, '') + ) + )]; + - name: Get subworkflow name + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + id: subworkflow_names + with: + script: | + return [...new Set(${{ steps.filter.outputs.subworkflows_files }} + .filter(x => x.endsWith('main.nf') || x.endsWith('.nf.test.snap')) + .map(path => path + .replace('subworkflows/nf-core/', '') + .replace(/\/(main\.nf|tests\/.*)$/, '') + ) + )]; + + - name: debug + run: | + echo ${{ steps.filter.outputs.modules_files }} + echo ${{ steps.module_names.outputs.result }} + echo ${{ steps.filter.outputs.subworkflows_files }} + echo ${{ steps.subworkflow_names.outputs.result }} + + nf-core-lint-modules: + runs-on: + - runs-on=${{ github.run_id }}-nf-core-lint-modules + - runner=4cpu-linux-x64 + - image=ubuntu22-full-x64 + name: nf-core lint modules + needs: nf-core-changes + if: ${{ needs.nf-core-changes.outputs.modules_files != '[]' }} + strategy: + fail-fast: false + matrix: + module: ${{ fromJson(needs.nf-core-changes.outputs.modules_files || '[]') }} + steps: + - name: Clean workspace + run: | + sudo rm -rf ./* || true + sudo rm -rf ./.* || true + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + id: cache-pip + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip + restore-keys: | + ${{ runner.os }}-pip + + - name: Install pip + run: python -m pip install --upgrade pip + + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5 + with: + distribution: "temurin" + java-version: "17" + + - name: Set up Nextflow + uses: nf-core/setup-nextflow@v2 + + - name: Install nf-core tools development version + run: python -m pip install --upgrade --force-reinstall git+https://github.com/nf-core/tools.git@dev + + - name: Lint module ${{ matrix.module }} + run: nf-core modules lint ${{ matrix.module }} + + nf-core-lint-subworkflows: + runs-on: + - runs-on=${{ github.run_id }}-nf-core-lint-subworkflows + - runner=4cpu-linux-x64 + - image=ubuntu22-full-x64 + name: nf-core lint subworkflows + needs: nf-core-changes + if: ${{ needs.nf-core-changes.outputs.subworkflows_files != '[]' }} + strategy: + fail-fast: false + matrix: + subworkflow: ${{ fromJson(needs.nf-core-changes.outputs.subworkflows_files || '[]') }} + steps: + - name: Clean workspace + run: | + sudo rm -rf ./* || true + sudo rm -rf ./.* || true + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.14" + + - name: Set up Nextflow + uses: nf-core/setup-nextflow@v2 + + - name: Install nf-core tools development version + run: python -m pip install --upgrade --force-reinstall git+https://github.com/nf-core/tools.git@dev + + - name: Lint subworkflow ${{ matrix.subworkflow }} + run: nf-core subworkflows lint ${{ matrix.subworkflow }} + + confirm-pass-lint: + runs-on: + - runs-on=${{ github.run_id }}-confirm-pass-lint + - runner=2cpu-linux-x64 + - image=ubuntu22-full-x64 + needs: [nf-core-lint-modules, nf-core-lint-subworkflows] + if: always() + steps: + - name: All tests ok + if: ${{ success() || !contains(needs.*.result, 'failure') }} + run: exit 0 + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: debug-print + if: always() + run: | + echo "toJSON(needs) = ${{ toJSON(needs) }}" + echo "toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}"