From 5aa289e47865ab9c1ca4d1efbffa1fd1024b81f7 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Sun, 31 Dec 2023 10:09:33 -0300 Subject: [PATCH] Improve GitHub release workflow This changes the existing script to just generate the release notes and delegate the actual publishing to the `softprops/action-gh-release@v1` action. This allows us to delete the custom code, which failed recently in https://github.com/pytest-dev/pytest/actions/runs/7370258570/job/20056477756. --- .github/workflows/deploy.yml | 13 +++-- scripts/.gitignore | 1 + ...-notes.py => generate-gh-release-notes.py} | 47 ++++--------------- tox.ini | 11 ++--- 4 files changed, 23 insertions(+), 49 deletions(-) create mode 100644 scripts/.gitignore rename scripts/{publish-gh-release-notes.py => generate-gh-release-notes.py} (56%) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ca65662c1..fed725f0e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -82,9 +82,14 @@ jobs: python -m pip install --upgrade pip pip install --upgrade tox - - name: Publish GitHub release notes - env: - GH_RELEASE_NOTES_TOKEN: ${{ github.token }} + - name: Generate release notes run: | sudo apt-get install pandoc - tox -e publish-gh-release-notes + tox -e generate-gh-release-notes -- ${{ github.event.inputs.version }} scripts/latest-release-notes.md + + - name: Publish GitHub Release + uses: softprops/action-gh-release@v1 + with: + body_path: scripts/latest-release-notes.md + files: dist/* + tag_name: ${{ github.event.inputs.version }} diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 000000000..50a75b629 --- /dev/null +++ b/scripts/.gitignore @@ -0,0 +1 @@ +latest-release-notes.md diff --git a/scripts/publish-gh-release-notes.py b/scripts/generate-gh-release-notes.py similarity index 56% rename from scripts/publish-gh-release-notes.py rename to scripts/generate-gh-release-notes.py index 68cbd7adf..d30b8ef30 100644 --- a/scripts/publish-gh-release-notes.py +++ b/scripts/generate-gh-release-notes.py @@ -1,3 +1,4 @@ +# mypy:disallow-untyped-defs """ Script used to publish GitHub release notes extracted from CHANGELOG.rst. @@ -19,27 +20,18 @@ The script also requires ``pandoc`` to be previously installed in the system. Requires Python3.6+. """ -import os import re import sys from pathlib import Path -import github3 import pypandoc -def publish_github_release(slug, token, tag_name, body): - github = github3.login(token=token) - owner, repo = slug.split("/") - repo = github.repository(owner, repo) - return repo.create_release(tag_name=tag_name, body=body) - - def parse_changelog(tag_name): p = Path(__file__).parent.parent / "doc/en/changelog.rst" changelog_lines = p.read_text(encoding="UTF-8").splitlines() - title_regex = re.compile(r"pytest (\d\.\d+\.\d+) \(\d{4}-\d{2}-\d{2}\)") + title_regex = re.compile(r"pytest (\d\.\d+\.\d+\w*) \(\d{4}-\d{2}-\d{2}\)") consuming_version = False version_lines = [] for line in changelog_lines: @@ -64,36 +56,17 @@ def convert_rst_to_md(text): def main(argv): - if len(argv) > 1: - tag_name = argv[1] - else: - tag_name = os.environ.get("GITHUB_REF") - if not tag_name: - print("tag_name not given and $GITHUB_REF not set", file=sys.stderr) - return 1 - if tag_name.startswith("refs/tags/"): - tag_name = tag_name[len("refs/tags/") :] + if len(argv) != 3: + print("Usage: generate-gh-release-notes VERSION FILE") + return 2 - token = os.environ.get("GH_RELEASE_NOTES_TOKEN") - if not token: - print("GH_RELEASE_NOTES_TOKEN not set", file=sys.stderr) - return 1 - - slug = os.environ.get("GITHUB_REPOSITORY") - if not slug: - print("GITHUB_REPOSITORY not set", file=sys.stderr) - return 1 - - rst_body = parse_changelog(tag_name) + version, filename = argv[1:3] + print(f"Generating GitHub release notes for version {version}") + rst_body = parse_changelog(version) md_body = convert_rst_to_md(rst_body) - if not publish_github_release(slug, token, tag_name, md_body): - print("Could not publish release notes:", file=sys.stderr) - print(md_body, file=sys.stderr) - return 5 - + Path(filename).write_text(md_body, encoding="UTF-8") print() - print(f"Release notes for {tag_name} published successfully:") - print(f"https://github.com/{slug}/releases/tag/{tag_name}") + print(f"Done: {filename}") print() return 0 diff --git a/tox.ini b/tox.ini index c52a43fd7..e92f6c98b 100644 --- a/tox.ini +++ b/tox.ini @@ -177,18 +177,13 @@ passenv = {[testenv:release]passenv} deps = {[testenv:release]deps} commands = python scripts/prepare-release-pr.py {posargs} -[testenv:publish-gh-release-notes] -description = create GitHub release after deployment +[testenv:generate-gh-release-notes] +description = generate release notes that can be published as GitHub Release basepython = python3 usedevelop = True -passenv = - GH_RELEASE_NOTES_TOKEN - GITHUB_REF - GITHUB_REPOSITORY deps = - github3.py pypandoc -commands = python scripts/publish-gh-release-notes.py {posargs} +commands = python scripts/generate-gh-release-notes.py {posargs} [flake8] max-line-length = 120