diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9fa6292..6fcbbec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ # This file is part of REANA. -# Copyright (C) 2020 CERN. +# Copyright (C) 2020, 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,43 @@ 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: + - name: Checkout + uses: actions/checkout@v3 + + - name: Runs shell script static analysis + run: | + sudo apt-get install shellcheck + ./run-tests.sh --check-shellcheck + lint-dockerfile: runs-on: ubuntu-20.04 steps: diff --git a/run-tests.sh b/run-tests.sh new file mode 100755 index 0000000..19424f9 --- /dev/null +++ b/run-tests.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# +# This file is part of REANA. +# Copyright (C) 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. + +set -o errexit +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_shellcheck () { + find . -name "*.sh" -exec shellcheck {} \; +} + +check_all () { + check_commitlint + check_shellcheck +} + +if [ $# -eq 0 ]; then + check_all + exit 0 +fi + +arg="$1" +case $arg in + --check-commitlint) check_commitlint "$@";; + --check-shellcheck) check_shellcheck;; + *) echo "[ERROR] Invalid argument '$arg'. Exiting." && exit 1;; +esac