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 77396058..12d8d6fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ # This file is part of REANA. -# Copyright (C) 2020, 2022 CERN. +# Copyright (C) 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. @@ -9,6 +9,32 @@ name: CI on: [push, pull_request] jobs: + 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: @@ -18,7 +44,7 @@ jobs: - name: Runs shell script static analysis run: | sudo apt-get install shellcheck - ./run-tests.sh --check-shellscript + ./run-tests.sh --check-shellcheck lint-black: runs-on: ubuntu-20.04 diff --git a/run-tests.sh b/run-tests.sh index 1612b09f..2a16822f 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,15 +1,12 @@ -#!/bin/bash +#!/usr/bin/env bash # # This file is part of REANA. -# Copyright (C) 2017, 2018, 2019, 2020, 2021, 2022, 2023 CERN. +# Copyright (C) 2017, 2018, 2019, 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. -# Quit on errors set -o errexit - -# Quit on unbound symbols set -o nounset export REANA_SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://postgres:mysecretpassword@localhost/postgres @@ -52,8 +49,26 @@ stop_db_container () { docker stop postgres__reana-workflow-controller } -check_script () { - shellcheck run-tests.sh +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_shellcheck () { + find . -name "*.sh" -exec shellcheck {} \; } check_pydocstyle () { @@ -99,7 +114,8 @@ check_docker_build () { } check_all () { - check_script + check_commitlint + check_shellcheck check_pydocstyle check_black check_flake8 @@ -116,19 +132,18 @@ if [ $# -eq 0 ]; then exit 0 fi -for arg in "$@" -do - case $arg in - --check-shellscript) check_script;; - --check-pydocstyle) check_pydocstyle;; - --check-black) check_black;; - --check-flake8) check_flake8;; - --check-openapi-spec) check_openapi_spec;; - --check-manifest) check_manifest;; - --check-sphinx) check_sphinx;; - --check-pytest) check_pytest;; - --check-dockerfile) check_dockerfile;; - --check-docker-build) check_docker_build;; - *) - esac -done +arg="$1" +case $arg in + --check-commitlint) check_commitlint "$@";; + --check-shellcheck) check_shellcheck;; + --check-pydocstyle) check_pydocstyle;; + --check-black) check_black;; + --check-flake8) check_flake8;; + --check-openapi-spec) check_openapi_spec;; + --check-manifest) check_manifest;; + --check-sphinx) check_sphinx;; + --check-pytest) check_pytest;; + --check-dockerfile) check_dockerfile;; + --check-docker-build) check_docker_build;; + *) echo "[ERROR] Invalid argument '$arg'. Exiting." && exit 1;; +esac