diff --git a/.github/scripts/backwards_compatibility_check.sh b/.github/scripts/backwards_compatibility_check.sh new file mode 100755 index 00000000..e8470ab5 --- /dev/null +++ b/.github/scripts/backwards_compatibility_check.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +TRUE=1 +FALSE=0 +KCL_MAVEN_DIR=~/.m2/repository/software/amazon/kinesis/amazon-kinesis-client + +REMOVED_METHODS_FLAG=$FALSE +LATEST_VERSION="" +LATEST_JAR="" +CURRENT_VERSION="" +CURRENT_JAR="" + +# Get the JAR from the latest version release on Maven. +get_latest_jar() { + # clear the directory so that the latest release will be the only version in the Maven directory after running mvn dependency:get + rm -rf "$KCL_MAVEN_DIR" + mvn -B dependency:get -Dartifact=software.amazon.kinesis:amazon-kinesis-client:LATEST + LATEST_VERSION=$(ls "$KCL_MAVEN_DIR" | grep -E '[0-9]+.[0-9]+.[0-9]+') + LATEST_JAR=$KCL_MAVEN_DIR/$LATEST_VERSION/amazon-kinesis-client-$LATEST_VERSION.jar +} + +# Get the JAR with the changes that need to be verified. +get_current_jar() { + mvn -B install -DskipTests + CURRENT_VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec) + CURRENT_JAR=$KCL_MAVEN_DIR/$CURRENT_VERSION/amazon-kinesis-client-$CURRENT_VERSION.jar +} + +is_new_minor_release() { + local latest_minor_version=$(echo "$LATEST_VERSION" | cut -d . -f 2) + local current_minor_version=$(echo "$CURRENT_VERSION" | cut -d . -f 2) + [[ "$latest_minor_version" != "$current_minor_version" ]] + return $? +} + +# Skip classes with the KinesisClientInternalApi annotation. These classes are subject to breaking backwards compatibility. +is_kinesis_client_internal_api() { + local current_class="$1" + local grep_internal_api_result=$(javap -v -classpath "$LATEST_JAR" "$current_class" | grep KinesisClientInternalApi) + [[ "$grep_internal_api_result" != "" ]] + return $? +} + +# Skip classes which are not public (e.g. package level). These classes will not break backwards compatibility. +is_non_public_class() { + local current_class="$1" + local class_definition=$(javap -classpath "$LATEST_JAR" "$current_class" | head -2 | tail -1) + [[ "$class_definition" != *"public"* ]] + return $? +} + +# Ignore methods that change from abstract to non-abstract (and vice versa) if the class is an interface. +ignore_abstract_changes_in_interfaces() { + local current_class="$1" + local class_definition=$(javap -classpath "$LATEST_JAR" "$current_class" | head -2 | tail -1) + if [[ $class_definition == *"interface"* ]] + then + LATEST_METHODS=${LATEST_METHODS// abstract / } + CURRENT_METHODS=${CURRENT_METHODS// abstract / } + fi +} + +# Checks if there are any methods in the latest version that were removed in the current version. +find_removed_methods() { + echo "Checking if methods in current version (v$CURRENT_VERSION) were removed from latest version (v$LATEST_VERSION)" + if is_new_minor_release + then + echo "New minor release is being performed. Ignoring changes in classes marked with @KinesisClientInternalApi annotation." + fi + local latest_classes=$(jar tf $LATEST_JAR | grep .class | tr / . | sed 's/\.class$//') + for class in $latest_classes + do + if (is_kinesis_client_internal_api "$class" && is_new_minor_release) || is_non_public_class "$class" + then + continue + fi + + LATEST_METHODS=$(javap -classpath "$LATEST_JAR" "$class") + CURRENT_METHODS=$(javap -classpath "$CURRENT_JAR" "$class") + + ignore_abstract_changes_in_interfaces "$class" + + local removed_methods=$(diff <(echo "$LATEST_METHODS") <(echo "$CURRENT_METHODS") | grep '^<') + + if [[ "$removed_methods" != "" ]] + then + REMOVED_METHODS_FLAG=$TRUE + if is_kinesis_client_internal_api "$class" + then + echo "Found removed methods in class with @KinesisClientInternalApi annotation. To resolve these issues, upgrade the current minor version or address these changes." + fi + echo "$class does not have method(s):" + echo "$removed_methods" + fi + done +} + +get_backwards_compatible_result() { + if [[ $REMOVED_METHODS_FLAG == $TRUE ]] + then + echo "Current KCL version $CURRENT_VERSION is not backwards compatible with version $LATEST_VERSION. See output above for removed packages/methods." + exit 1 + else + echo "Current KCL version $CURRENT_VERSION is backwards compatible with version $LATEST_VERSION." + exit 0 + fi +} + +main() { + get_latest_jar + get_current_jar + find_removed_methods + get_backwards_compatible_result +} + +main \ No newline at end of file diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6bb4ea3c..81fca35b 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -22,11 +22,25 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 8 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '8' distribution: 'corretto' - name: Build with Maven - run: mvn -B package --file pom.xml -DskipITs \ No newline at end of file + run: mvn -B package --file pom.xml -DskipITs + + backwards-compatible-check: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 8 + uses: actions/setup-java@v4 + with: + java-version: '8' + distribution: 'corretto' + - name: Check backwards compatibility of changes + run: .github/scripts/backwards_compatibility_check.sh \ No newline at end of file diff --git a/amazon-kinesis-client-multilang/pom.xml b/amazon-kinesis-client-multilang/pom.xml index 1924c1c7..7c6354f6 100644 --- a/amazon-kinesis-client-multilang/pom.xml +++ b/amazon-kinesis-client-multilang/pom.xml @@ -21,7 +21,7 @@ amazon-kinesis-client-pom software.amazon.kinesis - 2.5.9-SNAPSHOT + 2.6.0-SNAPSHOT 4.0.0 diff --git a/amazon-kinesis-client/pom.xml b/amazon-kinesis-client/pom.xml index d6d73572..551fe0a4 100644 --- a/amazon-kinesis-client/pom.xml +++ b/amazon-kinesis-client/pom.xml @@ -23,7 +23,7 @@ software.amazon.kinesis amazon-kinesis-client-pom - 2.5.9-SNAPSHOT + 2.6.0-SNAPSHOT amazon-kinesis-client diff --git a/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java index 8ae545f5..47a5bbcd 100644 --- a/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java +++ b/amazon-kinesis-client/src/main/java/software/amazon/kinesis/retrieval/RetrievalConfig.java @@ -49,7 +49,7 @@ public class RetrievalConfig { */ public static final String KINESIS_CLIENT_LIB_USER_AGENT = "amazon-kinesis-client-library-java"; - public static final String KINESIS_CLIENT_LIB_USER_AGENT_VERSION = "2.5.9-SNAPSHOT"; + public static final String KINESIS_CLIENT_LIB_USER_AGENT_VERSION = "2.6.0-SNAPSHOT"; /** * Client used to make calls to Kinesis for records retrieval diff --git a/pom.xml b/pom.xml index def8fb8e..b9fddf74 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ amazon-kinesis-client-pom pom Amazon Kinesis Client Library - 2.5.9-SNAPSHOT + 2.6.0-SNAPSHOT The Amazon Kinesis Client Library for Java enables Java developers to easily consume and process data from Amazon Kinesis.