From 76969192f9fd6a392901d638e6436f825865c9bc Mon Sep 17 00:00:00 2001 From: Marnik Bercx Date: Wed, 20 Dec 2023 18:59:58 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Devops:=20Add=20CD=20GitHub=20Ac?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd.yml | 46 +++++++++++++++++++++++ .github/workflows/validate_release_tag.py | 40 ++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 .github/workflows/cd.yml create mode 100644 .github/workflows/validate_release_tag.py diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..5784f9f --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,46 @@ +name: cd + +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+*' + +jobs: + + validate-release-tag: + + if: github.repository == 'aiidateam/aiida-submission-controller' + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v2 + + - name: Set up Python 3.11 + uses: actions/setup-python@v2 + with: + python-version: '3.11' + + - name: Validate the tag version against the package version + run: python .github/workflows/validate_release_tag.py $GITHUB_REF + + publish: + + name: Publish to PyPI + needs: [validate-release-tag] + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v2 + + - name: Set up Python 3.11 + uses: actions/setup-python@v2 + with: + python-version: '3.11' + + - name: Install flit + run: pip install flit~=3.8 + + - name: Build and publish + run: flit publish diff --git a/.github/workflows/validate_release_tag.py b/.github/workflows/validate_release_tag.py new file mode 100644 index 0000000..0d9e57a --- /dev/null +++ b/.github/workflows/validate_release_tag.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +"""Validate that the version in the tag label matches the version of the package.""" +import argparse +import ast +from pathlib import Path + + +def get_version_from_module(content: str) -> str: + """Get the ``__version__`` attribute from a module. + + .. note:: This has been adapted from :mod:`setuptools.config`. + """ + try: + module = ast.parse(content) + except SyntaxError as exception: + raise OSError("Unable to parse module.") from exception + + try: + return next( + ast.literal_eval(statement.value) + for statement in module.body + if isinstance(statement, ast.Assign) + for target in statement.targets + if isinstance(target, ast.Name) and target.id == "__version__" + ) + except StopIteration as exception: + raise OSError("Unable to find the `__version__` attribute in the module.") from exception + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("GITHUB_REF", help="The GITHUB_REF environmental variable") + args = parser.parse_args() + assert args.GITHUB_REF.startswith("refs/tags/v"), f'GITHUB_REF should start with "refs/tags/v": {args.GITHUB_REF}' + tag_version = args.GITHUB_REF[11:] + package_version = get_version_from_module( + Path("aiida_submission_controller/__init__.py").read_text(encoding="utf-8") + ) + error_message = f"The tag version `{tag_version}` is different from the package version `{package_version}`" + assert tag_version == package_version, error_message