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:
parent
12b9bd5801
commit
5aa289e478
|
@ -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 }}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
latest-release-notes.md
|
|
@ -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
11
tox.ini
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue