diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000..92f229e2 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,26 @@ +name: Pre-Commit + +on: + workflow_call: + inputs: + ref: + description: The reference to build + type: string + required: true + +jobs: + linter: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10.11" + + - name: Run pre-commit + uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/pull-request-main.yml b/.github/workflows/pull-request-main.yml new file mode 100644 index 00000000..771e1698 --- /dev/null +++ b/.github/workflows/pull-request-main.yml @@ -0,0 +1,19 @@ +name: Pull request main + +on: + pull_request_target: + branches: [main] + paths-ignore: ["docs/**"] + +jobs: + test: + uses: ./.github/workflows/test-and-build.yml + with: + ref: ${{ github.event.pull_request.head.sha }} + secrets: inherit + + pre-commit: + uses: ./.github/workflows/pre-commit.yml + with: + ref: ${{ github.event.pull_request.head.sha }} + secrets: inherit diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml index 749d65f9..b038011f 100644 --- a/.github/workflows/test-and-build.yml +++ b/.github/workflows/test-and-build.yml @@ -1,11 +1,11 @@ name: Build and Test on: - push: - branches: - - main - pull_request_target: - branches: - - main + workflow_call: + inputs: + ref: + description: The reference to build + type: string + required: true env: AIRFLOW_HOME: /home/runner/work/workflows/workflows diff --git a/.gitlint b/.gitlint new file mode 100644 index 00000000..cad036b1 --- /dev/null +++ b/.gitlint @@ -0,0 +1,11 @@ +[general] +ignore=body-is-missing +extra-path=./scripts/gitlint_rules/ +debug=true +verbosity=3 + +[title-max-length] +line-length=50 + +[body-max-line-length] +line-length=72 \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2fc4a58e..5bfb7c22 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,6 +7,7 @@ repos: rev: "v2.7.1" hooks: - id: prettier + stages: [commit] - repo: https://github.com/pycqa/isort rev: "5.12.0" hooks: @@ -22,3 +23,12 @@ repos: - id: check-merge-conflict - id: end-of-file-fixer - id: trailing-whitespace + - repo: https://github.com/jorisroovers/gitlint + rev: "v0.17.0" + hooks: + - id: gitlint + language: python + entry: gitlint + stages: [commit-msg] + args: [--msg-filename] + diff --git a/scripts/gitlint_rules/rules.py b/scripts/gitlint_rules/rules.py new file mode 100644 index 00000000..c05521cb --- /dev/null +++ b/scripts/gitlint_rules/rules.py @@ -0,0 +1,40 @@ +import re + +from gitlint.rules import CommitRule, RuleViolation + +class SignedOffBy(CommitRule): + """This rule will enforce that each commit contains a "Signed-off-by" line.""" + + name = "body-requires-signed-off-by" + id = "Workflows1" + + def validate(self, commit): + for line in commit.message.body: + if line.startswith("Signed-off-by"): + return + + msg = "Body does not contain a 'Signed-Off-By' line" + return [RuleViolation(self.id, msg, line_nr=1)] + + +class ApprovedSubject(CommitRule): + """Validate subject of each commit. + + This rule will enforce that each commit starts with a "module: text" format. + The 'module' can be any alphanumeric word, and the message must start with a colon followed by a space. + """ + + name = "approved-subject-in-title" + id = "Workflows2" + + MODULE_PATTERN = re.compile(r"^[a-zA-Z0-9_-]+: .+") + + def validate(self, commit): + title = commit.message.title + + if not self.MODULE_PATTERN.match(title): + msg = "Subject does not follow 'module: text' format" + return [RuleViolation(self.id, msg, line_nr=1)] + + return +