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 c388c73f..6234a2e0 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: Run shell script static analysis run: | sudo apt-get install shellcheck - ./run-tests.sh --check-shellscript + ./run-tests.sh --check-shellcheck docs-sphinx: runs-on: ubuntu-20.04 diff --git a/run-tests.sh b/run-tests.sh index f1760198..be7b60c9 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,21 +1,36 @@ -#!/bin/sh +#!/usr/bin/env bash # # This file is part of REANA. -# Copyright (C) 2018, 2019, 2020, 2021, 2022, 2023 CERN. +# Copyright (C) 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 -check_script () { +check_shellcheck () { shellcheck run-tests.sh } +check_commitlint () { + from=${2:-master} + to=${3:-HEAD} + npx commitlint --from="$from" --to="$to" --verbose + found=0 + while IFS= read -r line; do + if echo "$line" | grep -qP "\(\#[0-9]+\)$"; then + echo "✔ PR number present in $line" + 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_sphinx () { sphinx-build -qnNW docs docs/_build/html } @@ -41,7 +56,8 @@ check_docker_build () { } check_all () { - check_script + check_commitlint + check_shellcheck check_sphinx check_lint check_prettier @@ -58,7 +74,6 @@ fi for arg in "$@" do case $arg in - --check-shellscript) check_script;; --check-sphinx) check_sphinx;; --check-lint) check_lint;; --check-prettier) check_prettier;; @@ -68,3 +83,16 @@ do *) esac done + +arg="$1" +case $arg in + --check-commitlint) check_commitlint "$@";; + --check-shellcheck) check_shellcheck;; + --check-sphinx) check_sphinx;; + --check-lint) check_lint;; + --check-prettier) check_prettier;; + --check-js-tests) check_js_tests;; + --check-dockerfile) check_dockerfile;; + --check-docker-build) check_docker_build;; + *) echo "[ERROR] Invalid argument '$arg'. Exiting." && exit 1;; +esac