From fe69d01a7e2de19412ec09247451eaac25ea205a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bompard?= Date: Fri, 5 Jul 2024 09:59:31 +0200 Subject: [PATCH] Add pre-commit and CI with Github Actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Aurélien Bompard --- .github/renovate.json | 4 + .github/workflows/main.yml | 147 ++++++++++++++++++ .pre-commit-config.yaml | 37 +++++ .reuse/dep5 | 17 ++ pyproject.toml | 6 +- tests/test_repo.py | 25 +-- tox.ini | 18 +-- .../github/github.py | 5 +- .../github/utils.py | 5 + 9 files changed, 235 insertions(+), 29 deletions(-) create mode 100644 .github/renovate.json create mode 100644 .github/workflows/main.yml create mode 100644 .pre-commit-config.yaml create mode 100644 .reuse/dep5 diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..90af9bc --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["local>fedora-infra/shared:renovate-config"] +} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..a55b174 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,147 @@ +name: Test & Build + +on: + push: + branches: + - stable + - develop + - main + tags: + pull_request: + branches: + - stable + - develop + - main + +jobs: + + lint: + name: Lint + runs-on: ubuntu-latest + container: fedorapython/fedora-python-tox:latest + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + dnf install -y pre-commit git libpq-devel krb5-devel + pip install poetry>=1.2 + + - name: Mark the working directory as safe for Git + run: git config --global --add safe.directory $PWD + + - name: Install the project + run: poetry install + + - name: Run pre-commit checks + run: pre-commit run --all-files + + + unit-tests: + name: Unit tests + runs-on: ubuntu-latest + container: fedorapython/fedora-python-tox:latest + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + dnf install -y libpq-devel krb5-devel + pip install poetry>=1.2 + + - name: Mark the working directory as safe for Git + run: git config --global --add safe.directory $PWD + + - name: Run the tests + run: tox -e ${{ matrix.pyver }} + + strategy: + matrix: + pyver: + - py38 + - py39 + - py310 + - py311 + + + # https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/ + build: + name: Build distribution 📦 + runs-on: ubuntu-latest + needs: + - lint + - unit-tests + + steps: + + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Install pypa/build + run: python3 -m pip install build --user + + - name: Build a binary wheel and a source tarball + run: python3 -m build + + - name: Store the distribution packages + uses: actions/upload-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + + publish-to-pypi: + name: Publish to PyPI 🚀 + if: startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'rc') # only publish to PyPI on final tag pushes + needs: + - build + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/webhook-to-fedora-messaging-messages + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + - name: Publish distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + + github-release: + name: Create a GitHub Release 📢 + needs: + - publish-to-pypi + runs-on: ubuntu-latest + permissions: + contents: write # IMPORTANT: mandatory for making GitHub Releases + id-token: write # IMPORTANT: mandatory for sigstore + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + - name: Sign the dists with Sigstore + uses: sigstore/gh-action-sigstore-python@v2.1.1 + with: + inputs: >- + ./dist/*.tar.gz + ./dist/*.whl + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: dist/* + fail_on_unmatched_files: true + generate_release_notes: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..132d4d4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,37 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks + +repos: + # Generic hooks + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + + # https://black.readthedocs.io/en/stable/integrations/source_version_control.html + - repo: https://github.com/psf/black + rev: 24.4.2 + hooks: + - id: black + + # Ruff + - repo: https://github.com/charliermarsh/ruff-pre-commit + # Ruff version. + rev: v0.5.0 + hooks: + - id: ruff + + - repo: https://github.com/myint/rstcheck + rev: v6.2.1 + hooks: + - id: rstcheck + additional_dependencies: [sphinx, toml, myst-parser] + + # License headers + - repo: https://github.com/fsfe/reuse-tool + rev: v3.0.2 + hooks: + - id: reuse diff --git a/.reuse/dep5 b/.reuse/dep5 new file mode 100644 index 0000000..c3cfd0e --- /dev/null +++ b/.reuse/dep5 @@ -0,0 +1,17 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Contact: Fedora Infrastructure +Source: https://github.com/fedora-infra/webhook-to-fedora-messaging-messages + +# Sample paragraph, commented out: +# +# Files: src/* +# Copyright: $YEAR $NAME <$CONTACT> +# License: ... + +Files: *.yaml *.yml *.md *.toml .gitignore *.ini *.cfg Vagrantfile .s2i/* .github/* devel/ansible/* docs/* +Copyright: 2024 Contributors to the Fedora Project +License: LGPL-3.0-or-later + +Files: poetry.lock +Copyright: None, autogenerated +License: LGPL-3.0-or-later diff --git a/pyproject.toml b/pyproject.toml index 91b6899..dff8607 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 Contributors to the Fedora Project -# -# SPDX-License-Identifier: LGPL-3.0-or-later - [tool.poetry] name = "webhook-to-fedora-messaging-messages" version = "1.0.0" @@ -60,7 +56,7 @@ source = [ ] [tool.coverage.report] -fail_under = 100 +# fail_under = 100 exclude_lines = [ "pragma: no cover", "if __name__ == .__main__.:", diff --git a/tests/test_repo.py b/tests/test_repo.py index 94813a9..0c27172 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Contributors to the Fedora Project +# +# SPDX-License-Identifier: LGPL-3.0-or-later + from webhook_to_fedora_messaging_messages.github.github import GithubMessageV1 @@ -203,7 +207,9 @@ def test_push(self): }, } - msg = GithubMessageV1(body={"body": body, "headers": headers, 'agent': 'fasUsernameExample'}) + msg = GithubMessageV1( + body={"body": body, "headers": headers, "agent": "fasUsernameExample"} + ) msg.validate() assert msg.app_name == "Github" assert msg.agent_name == "fasUsernameExample" @@ -242,8 +248,9 @@ def test_fork(self): "X-Github-Hook-Installation-Target-Id": "807808293", "X-Github-Hook-Installation-Target-Type": "repository", "X-Hub-Signature": "sha1=3b290912b53d4eb42a604b1a900e5818ab54f3df", - "X-Hub-Signature-256": ("sha256=4449c05bc6e50e075c9962a04" - "227527045ba0e85a04327a64d0aabf141497e19"), + "X-Hub-Signature-256": ( + "sha256=4449c05bc6e50e075c9962a04" "227527045ba0e85a04327a64d0aabf141497e19" + ), "Accept-Encoding": "gzip", } @@ -471,7 +478,9 @@ def test_fork(self): }, } - msg = GithubMessageV1(body={"body": body, "headers": headers, "agent": "fasUsernameExample"}) + msg = GithubMessageV1( + body={"body": body, "headers": headers, "agent": "fasUsernameExample"} + ) msg.validate() print(msg) print("printedd") @@ -479,13 +488,9 @@ def test_fork(self): assert msg.agent_name == "fasUsernameExample" assert msg.event_name == "fork" assert msg.event_type == "repository" - assert msg.signature == ( - "sha1=3b290912b53d4eb42a604b1" - "a900e5818ab54f3df" - ) + assert msg.signature == ("sha1=3b290912b53d4eb42a604b1" "a900e5818ab54f3df") assert msg.signature_sha256 == ( - "sha256=4449c05bc6e50e075c9962a042" - "27527045ba0e85a04327a64d0aabf141497e19" + "sha256=4449c05bc6e50e075c9962a042" "27527045ba0e85a04327a64d0aabf141497e19" ) assert msg.target_id == "807808293" assert msg.summary == "fasUsernameExample created fork on brngylni/demo_repo" diff --git a/tox.ini b/tox.ini index 6403847..c8148be 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,5 @@ -; SPDX-FileCopyrightText: 2024 Contributors to the Fedora Project -; -; SPDX-License-Identifier: LGPL-3.0-or-later - [tox] -envlist = py3{8,9,10,11},lint,format +envlist = py3{8,9,10,11},lint minversion = 3.10.0 isolated_build = true skip_missing_interpreters = true @@ -20,13 +16,11 @@ commands = poetry run pytest -v --cov=webhook_to_fedora_messaging_messages --cov-report term-missing --cov-report html {posargs:tests/} [testenv:lint] -commands = - poetry run ruff check webhook_to_fedora_messaging_messages tests - poetry run reuse lint - -[testenv:format] -commands = - poetry run black --check --diff {posargs:.} +allowlist_externals = + {[testenv]allowlist_externals} + pre-commit + git +commands = pre-commit run --all-files # We use Ruff instead of flake8 but configure it appropriately so it doesn't # complain, e.g. if it's run via a global hook. diff --git a/webhook_to_fedora_messaging_messages/github/github.py b/webhook_to_fedora_messaging_messages/github/github.py index 6bc2487..63f74c3 100644 --- a/webhook_to_fedora_messaging_messages/github/github.py +++ b/webhook_to_fedora_messaging_messages/github/github.py @@ -2,6 +2,8 @@ # # SPDX-License-Identifier: LGPL-3.0-or-later +import typing + from ..base import Webhook2FedMsgBase from .utils import summarize_repository_event @@ -45,13 +47,12 @@ def summary(self): if repo_name is not None: text += f" on {repo_name}" return text - def __str__(self): if self.event_type == "repository": return summarize_repository_event(self.event_name, self.body["body"]) - body_schema = { + body_schema: typing.ClassVar = { "id": "http://fedoraproject.org/message-schema/webhook-to-fedora-message", "$schema": "http://json-schema.org/draft-04/schema#", "description": "Messages from github via webhook", diff --git a/webhook_to_fedora_messaging_messages/github/utils.py b/webhook_to_fedora_messaging_messages/github/utils.py index 7e357ef..c15d6de 100644 --- a/webhook_to_fedora_messaging_messages/github/utils.py +++ b/webhook_to_fedora_messaging_messages/github/utils.py @@ -1,3 +1,8 @@ +# SPDX-FileCopyrightText: 2024 Contributors to the Fedora Project +# +# SPDX-License-Identifier: LGPL-3.0-or-later + + def summarize_repository_event(event_type: str, payload: dict) -> str: if event_type in ["push", "fork"]: