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.
This commit is contained in:
Bruno Oliveira 2023-12-31 10:09:33 -03:00 committed by Bruno Oliveira
parent 12b9bd5801
commit 5aa289e478
4 changed files with 23 additions and 49 deletions

View File

@ -82,9 +82,14 @@ jobs:
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install --upgrade tox pip install --upgrade tox
- name: Publish GitHub release notes - name: Generate release notes
env:
GH_RELEASE_NOTES_TOKEN: ${{ github.token }}
run: | run: |
sudo apt-get install pandoc 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 }}

1
scripts/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
latest-release-notes.md

View File

@ -1,3 +1,4 @@
# mypy:disallow-untyped-defs
""" """
Script used to publish GitHub release notes extracted from CHANGELOG.rst. 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+. Requires Python3.6+.
""" """
import os
import re import re
import sys import sys
from pathlib import Path from pathlib import Path
import github3
import pypandoc 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): def parse_changelog(tag_name):
p = Path(__file__).parent.parent / "doc/en/changelog.rst" p = Path(__file__).parent.parent / "doc/en/changelog.rst"
changelog_lines = p.read_text(encoding="UTF-8").splitlines() 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 consuming_version = False
version_lines = [] version_lines = []
for line in changelog_lines: for line in changelog_lines:
@ -64,36 +56,17 @@ def convert_rst_to_md(text):
def main(argv): def main(argv):
if len(argv) > 1: if len(argv) != 3:
tag_name = argv[1] print("Usage: generate-gh-release-notes VERSION FILE")
else: return 2
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/") :]
token = os.environ.get("GH_RELEASE_NOTES_TOKEN") version, filename = argv[1:3]
if not token: print(f"Generating GitHub release notes for version {version}")
print("GH_RELEASE_NOTES_TOKEN not set", file=sys.stderr) rst_body = parse_changelog(version)
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)
md_body = convert_rst_to_md(rst_body) md_body = convert_rst_to_md(rst_body)
if not publish_github_release(slug, token, tag_name, md_body): Path(filename).write_text(md_body, encoding="UTF-8")
print("Could not publish release notes:", file=sys.stderr)
print(md_body, file=sys.stderr)
return 5
print() print()
print(f"Release notes for {tag_name} published successfully:") print(f"Done: {filename}")
print(f"https://github.com/{slug}/releases/tag/{tag_name}")
print() print()
return 0 return 0

11
tox.ini
View File

@ -177,18 +177,13 @@ passenv = {[testenv:release]passenv}
deps = {[testenv:release]deps} deps = {[testenv:release]deps}
commands = python scripts/prepare-release-pr.py {posargs} commands = python scripts/prepare-release-pr.py {posargs}
[testenv:publish-gh-release-notes] [testenv:generate-gh-release-notes]
description = create GitHub release after deployment description = generate release notes that can be published as GitHub Release
basepython = python3 basepython = python3
usedevelop = True usedevelop = True
passenv =
GH_RELEASE_NOTES_TOKEN
GITHUB_REF
GITHUB_REPOSITORY
deps = deps =
github3.py
pypandoc pypandoc
commands = python scripts/publish-gh-release-notes.py {posargs} commands = python scripts/generate-gh-release-notes.py {posargs}
[flake8] [flake8]
max-line-length = 120 max-line-length = 120