From 515559820912c34185b70c2b16a00183c2f8bdde Mon Sep 17 00:00:00 2001 From: Vincent Viloria Date: Mon, 15 Apr 2024 15:21:35 -0700 Subject: [PATCH] create script to check for backwards compatibility --- .../backwards_compatibility_check.sh | 57 +++++++++++++++++++ .github/workflows/maven.yml | 17 +++++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/backwards_compatibility_check.sh diff --git a/.github/workflows/backwards_compatibility_check.sh b/.github/workflows/backwards_compatibility_check.sh new file mode 100644 index 00000000..6b482802 --- /dev/null +++ b/.github/workflows/backwards_compatibility_check.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +TRUE=1 +FALSE=0 + +REMOVED_PACKAGES_FLAG=$FALSE +REMOVED_METHODS_FLAG=$FALSE + +KCL_MAVEN_DIR=~/.m2/repository/software/amazon/kinesis/amazon-kinesis-client + +# clear the Maven 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 dependency:get -Dartifact=software.amazon.kinesis:amazon-kinesis-client:LATEST +LATEST_VERSION=$(ls $KCL_MAVEN_DIR | grep '[0-9].[0-9].[0-9]') +LATEST_JAR=$KCL_MAVEN_DIR/$LATEST_VERSION/amazon-kinesis-client-$LATEST_VERSION.jar + +# get the current jar (i.e. the jar that is pending review) +mvn 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 + +echo "Comparing KCL versions $LATEST_VERSION (latest release) to $CURRENT_VERSION (current)." + +# check if any packages were removed +echo "Checking if packages in version $LATEST_VERSION were removed in $CURRENT_VERSION" +LATEST_PACKAGES=$(jar tf $LATEST_JAR | grep .class | tr / . | sed 's/\.class$//' | sort) +CURRENT_PACKAGES=$(jar tf $CURRENT_JAR | grep .class | tr / . | sed 's/\.class$//' | sort) +diff <(echo "$LATEST_PACKAGES") <(echo "$CURRENT_PACKAGES") | grep '^<' && REMOVED_PACKAGES_FLAG=$TRUE || echo "No packages removed in version $CURRENT_VERSION." + +# check if any methods within the packages were removed +echo "Checking if methods in $LATEST_VERSION were removed in $CURRENT_VERSION" +for package in $CURRENT_PACKAGES +do + # Get the second line of the output which indicates whether a class is public. Only classes that + # are public should be checked; other classes will not break backwards compatibility. + CLASS_DEFINITION=$(javap -classpath $LATEST_JAR $package | head -2 | tail -1) + if [[ $CLASS_DEFINITION != *"public"* ]] + then + continue + fi + + # check if any methods were removed + LATEST_METHODS=$(javap -classpath $LATEST_JAR $package) + CURRENT_METHODS=$(javap -classpath $CURRENT_JAR $package) + diff <(echo "$LATEST_METHODS") <(echo "$CURRENT_METHODS") | grep '^<' && REMOVED_METHODS_FLAG=$TRUE || : +done + +if [[ $REMOVED_METHODS_FLAG == $FALSE ]] +then + echo "No methods removed in version $CURRENT_VERSION." +fi + +if [[ $REMOVED_PACKAGES_FLAG == $TRUE || $REMOVED_METHODS_FLAG == $TRUE ]] +then + echo "KCL version $CURRENT_VERSION is not backwards compatible with version $LATEST_VERSION. See output above for removed packages/methods." + exit 1 +fi \ No newline at end of file diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6bb4ea3c..f53bef1e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -12,6 +12,7 @@ on: push: branches: - "master" + - "bwc" pull_request: branches: - "master" @@ -29,4 +30,18 @@ jobs: 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@v3 + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'corretto' + - name: Check backwards compatibility of changes + run: .github/workflows/backwards_compatibility_check.sh \ No newline at end of file