Skip to content

Commit 5ebbe34

Browse files
committed
add links to breaking changes in PR
1 parent 9efd150 commit 5ebbe34

File tree

2 files changed

+121
-2
lines changed

2 files changed

+121
-2
lines changed

.github/workflows/nightly-build.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
- name: Install build tools
4747
run: |
4848
python -m pip install --upgrade pip
49-
pip install toml requests
49+
pip install toml requests packaging
5050
5151
- name: Get latest upstream versions
5252
id: get_versions
@@ -58,6 +58,13 @@ jobs:
5858
OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }}
5959
run: python scripts/update_dependencies.py
6060

61+
- name: Check for breaking changes
62+
id: breaking_changes
63+
env:
64+
OTEL_PYTHON_VERSION: ${{ steps.get_versions.outputs.otel_python_version }}
65+
OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }}
66+
run: python scripts/find_breaking_changes.py
67+
6168
- name: Check for changes and create PR
6269
id: check_changes
6370
run: |
@@ -79,7 +86,10 @@ jobs:
7986
8087
**Updated versions:**
8188
- OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }}
82-
- OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }}" \
89+
- OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }}
90+
91+
**Upstream releases with breaking changes:**
92+
${{ steps.breaking_changes.outputs.breaking_changes_info }}" \
8393
--base main \
8494
--head "$BRANCH_NAME"
8595
fi

scripts/find_breaking_changes.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#!/usr/bin/env python3
2+
3+
import requests
4+
import sys
5+
import os
6+
import re
7+
from packaging import version
8+
9+
def get_current_version_from_pyproject():
10+
"""Extract current OpenTelemetry versions from pyproject.toml."""
11+
try:
12+
with open('aws-opentelemetry-distro/pyproject.toml', 'r', encoding='utf-8') as file:
13+
content = file.read()
14+
15+
# Find first opentelemetry-api version (core version)
16+
api_match = re.search(r'"opentelemetry-api == ([^"]*)"', content)
17+
current_core_version = api_match.group(1) if api_match else None
18+
19+
# Find first opentelemetry-distro version (contrib version)
20+
distro_match = re.search(r'"opentelemetry-distro == ([^"]*)"', content)
21+
current_contrib_version = distro_match.group(1) if distro_match else None
22+
23+
return current_core_version, current_contrib_version
24+
25+
except Exception as error:
26+
print(f"Error reading current versions: {error}")
27+
return None, None
28+
29+
def get_releases_with_breaking_changes(repo, current_version, new_version):
30+
"""Get releases between current and new version that mention breaking changes."""
31+
try:
32+
response = requests.get(
33+
f'https://api.github.com/repos/open-telemetry/{repo}/releases',
34+
timeout=30
35+
)
36+
response.raise_for_status()
37+
38+
releases = response.json()
39+
breaking_releases = []
40+
41+
for release in releases:
42+
release_version = release['tag_name'].lstrip('v')
43+
44+
# Check if this release is between current and new version
45+
try:
46+
if (version.parse(release_version) > version.parse(current_version) and
47+
version.parse(release_version) <= version.parse(new_version)):
48+
49+
# Check if release notes mention breaking changes
50+
body = release.get('body', '').lower()
51+
if any(keyword in body for keyword in ['breaking change', 'breaking changes', 'breaking:', 'breaking']):
52+
breaking_releases.append({
53+
'version': release_version,
54+
'name': release['name'],
55+
'url': release['html_url'],
56+
'body': release.get('body', '')
57+
})
58+
except Exception:
59+
# Skip releases with invalid version formats
60+
continue
61+
62+
return breaking_releases
63+
64+
except requests.RequestException as request_error:
65+
print(f"Warning: Could not get releases for {repo}: {request_error}")
66+
return []
67+
68+
def main():
69+
new_core_version = os.environ.get('OTEL_PYTHON_VERSION')
70+
new_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION')
71+
72+
if not new_core_version or not new_contrib_version:
73+
print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required")
74+
sys.exit(1)
75+
76+
current_core_version, current_contrib_version = get_current_version_from_pyproject()
77+
78+
if not current_core_version or not current_contrib_version:
79+
print("Could not determine current versions")
80+
sys.exit(1)
81+
82+
print(f"Checking for breaking changes:")
83+
print(f"Core: {current_core_version}{new_core_version}")
84+
print(f"Contrib: {current_contrib_version}{new_contrib_version}")
85+
86+
# Check both repos for breaking changes
87+
core_breaking = get_releases_with_breaking_changes('opentelemetry-python', current_core_version, new_core_version)
88+
contrib_breaking = get_releases_with_breaking_changes('opentelemetry-python-contrib', current_contrib_version, new_contrib_version)
89+
90+
# Output for GitHub Actions
91+
breaking_info = ""
92+
93+
if core_breaking:
94+
breaking_info += "**opentelemetry-python:**\\n"
95+
for release in core_breaking:
96+
breaking_info += f"- [{release['name']}]({release['url']})\\n"
97+
98+
if contrib_breaking:
99+
breaking_info += "**opentelemetry-python-contrib:**\\n"
100+
for release in contrib_breaking:
101+
breaking_info += f"- [{release['name']}]({release['url']})\\n"
102+
103+
# Set GitHub output
104+
if os.environ.get('GITHUB_OUTPUT'):
105+
with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as output_file:
106+
output_file.write(f'breaking_changes_info={breaking_info}\n')
107+
108+
if __name__ == '__main__':
109+
main()

0 commit comments

Comments
 (0)