Use the github generated release notes by default in create-release.py (#13161)

* Use the github generated release notes by default in create-release.py * Merge

Blue committed Jun 26, 2025 at 11:54 UTC 1b7620a4f839b2bde06b95133313352b64788ec1
2 files changed +31 -26
.pipelines/flight-stage.yml
+1 -1
@@ -113,7 +113,7 @@ stages:
113 # Create a draft github release
114 - powershell: |
115 pip install --user -r tools/devops/requirements.txt
116 - python tools/devops/create-release.py '${{ parameters.packageVersion }}' drop\bundle\Microsoft.WSL_${{ parameters.packageVersion }}.0_x64_ARM64.msixbundle drop\bundle\wsl.${{ parameters.packageVersion }}.0.arm64.msi drop\bundle\wsl.${{ parameters.packageVersion }}.0.x64.msi --no-fetch --github-token "$env:token" ${{ iif(parameters.publishPackage, '--publish', '--use-current-ref') }}
116 + python tools/devops/create-release.py '${{ parameters.packageVersion }}' drop\bundle\Microsoft.WSL_${{ parameters.packageVersion }}.0_x64_ARM64.msixbundle drop\bundle\wsl.${{ parameters.packageVersion }}.0.arm64.msi drop\bundle\wsl.${{ parameters.packageVersion }}.0.x64.msi --no-fetch --github-token "$env:token" ${{ iif(parameters.publishPackage, '--publish --auto-release-notes', '--use-current-ref') }}
117
118 displayName: Create Github release
119 env:
tools/devops/create-release.py
+30 -25
@@ -19,7 +19,8 @@ from urllib.parse import urlparse
19 @click.option('--no-fetch', is_flag=True, default=False)
20 @click.option('--github-token', default=None)
21 @click.option('--use-current-ref', is_flag=True, default=False)
22 -def main(version: str, previous: str, max_message_lines: int, publish: bool, assets: list, no_fetch: bool, github_token: str, use_current_ref: bool):
22 +@click.option('--auto-release-notes', is_flag=True, default=False)
23 +def main(version: str, previous: str, max_message_lines: int, publish: bool, assets: list, no_fetch: bool, github_token: str, use_current_ref: bool, auto_release_notes: bool):
24 if publish:
25 if assets is None:
26 raise RuntimeError('--publish requires at least one asset')
@@ -38,36 +39,38 @@ def main(version: str, previous: str, max_message_lines: int, publish: bool, ass
39 print(f'Creating release notes for: {previous} -> {current_ref}', file=sys.stderr)
40
41 changes = ''
41 - for e in get_change_list(None if use_current_ref else version, previous, not no_fetch):
42
43 - # Detect attached github issues
44 - issues = find_github_issues(e.message)
45 - pr_description, pr_number = get_github_pr_message(github_token, e.message)
46 - if pr_description is not None:
47 - issues = issues.union(find_github_issues(pr_description))
43 + if not auto_release_notes:
44 + for e in get_change_list(None if use_current_ref else version, previous, not no_fetch):
45
49 - if github_token is not None:
50 - issues = filter_github_issues(issues, github_token)
46 + # Detect attached github issues
47 + issues = find_github_issues(e.message)
48 + pr_description, pr_number = get_github_pr_message(github_token, e.message)
49 + if pr_description is not None:
50 + issues = issues.union(find_github_issues(pr_description))
51
52 - if len(issues) > 1:
53 - print(f'WARNING: found more than 1 github issues in message: {message}. Issues: {issues}', file=sys.stderr)
52 + if github_token is not None:
53 + issues = filter_github_issues(issues, github_token)
54
55 - message = e.message[:-1] if e.message.endswith('\n') else e.message
55 + if len(issues) > 1:
56 + print(f'WARNING: found more than 1 github issues in message: {message}. Issues: {issues}', file=sys.stderr)
57
57 - # Shrink the message if it's too long
58 - lines = message.split('\n')
59 - message = '\n'.join([e for e in lines if e][:max_message_lines])
58 + message = e.message[:-1] if e.message.endswith('\n') else e.message
59
61 - # Get rid of the github PR #
62 - if pr_number is not None:
63 - message = message.replace(f'(#{pr_number})', '')
60 + # Shrink the message if it's too long
61 + lines = message.split('\n')
62 + message = '\n'.join([e for e in lines if e][:max_message_lines])
63
65 - # Append to the changes (chr(92) == '\n')
66 - message = f'{message.replace(chr(92), "")} (solves {",".join(issues)})' if issues else message
67 - changes += f'* {message}\n'
64 + # Get rid of the github PR #
65 + if pr_number is not None:
66 + message = message.replace(f'(#{pr_number})', '')
67 +
68 + # Append to the changes (chr(92) == '\n')
69 + message = f'{message.replace(chr(92), "")} (solves {",".join(issues)})' if issues else message
70 + changes += f'* {message}\n'
71
72 if publish:
70 - publish_release(version, changes, assets, github_token)
73 + publish_release(version, changes, assets, auto_release_notes, github_token)
74 else:
75 print(f'\n{changes}')
76
@@ -172,7 +175,7 @@ def get_change_list(version: str, previous: str, fetch: bool) -> list:
175
176
177 @backoff.on_exception(backoff.expo, (requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.RequestException), max_time=600)
175 -def publish_release(version: str, changes: str, assets: list, token: str):
178 +def publish_release(version: str, changes: str, assets: list, auto_release_notes: bool, token: str):
179 print(f'Creating private Github release for: {version}', file=sys.stderr)
180
181 # First create the release
@@ -183,10 +186,12 @@ def publish_release(version: str, changes: str, assets: list, token: str):
186 content = {'tag_name': version,
187 'target_commitish': 'master',
188 'name': version,
186 - 'body': changes,
189 "draft":True ,
190 'prerelease':True ,
189 - 'generate_release_notes': False}
191 + 'generate_release_notes': auto_release_notes}
192 +
193 + if changes:
194 + content['body'] = changes
195
196 response = requests.post('https://api.github.com/repos/microsoft/wsl/releases', json=content, headers=headers)
197 response.raise_for_status()