From 2de7d61db96693e8ee9c3ac555aef9dbfd7bb4bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tibor=20=C5=A0imko?= Date: Wed, 10 Jan 2024 16:53:01 +0100 Subject: [PATCH 1/2] ci(commitlint): addition of commit message linter (#695) Adds commitlint to check the commit message style against agreed conventional commits configuration. Changes script argument values to always use linter names (e.g. shellcheck). Changes argument handling to allow only one checking action that can now accept further optional arguments. --- .commitlintrc.yaml | 21 ++ .github/workflows/ci.yml | 444 +++++++++++++++++++++------------------ run-tests.sh | 60 ++++-- 3 files changed, 293 insertions(+), 232 deletions(-) create mode 100644 .commitlintrc.yaml diff --git a/.commitlintrc.yaml b/.commitlintrc.yaml new file mode 100644 index 00000000..d0b32786 --- /dev/null +++ b/.commitlintrc.yaml @@ -0,0 +1,21 @@ +rules: + body-case: [2, always, sentence-case] + body-full-stop: [2, always] + body-leading-blank: [2, always] + body-max-line-length: [2, always, 72] + footer-leading-blank: [2, always] + footer-max-line-length: [2, always, 72] + header-max-length: [2, always, 72] + scope-case: [2, always, lower-case] + subject-case: + - 2 + - never + - [pascal-case, sentence-case, start-case, upper-case] + subject-empty: [2, never] + subject-full-stop: [2, never, "."] + type-case: [2, always, lower-case] + type-empty: [2, never] + type-enum: + - 2 + - always + - [build, chore, ci, docs, feat, fix, perf, refactor, style, test] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b36a5da..bd072f36 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ # This file is part of REANA. -# Copyright (C) 2020, 2021, 2022, 2023 CERN. +# Copyright (C) 2020, 2021, 2022, 2023, 2024 CERN. # # REANA is free software; you can redistribute it and/or modify it # under the terms of the MIT License; see LICENSE file for more details. @@ -9,211 +9,237 @@ name: CI on: [push, pull_request] jobs: - lint-shellcheck: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Runs shell script static analysis - run: | - sudo apt-get install shellcheck - ./run-tests.sh --check-shellscript - - lint-black: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: pip install black - - - name: Check Python code formatting - run: ./run-tests.sh --check-black - - lint-flake8: - runs-on: ubuntu-20.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Check compliance with pep8, pyflakes and circular complexity - run: | - pip install --upgrade pip - pip install flake8 - ./run-tests.sh --check-flake8 - - lint-pydocstyle: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: pip install pydocstyle - - - name: Check compliance with Python docstring conventions - run: ./run-tests.sh --check-pydocstyle - - lint-check-manifest: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: pip install check-manifest - - - name: Check Python manifest completeness - run: ./run-tests.sh --check-manifest - - docs-cli-commands: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - pip install --upgrade pip setuptools py - pip install -e .[all] - - - name: Verify reana client commands list - run: ./run-tests.sh --check-cli-cmds - - docs-cli-api: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - pip install --upgrade pip setuptools py - pip install -e .[all] - - - name: Verify reana client api docs - run: ./run-tests.sh --check-cli-api - - docs-sphinx: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - pip install --upgrade pip setuptools py - pip install -e .[all] - - - name: Run Sphinx documentation with doctests - run: ./run-tests.sh --check-sphinx - - python-tests: - runs-on: ubuntu-20.04 - strategy: - matrix: - include: - - testenv: lowest - python: '3.6' - - - testenv: release - python: '3.6' - - - testenv: lowest - python: '3.7' - - - testenv: release - python: '3.7' - - - testenv: lowest - python: '3.8' - - - testenv: release - python: '3.8' - - - testenv: lowest - python: '3.9' - - - testenv: release - python: '3.9' - - - testenv: lowest - python: '3.10' - - - testenv: release - python: '3.10' - - - testenv: lowest - python: '3.11' - - - testenv: release - python: '3.11' - - - testenv: lowest - python: '3.12' - - - testenv: release - python: '3.12' - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python }} - - - name: Setup requirements builder - run: | - pip install --upgrade pip setuptools py - pip install wheel - pip install requirements-builder - if [[ ${{ matrix.testenv }} == lowest ]]; then - requirements-builder -e all --level=min --req requirements-dev.txt setup.py > .lowest-requirements.txt - fi - if [[ ${{ matrix.testenv }} == release ]]; then - requirements-builder -e all --level=pypi --req requirements-dev.txt setup.py > .release-requirements.txt - fi - - - name: Install Python dependencies - run: | - pip install -r .${{ matrix.testenv }}-requirements.txt - - - name: Run pytest - run: ./run-tests.sh --check-pytest - - - name: Codecov Coverage - if: matrix.python == '3.8' - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: coverage.xml + lint-commitlint: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v4 + + - name: Install commitlint + run: | + npm install conventional-changelog-conventionalcommits + npm install commitlint@latest + + - name: Check commit message compliance of the recently pushed commit + if: github.event_name == 'push' + run: | + ./run-tests.sh --check-commitlint HEAD~1 HEAD + + - name: Check commit message compliance of the pull request + if: github.event_name == 'pull_request' + run: | + ./run-tests.sh --check-commitlint ${{ github.event.pull_request.head.sha }}~${{ github.event.pull_request.commits }} ${{ github.event.pull_request.head.sha }} + + lint-shellcheck: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Runs shell script static analysis + run: | + sudo apt-get install shellcheck + ./run-tests.sh --check-shellcheck + + lint-black: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: pip install black + + - name: Check Python code formatting + run: ./run-tests.sh --check-black + + lint-flake8: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Check compliance with pep8, pyflakes and circular complexity + run: | + pip install --upgrade pip + pip install flake8 + ./run-tests.sh --check-flake8 + + lint-pydocstyle: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: pip install pydocstyle + + - name: Check compliance with Python docstring conventions + run: ./run-tests.sh --check-pydocstyle + + lint-check-manifest: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: pip install check-manifest + + - name: Check Python manifest completeness + run: ./run-tests.sh --check-manifest + + docs-cli-commands: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: | + pip install --upgrade pip setuptools py + pip install -e .[all] + + - name: Verify reana client commands list + run: ./run-tests.sh --check-cli-cmds + + docs-cli-api: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: | + pip install --upgrade pip setuptools py + pip install -e .[all] + + - name: Verify reana client api docs + run: ./run-tests.sh --check-cli-api + + docs-sphinx: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.8' + + - name: Install Python dependencies + run: | + pip install --upgrade pip setuptools py + pip install -e .[all] + + - name: Run Sphinx documentation with doctests + run: ./run-tests.sh --check-sphinx + + python-tests: + runs-on: ubuntu-20.04 + strategy: + matrix: + include: + - testenv: lowest + python: '3.6' + + - testenv: release + python: '3.6' + + - testenv: lowest + python: '3.7' + + - testenv: release + python: '3.7' + + - testenv: lowest + python: '3.8' + + - testenv: release + python: '3.8' + + - testenv: lowest + python: '3.9' + + - testenv: release + python: '3.9' + + - testenv: lowest + python: '3.10' + + - testenv: release + python: '3.10' + + - testenv: lowest + python: '3.11' + + - testenv: release + python: '3.11' + + - testenv: lowest + python: '3.12' + + - testenv: release + python: '3.12' + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python }} + + - name: Setup requirements builder + run: | + pip install --upgrade pip setuptools py + pip install wheel + pip install requirements-builder + if [[ ${{ matrix.testenv }} == lowest ]]; then + requirements-builder -e all --level=min --req requirements-dev.txt setup.py > .lowest-requirements.txt + fi + if [[ ${{ matrix.testenv }} == release ]]; then + requirements-builder -e all --level=pypi --req requirements-dev.txt setup.py > .release-requirements.txt + fi + + - name: Install Python dependencies + run: | + pip install -r .${{ matrix.testenv }}-requirements.txt + + - name: Run pytest + run: ./run-tests.sh --check-pytest + + - name: Codecov Coverage + if: matrix.python == '3.8' + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: coverage.xml diff --git a/run-tests.sh b/run-tests.sh index 22c82b03..b6ec165b 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,20 +1,34 @@ -#!/bin/bash +#!/usr/bin/env bash # # This file is part of REANA. -# Copyright (C) 2017, 2018, 2019, 2020, 2022 CERN. +# Copyright (C) 2017, 2018, 2019, 2020, 2022, 2024 CERN. # # REANA is free software; you can redistribute it and/or modify it # under the terms of the MIT License; see LICENSE file for more details. -# Quit on errors set -o errexit - -# Quit on unbound symbols set -o nounset +check_commitlint () { + from=${2:-master} + to=${3:-HEAD} + npx commitlint --from="$from" --to="$to" + found=0 + while IFS= read -r line; do + if echo "$line" | grep -qP "\(\#[0-9]+\)$"; then + true + else + echo "✖ PR number missing in $line" + found=1 + fi + done < <(git log "$from..$to" --format="%s") + if [ $found -gt 0 ]; then + exit 1 + fi +} -check_script () { - shellcheck run-tests.sh +check_shellcheck () { + find . -name "*.sh" -exec shellcheck {} \; } check_black () { @@ -57,7 +71,8 @@ check_pytest () { } check_all() { - check_script + check_commitlint + check_shellcheck check_black check_flake8 check_pydocstyle @@ -73,18 +88,17 @@ if [ $# -eq 0 ]; then exit 0 fi -for arg in "$@" -do - case $arg in - --check-shellscript) check_script;; - --check-black) check_black;; - --check-flake8) check_flake8;; - --check-pydocstyle) check_pydocstyle;; - --check-manifest) check_manifest;; - --check-cli-cmds) check_cli_cmds;; - --check-cli-api) check_cli_api;; - --check-sphinx) check_sphinx;; - --check-pytest) check_pytest;; - *) - esac -done +arg="$1" +case $arg in + --check-commitlint) check_commitlint "$@";; + --check-shellcheck) check_shellcheck;; + --check-black) check_black;; + --check-flake8) check_flake8;; + --check-pydocstyle) check_pydocstyle;; + --check-manifest) check_manifest;; + --check-cli-cmds) check_cli_cmds;; + --check-cli-api) check_cli_api;; + --check-sphinx) check_sphinx;; + --check-pytest) check_pytest;; + *) echo "[ERROR] Invalid argument '$arg'. Exiting." && exit 1;; +esac From 5b278f131b59d3ecfd3c7f129040a126cd01b60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tibor=20=C5=A0imko?= Date: Wed, 10 Jan 2024 16:54:45 +0100 Subject: [PATCH 2/2] ci(release-please): initial configuration (#695) --- .github/workflows/release-please.yml | 20 ++++++++++++++++++++ .release-please-config.json | 24 ++++++++++++++++++++++++ .release-please-manifest.json | 3 +++ CHANGELOG.md | 0 LICENSE | 2 +- MANIFEST.in | 8 +++++--- 6 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/release-please.yml create mode 100644 .release-please-config.json create mode 100644 .release-please-manifest.json create mode 100644 CHANGELOG.md diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..253a7a6d --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,20 @@ +on: + push: + branches: + - maint-0.9 + - master + +permissions: + contents: write + pull-requests: write + +name: release-please + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v4 + with: + config-file: .release-please-config.json + target-branch: ${{ github.ref_name }} diff --git a/.release-please-config.json b/.release-please-config.json new file mode 100644 index 00000000..a418abc3 --- /dev/null +++ b/.release-please-config.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "include-v-in-tag": false, + "packages": { + ".": { + "changelog-sections": [ + { "type": "build", "section": "Build", "hidden": false }, + { "type": "feat", "section": "Features", "hidden": false }, + { "type": "fix", "section": "Bug fixes", "hidden": false }, + { "type": "perf", "section": "Performance improvements", "hidden": false }, + { "type": "refactor", "section": "Code refactoring", "hidden": false }, + { "type": "style", "section": "Code style", "hidden": false }, + { "type": "test", "section": "Test suite", "hidden": false }, + { "type": "ci", "section": "Continuous integration", "hidden": false }, + { "type": "docs", "section": "Documentation", "hidden": false }, + { "type": "chore", "section": "Chores", "hidden": true } + ], + "versioning": "always-bump-patch" + } + }, + "pull-request-footer": " ", + "pull-request-header": " ", + "release-type": "python" +} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..7e08ec6a --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.9.2" +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE b/LICENSE index 750cb266..f74676a6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2023 CERN. +Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 CERN. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/MANIFEST.in b/MANIFEST.in index 51862220..7c933526 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,9 +1,11 @@ # This file is part of REANA. -# Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022 CERN. +# Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2024 CERN. # # REANA is free software; you can redistribute it and/or modify it # under the terms of the MIT License; see LICENSE file for more details. +include *.json +include *.md include *.rst include *.sh include *.txt @@ -11,10 +13,10 @@ include *.yaml include *.yml include .flake8 include LICENSE -include docs/cmd_list.txt -include docs/requirements.txt include pytest.ini include tox.ini +include docs/cmd_list.txt +include docs/requirements.txt exclude .readthedocs.yaml prune docs/_build recursive-include docs *.png