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/.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..053783d0 --- /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": "node" +} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..ee2bfff4 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.9.3" +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE b/LICENSE index 5ce03858..c1b8cb32 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (C) 2018, 2019, 2020, 2021, 2022, 2023 CERN. +Copyright (C) 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/run-tests.sh b/run-tests.sh index f1760198..59e67290 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,19 +1,34 @@ -#!/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 () { - 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_sphinx () { @@ -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