11#!/usr/bin/env python3
2+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+ # SPDX-License-Identifier: Apache-2.0
24
5+ import os
36import re
4- import requests
57import sys
8+
9+ import requests
610from packaging import version
711
812
9- def get_current_versions ():
10- """Get current versions from build.gradle.kts."""
13+ def get_current_version_from_gradle ():
14+ """Extract current OpenTelemetry versions from build.gradle.kts."""
1115 try :
1216 with open ("dependencyManagement/build.gradle.kts" , "r" , encoding = "utf-8" ) as file :
1317 content = file .read ()
1418
15- # Extract otelVersion
19+ # Extract otelVersion (instrumentation version)
1620 otel_version_match = re .search (r'val otelVersion = "([^"]*)"' , content )
1721 current_instrumentation_version = otel_version_match .group (1 ) if otel_version_match else None
1822
19- return current_instrumentation_version
23+ # Extract contrib version from dependency line
24+ contrib_match = re .search (r'"io\.opentelemetry\.contrib:opentelemetry-aws-xray:([^"]*)",' , content )
25+ current_contrib_version = contrib_match .group (1 ) if contrib_match else None
26+
27+ return current_instrumentation_version , current_contrib_version
2028
2129 except (OSError , IOError ) as error :
2230 print (f"Error reading current versions: { error } " )
23- return None
31+ return None , None
2432
2533
2634def get_releases_with_breaking_changes (repo , current_version , new_version ):
@@ -44,10 +52,9 @@ def get_releases_with_breaking_changes(repo, current_version, new_version):
4452 <= version .parse (new_version )
4553 ):
4654
47- # Check if release notes have breaking changes as headers
55+ # Check if release notes have breaking changes header or bold text
4856 body = release .get ("body" , "" )
49- breaking_header_pattern = r'^\s*#+.*Breaking changes'
50- if re .search (breaking_header_pattern , body , re .MULTILINE ):
57+ if re .search (r"^(#+|\*\*)\s*breaking changes" , body , re .MULTILINE | re .IGNORECASE ):
5158 breaking_releases .append (
5259 {
5360 "version" : release_version ,
@@ -56,7 +63,8 @@ def get_releases_with_breaking_changes(repo, current_version, new_version):
5663 "body" : release .get ("body" , "" ),
5764 }
5865 )
59- except (ValueError , KeyError ):
66+ except (ValueError , KeyError ) as parse_error :
67+ print (f"Warning: Skipping release { release .get ('name' , 'unknown' )} due to error: { parse_error } " )
6068 continue
6169
6270 return breaking_releases
@@ -67,32 +75,32 @@ def get_releases_with_breaking_changes(repo, current_version, new_version):
6775
6876
6977def main ():
70- current_instrumentation_version = get_current_versions ()
78+ new_instrumentation_version = os .environ .get ("OTEL_JAVA_INSTRUMENTATION_VERSION" )
79+ new_contrib_version = os .environ .get ("OTEL_JAVA_CONTRIB_VERSION" )
7180
72- if not current_instrumentation_version :
73- print ("Could not determine current versions " )
81+ if not new_instrumentation_version or not new_contrib_version :
82+ print ("Error: OTEL_JAVA_INSTRUMENTATION_VERSION and OTEL_JAVA_CONTRIB_VERSION environment variables required " )
7483 sys .exit (1 )
7584
76- # Get new versions from the update script
77- sys .path .append ('scripts' )
78- from update_dependencies import get_latest_instrumentation_version , get_latest_contrib_version
79-
80- new_instrumentation_version = get_latest_instrumentation_version ()
81- new_contrib_version = get_latest_contrib_version ()
85+ current_instrumentation_version , current_contrib_version = get_current_version_from_gradle ()
8286
83- if not new_instrumentation_version :
84- print ("Could not determine new versions" )
87+ if not current_instrumentation_version :
88+ print ("Could not determine current versions" )
8589 sys .exit (1 )
8690
8791 print ("Checking for breaking changes:" )
8892 print (f"Instrumentation: { current_instrumentation_version } → { new_instrumentation_version } " )
89- if new_contrib_version :
90- print (f"Contrib: → { new_contrib_version } " )
93+ print (f"Contrib: { current_contrib_version or 'unknown' } → { new_contrib_version } " )
9194
92- # Check instrumentation repo for breaking changes
95+ # Check both repos for breaking changes
9396 instrumentation_breaking = get_releases_with_breaking_changes (
9497 "opentelemetry-java-instrumentation" , current_instrumentation_version , new_instrumentation_version
9598 )
99+ contrib_breaking = []
100+ if current_contrib_version :
101+ contrib_breaking = get_releases_with_breaking_changes (
102+ "opentelemetry-java-contrib" , current_contrib_version , new_contrib_version
103+ )
96104
97105 # Output for GitHub Actions
98106 breaking_info = ""
@@ -102,11 +110,12 @@ def main():
102110 for release in instrumentation_breaking :
103111 breaking_info += f"- [{ release ['name' ]} ]({ release ['url' ]} )\n "
104112
105- if new_contrib_version :
106- breaking_info += "\n **Check contrib releases for potential breaking changes:**\n "
107- breaking_info += "- [opentelemetry-java-contrib releases](https://github.com/open-telemetry/opentelemetry-java-contrib/releases)\n "
113+ if contrib_breaking :
114+ breaking_info += "\n **opentelemetry-java-contrib:**\n "
115+ for release in contrib_breaking :
116+ breaking_info += f"- [{ release ['name' ]} ]({ release ['url' ]} )\n "
108117
109- import os
118+ # Set GitHub output
110119 if os .environ .get ("GITHUB_OUTPUT" ):
111120 with open (os .environ ["GITHUB_OUTPUT" ], "a" , encoding = "utf-8" ) as output_file :
112121 output_file .write (f"breaking_changes_info<<EOF\n { breaking_info } EOF\n " )
0 commit comments