From d6059a8a2614757488966c7189f255504f954eb0 Mon Sep 17 00:00:00 2001
From: Mirza Karacic <mkaracic@aerospike.com>
Date: Wed, 11 Dec 2024 14:37:58 -0800
Subject: [PATCH] Integration fixes

---
 .github/actions/build-and-test/action.yaml    |   4 +-
 .../actions/fast-forward-merge/action.yaml    |  36 -------
 .github/actions/publish-to-jfrog/action.yaml  | 102 +++++++++++++++---
 .github/workflows/build-dev.yaml              |   2 +-
 .github/workflows/build.yaml                  |  30 +++++-
 .github/workflows/promote-prod.yaml           |   5 +-
 .github/workflows/promote-to-stage.yaml       |  17 ++-
 .github/workflows/promote.yaml                |  46 +++++---
 benchmarks/pom.xml                            |   2 +-
 client/config.json                            |  12 +++
 client/config.template                        |  12 +++
 .../bouncycastle_pom.xml}                     |   2 +-
 .../gnu_pom.xml                               |   2 +-
 .../publish-spec.json.template                |  12 +++
 client/pom.xml                                |  23 ++--
 examples/pom.xml                              |   2 +-
 pom.xml                                       |  29 ++++-
 test/pom.xml                                  |   2 +-
 18 files changed, 252 insertions(+), 88 deletions(-)
 delete mode 100644 .github/actions/fast-forward-merge/action.yaml
 create mode 100644 client/config.json
 create mode 100644 client/config.template
 rename client/{src/resources/bouncy_pom.xml => deploy-resources/bouncycastle_pom.xml} (98%)
 rename client/{src/resources => deploy-resources}/gnu_pom.xml (98%)
 create mode 100644 client/deploy-resources/publish-spec.json.template

diff --git a/.github/actions/build-and-test/action.yaml b/.github/actions/build-and-test/action.yaml
index f9ab2d19b..27920a827 100644
--- a/.github/actions/build-and-test/action.yaml
+++ b/.github/actions/build-and-test/action.yaml
@@ -31,11 +31,11 @@ runs:
     - name: Stage crypto
       shell: bash
       run: |
-        ./set_cypto ${{ inputs.crypto-type }}
+        ./set_crypto ${{ inputs.crypto-type }}
 
     - name: Build
       shell: bash
-      run: mvn clean install -P ${{ inputs.crypto-type }}
+      run: mvn clean install
 
     - name: Run EE server
       if: ${{ inputs.run-tests == 'true' }}
diff --git a/.github/actions/fast-forward-merge/action.yaml b/.github/actions/fast-forward-merge/action.yaml
deleted file mode 100644
index d917069b5..000000000
--- a/.github/actions/fast-forward-merge/action.yaml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: "Fast forward merge"
-description: Fast forward target branch to given commit hash
-
-inputs:
-  ref_to_merge:
-    description: Branch to merge into base
-    required: true
-  base_branch:
-    description: Base branch
-    required: true
-  git-bot-token:
-    description: Git bot token
-    required: true
-
-runs:
-  using: composite
-  steps:
-    - name: Checkout
-      uses: actions/checkout@v4
-      with:
-        # Fetch the whole history to prevent unrelated history errors
-        fetch-depth: "0"
-        ref: ${{ inputs.base_branch }}
-        token: ${{ inputs.git-bot-token }}
-
-    - name: Debug stuff
-      shell: bash
-      run: |
-        git remote -vvv
-    - name: Fast forward
-      shell: bash
-      run: git merge --ff-only ${{ inputs.ref_to_merge }}
-
-    - name: Upload changes to remote head branch
-      shell: bash
-      run: git push
diff --git a/.github/actions/publish-to-jfrog/action.yaml b/.github/actions/publish-to-jfrog/action.yaml
index 68f8a7654..57434e3ee 100644
--- a/.github/actions/publish-to-jfrog/action.yaml
+++ b/.github/actions/publish-to-jfrog/action.yaml
@@ -13,40 +13,118 @@ inputs:
   jfrog-platform-url:
     description: ""
     required: false
-    default: https://aerospike.jfrog.io/
+    default: https://aerospike.jfrog.io
   oidc-provider:
     description: ""
-    required: false
-    default: gh-aerospike-clients
+    required: true
   oidc-audience:
     description: ""
-    required: false
-    default: aerospike/clients
+    required: true
   crypto-type:
     description: ""
     required: false
-    default: gnu
+  artifact-name:
+    description: ""
+    required: true
+  artifact-id:
+    description: ""
+    required: true
+  artifact-version:
+    description: ""
+    required: true
+  deploy-spec-path:
+    description: ""
+    required: false
+    default: deploy-resources
 
 runs:
   using: "composite"
   steps:
     - name: Set up JFrog credentials
+      id: setup-jfrog-cli
       uses: jfrog/setup-jfrog-cli@v4
       env:
         JF_URL: ${{ inputs.jfrog-platform-url }}
       with:
+        version: 2.72.2
         oidc-provider-name: ${{ inputs.oidc-provider }}
         oidc-audience: ${{ inputs.oidc-audience }}
 
-    - name: Set crypto dependency
+    - uses: s4u/maven-settings-action@v3.1.0
+      with:
+        servers: '[{"id": "jfrog", "username": "${{ steps.setup-jfrog-cli.outputs.oidc-user }}", "password": "${{ steps.setup-jfrog-cli.outputs.oidc-token }}"}]'
+
+    - name: Configure jf cli
       shell: bash
       run: |
-        ./set_crypto ${{ inputs.crypto-type }}
+        jf mvn-config \
+        --repo-deploy-releases=${{ inputs.jfrog-releases-repo-name }} \
+        --repo-deploy-snapshots=${{ inputs.jfrog-snapshots-repo-name }}
+
+    #- name: Deploy client release
+    #  shell: bash
+    #  working-directory: client
+    #  run: |
+    #    # jf mvn source:jar javadoc:jar install deploy:deploy-file \
+    #    # -DartifactId=${{ inputs.artifact-id }} \
+    #    # -DpomFile=src/resources/${{ inputs.crypto-type }}_pom.xml \
+    #    # -Dfile=target/${{ inputs.artifact-name }}.jar \
+    #    # -Dfiles=target/${{ inputs.artifact-name }}-jar-with-dependencies.jar \
+    #    # -Dtypes=jar \
+    #    # -Dclassifiers=jar-with-dependencies \
+    #    # -Dsources=target/${{ inputs.artifact-name }}-sources.jar \
+    #    # -Djavadoc=target/${{ inputs.artifact-name }}-javadoc.jar \
+    #    # -DrepositoryId=jfrog \
+    #    # -DgeneratePom=false \
+    #    # -Durl=${{ inputs.jfrog-platform-url }}/artifactory/${{ inputs.jfrog-releases-repo-name }}
+    #    #
+    #    # jf mvn org.apache.maven.plugins:maven-deploy-plugin:3.1.3:deploy-file \
+    #    # -DartifactId=${{ inputs.artifact-id }} \
+    #    # -DpomFile=src/resources/${{ inputs.crypto-type }}_pom.xml \
+    #    # -Dfile=target/${{ inputs.artifact-name }}.jar \
+    #    # -Dfiles=target/${{ inputs.artifact-name }}-jar-with-dependencies.jar \
+    #    # -Dsources=target/${{ inputs.artifact-name }}-sources.jar \
+    #    # -Djavadoc=target/${{ inputs.artifact-name }}-javadoc.jar \
+    #    # -Dtypes=jar \
+    #    # -Dclassifiers=jar-with-dependencies \
+    #    # -DrepositoryId=jfrog \
+    #    # -DgeneratePom=false \
+    #    # -Durl=${{ inputs.jfrog-platform-url }}/artifactory/${{ inputs.jfrog-releases-repo-name }}
+    #    jf mvn source:jar javadoc:jar install
+
+    #- name: Publish build info
+    #  shell: bash
+    #  run: |
+    #    # Collect environment variables for the build
+    #    jf rt bce
+    #    # Collect VCS details from git and add them to the build
+    #    jf rt bag
+    #    # Publish build info
+    #    jf rt bp clients-java-push-to-dev ${{ github.run_number }}
+    #
+    - name: Generate deploy spec
+      shell: bash
+      working-directory: client
+      run: |
+        jq --arg targetPattern "${{ inputs.jfrog-releases-repo-name }}/com/aerospike/\${{ inputs.artifact-id }}/\${{ inputs.artifact-version }}/" \
+        --arg publicPomPattern "deploy-resources/${{ inputs.crypto-type }}_pom.xml" \
+        --arg publicPomTarget "${{ inputs.jfrog-releases-repo-name }}/com/aerospike/\${{ inputs.artifact-id }}/\${{ inputs.artifact-version }}/\${{ inputs.artifact-name }}.pom" \
+        '
+        .files[0].target = $targetPattern |
+        .files[1].pattern = $publicPomPattern |
+        .files[1].target = $publicPomTarget
+        ' ${{ inputs.deploy-spec-path }}/publish-spec.json.template > ${{ inputs.deploy-spec-path }}/publish-spec.json
+
+    - name: Debug deploy spec
+      shell: bash
+      working-directory: client
+      run: |
+        cat ${{ inputs.deploy-spec-path }}/publish-spec.json
 
-    - name: Deploy release
+    - name: Overwrite default pom with public release pom
       shell: bash
       working-directory: client
       run: |
-        jf mvn-config --repo-deploy-releases=${{ inputs.jfrog-releases-repo-name }} --repo-deploy-snapshots=${{ inputs.jfrog-snapshots-repo-name }}
-        jf mvn source:jar javadoc:jar deploy -Dusername=${{ steps.setup-jfrog-cli.outputs.oidc-user }} ${{ steps.setup-jfrog-cli.outputs.oidc-token }}
-        jf rt bp
+        jf rt upload --spec=${{ inputs.deploy-spec-path }}/publish-spec.json \
+            --build-name=clients-java-push-to-dev \
+            --build-number=${{ github.run_number }}
diff --git a/.github/workflows/build-dev.yaml b/.github/workflows/build-dev.yaml
index 2a47beab5..1ca17a63e 100644
--- a/.github/workflows/build-dev.yaml
+++ b/.github/workflows/build-dev.yaml
@@ -75,7 +75,7 @@ jobs:
     needs: java-version
     strategy:
       matrix:
-        crypto-type: ["bouncycastle", "gnu"]
+        crypto-type: [bouncycastle, gnu]
     with:
       java-version: ${{ needs.java-version.outputs.java-version }}
       branch: ${{ inputs.branch }}
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index f422b6b87..377c28578 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -1,4 +1,5 @@
 name: Build artifacts
+run-name: Build artifact for ${{ inputs.crypto-type }} ${{ inputs.java-version }}
 
 permissions:
   # This is required for requesting the OIDC token
@@ -41,12 +42,16 @@ on:
         required: true
       GPG_PASS:
         required: true
+      JFROG_OIDC_PROVIDER:
+        required: true
+      JFROG_OIDC_AUDIENCE:
+        required: true
 
 jobs:
   build:
     runs-on: ubuntu-latest
     steps:
-      - name: Checkout client
+      - name: Checkout code
         uses: actions/checkout@v4
         with:
           ref: ${{ inputs.branch }}
@@ -66,8 +71,31 @@ jobs:
           server-tag: ${{ inputs.server-tag }}
           use-server-rc: ${{ inputs.use-server-rc }}
 
+      - name: Get artifact name
+        id: get-artifact-name
+        working-directory: client
+        run: |
+          echo artifact-name=$(mvn help:evaluate -Dexpression=project.build.finalName -q -DforceStdout) >> $GITHUB_OUTPUT
+
+      - name: Get artifact ID
+        id: get-artifact-id
+        working-directory: client
+        run: |
+          echo artifact-id="aerospike-client${{ inputs.crypto-type == 'bouncycastle' && '-bc' || '' }}-jdk${{ inputs.java-version }}" >> $GITHUB_OUTPUT
+
+      - name: Get artifact version
+        id: get-artifact-version
+        working-directory: client
+        run: |
+          echo artifact-version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) >> $GITHUB_OUTPUT
+
       - name: Publish to JFrog
         if: ${{ !cancelled() && inputs.upload-artifacts == true }}
         uses: ./.github/actions/publish-to-jfrog
         with:
           crypto-type: ${{ inputs.crypto-type }}
+          oidc-provider: ${{ secrets.JFROG_OIDC_PROVIDER }}
+          oidc-audience: ${{ secrets.JFROG_OIDC_AUDIENCE }}
+          artifact-name: ${{ steps.get-artifact-name.outputs.artifact-name }}
+          artifact-id: ${{ steps.get-artifact-id.outputs.artifact-id }}
+          artifact-version: ${{ steps.get-artifact-version.outputs.artifact-version }}
diff --git a/.github/workflows/promote-prod.yaml b/.github/workflows/promote-prod.yaml
index 63f03a009..c724cf4aa 100644
--- a/.github/workflows/promote-prod.yaml
+++ b/.github/workflows/promote-prod.yaml
@@ -16,6 +16,7 @@ jobs:
     name: Promot from stage to prod
     uses: ./.github/workflows/promote.yaml
     with:
-      build-number: ${{  inputs.build-number }}
-      target-repository: client-maven-stage-local
+      build-number: ${{ inputs.build-number }}
+      target-repository: clients-maven-stage-local
       target-branch: dev-stage
+    secrets: inherit
diff --git a/.github/workflows/promote-to-stage.yaml b/.github/workflows/promote-to-stage.yaml
index fe52abdf9..6e01bd65a 100644
--- a/.github/workflows/promote-to-stage.yaml
+++ b/.github/workflows/promote-to-stage.yaml
@@ -20,14 +20,25 @@ jobs:
         env:
           JF_URL: ${{ vars.JFROG_PLATFORM_URL }}
         with:
-          oidc-provider-name: ${{ inputs.oidc-provider }}
-          oidc-audience: ${{ inputs.oidc-audience }}
+          oidc-provider-name: ${{ secrets.JFROG_OIDC_PROVIDER }}
+          oidc-audience: ${{ secrets.JFROG_OIDC_AUDIENCE }}
 
       - name: Get info
         id: get-build-info
         run: |
           echo build-info=$(jf rt curl /api/build/clients-java-push-to-dev/${{ inputs.build-number }}) >> $GITHUB_OUTPUT
 
+      - name: Get commit hash from repo
+        id: get-commit-hash
+        run: |
+          echo commit-hash=$(echo '${{ steps.get-build-info.outputs.build-info }}' | jq -r '.buildInfo.vcs[].revision') >> $GITHUB_OUTPUT
+
+      - name: Get build name
+        id: get-build-name
+        run: |
+          echo build-name=$(echo '${{ steps.get-build-info.outputs.build-info }}' | jq -r '.buildInfo.name') >> $GITHUB_OUTPUT
+
       - name: Debug
         run: |
-          echo ${{ steps.get-build-info.outputs.build-info }}
+          echo "commit-hash: '${{ steps.get-commit-hash.outputs.commit-hash }}'"
+          echo "build-name: '${{ steps.get-build-name.outputs.build-name }}'"
diff --git a/.github/workflows/promote.yaml b/.github/workflows/promote.yaml
index 302218397..a8d203b2e 100644
--- a/.github/workflows/promote.yaml
+++ b/.github/workflows/promote.yaml
@@ -4,7 +4,7 @@ on:
   workflow_call:
     inputs:
       build-number:
-        type: number
+        type: string
         description: Build number used to build artifact to be promoted
       target-repository:
         type: string
@@ -25,8 +25,8 @@ jobs:
         env:
           JF_URL: ${{ vars.JFROG_PLATFORM_URL }}
         with:
-          oidc-provider-name: ${{ inputs.oidc-provider }}
-          oidc-audience: ${{ inputs.oidc-audience }}
+          oidc-provider-name: ${{ secrets.JFROG_OIDC_PROVIDER }}
+          oidc-audience: ${{ secrets.JFROG_OIDC_AUDIENCE }}
 
       - name: Get info
         id: get-build-info
@@ -36,25 +36,43 @@ jobs:
       - name: Get commit hash from repo
         id: get-commit-hash
         run: |
-          echo commit-hash=$(steps.get-build-info.outputs.build-info | jq -r '.vcs[].revision') >> $GITHUB_OUTPUT
+          echo commit-hash=$(echo '${{ steps.get-build-info.outputs.build-info }}' | jq -r '.buildInfo.vcs[].revision') >> $GITHUB_OUTPUT
 
-      - name: Get commit hash from repo
+      - name: Get build name
         id: get-build-name
         run: |
-          echo build-name=$(steps.get-build-info.outputs.build-info | jq -r '.name') >> $GITHUB_OUTPUT
+          echo build-name=$(echo '${{ steps.get-build-info.outputs.build-info }}' | jq -r '.buildInfo.name') >> $GITHUB_OUTPUT
 
       - name: Debug
         run: |
-          echo ${{ steps.get-build-info.outputs.build-info }}
-          echo ${{ steps.get-build-info.outputs.build-name }}
+          echo "commit-hash: '${{ steps.get-commit-hash.outputs.commit-hash }}'"
+          echo "build-name: '${{ steps.get-build-name.outputs.build-name }}'"
+
+      # Needed since we are using  actions which are part of the repository
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          # Fetch the whole history to prevent unrelated history errors
+          fetch-depth: "0"
+          ref: ${{ inputs.target-branch }}
+          token: ${{ secrets.CLIENT_BOT_PAT }}
+
+      - name: Fast forward
+        shell: bash
+        run: git merge --ff-only ${{ inputs.ref-to-merge }}
 
-      - name: Merge commit hash from source to target branch
-        uses: ./github/actions/fast-forward-merge
+      - name: Add tagging message
+        uses: stefanzweifel/git-auto-commit-action@v4
         with:
-          ref-to-merge: ${{ steps.get-build-info.outputs.build-info }}
-          base-branch: ${{ inputs.target-branch }}
-          git-bot-token: ${{ secrets.CLIENT_BOT_PAT }}
+          commit_message: "Promote to prod [skip ci]"
+          commit_author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
+          tagging_message: Promote to PROD
+          branch: ${{ inputs.target-branch }}
+
+      - name: Upload changes to remote head branch
+        shell: bash
+        run: git push
 
       - name: Promote build
         run: |
-          jf rt build-promote ${{ steps.get-build-info.outputs.build-name }} ${{ inputs.build-number }} ${{ inputs.target-repository }}
+          jf rt build-promote ${{ steps.get-build-name.outputs.build-name }} ${{ inputs.build-number }} ${{ inputs.target-repository }}
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
index e779b50f1..a0734fccb 100644
--- a/benchmarks/pom.xml
+++ b/benchmarks/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.aerospike</groupId>
     <artifactId>aerospike-parent</artifactId>
-    <version>9.0.2</version>
+    <version>${revision}</version>
   </parent>
   <artifactId>aerospike-benchmarks</artifactId>
   <packaging>jar</packaging>
diff --git a/client/config.json b/client/config.json
new file mode 100644
index 000000000..9963bf030
--- /dev/null
+++ b/client/config.json
@@ -0,0 +1,12 @@
+{
+  "files": [
+    {
+      "pattern": "target/*.jar",
+      "target": "test"
+    },
+    {
+      "pattern": "one",
+      "target": "another"
+    }
+  ]
+}
diff --git a/client/config.template b/client/config.template
new file mode 100644
index 000000000..5638046b9
--- /dev/null
+++ b/client/config.template
@@ -0,0 +1,12 @@
+{
+  "files": [
+    {
+      "pattern": "target/*.jar",
+      "target": ""
+    },
+    {
+      "pattern": "",
+      "target": ""
+    }
+  ]
+}
diff --git a/client/src/resources/bouncy_pom.xml b/client/deploy-resources/bouncycastle_pom.xml
similarity index 98%
rename from client/src/resources/bouncy_pom.xml
rename to client/deploy-resources/bouncycastle_pom.xml
index c32d7bea6..1fc1c059c 100644
--- a/client/src/resources/bouncy_pom.xml
+++ b/client/deploy-resources/bouncycastle_pom.xml
@@ -2,7 +2,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.aerospike</groupId>
   <artifactId>aerospike-client-bc-jdk21</artifactId>
-  <version>9.0.1</version>
+  <version>9.0.2</version>
   <packaging>jar</packaging>
   <name>Aerospike Java Client BC</name>
   <description>Aerospike Java client interface to Aerospike database server. Uses Bouncy Castle crypto library for RIPEMD-160 hashing.</description>
diff --git a/client/src/resources/gnu_pom.xml b/client/deploy-resources/gnu_pom.xml
similarity index 98%
rename from client/src/resources/gnu_pom.xml
rename to client/deploy-resources/gnu_pom.xml
index 3682ae49a..5005254e9 100644
--- a/client/src/resources/gnu_pom.xml
+++ b/client/deploy-resources/gnu_pom.xml
@@ -2,7 +2,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.aerospike</groupId>
   <artifactId>aerospike-client-jdk21</artifactId>
-  <version>9.0.1</version>
+  <version>9.0.2</version>
   <packaging>jar</packaging>
   <name>Aerospike Java Client</name>
   <description>Aerospike Java client interface to Aerospike database server</description>
diff --git a/client/deploy-resources/publish-spec.json.template b/client/deploy-resources/publish-spec.json.template
new file mode 100644
index 000000000..5638046b9
--- /dev/null
+++ b/client/deploy-resources/publish-spec.json.template
@@ -0,0 +1,12 @@
+{
+  "files": [
+    {
+      "pattern": "target/*.jar",
+      "target": ""
+    },
+    {
+      "pattern": "",
+      "target": ""
+    }
+  ]
+}
diff --git a/client/pom.xml b/client/pom.xml
index baa6963c9..7fcc3b768 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -6,9 +6,9 @@
   <parent>
     <groupId>com.aerospike</groupId>
     <artifactId>aerospike-parent</artifactId>
-    <version>9.0.2</version>
+    <version>${revision}</version>
   </parent>
-  <artifactId>aerospike-client-jdk21</artifactId>
+  <artifactId>aerospike-client${crypto.type}-jdk21</artifactId>
   <packaging>jar</packaging>
 
   <name>aerospike-client-jdk21</name>
@@ -114,16 +114,17 @@
                 <phase>install</phase>
                 <goals>
                   <goal>install-file</goal>
-                  </goals>
+                </goals>
                 <configuration>
-                  <pomFile>${project.basedir}/src/resources/bouncy_pom.xml</pomFile>
+                  <pomFile>${project.basedir}/src/resources/bouncycastle_pom.xml</pomFile>
                   <file>target/${project.build.finalName}.jar</file>
                   <groupId>com.aerospike</groupId>
                   <artifactId>aerospike-client${crypto.type}-jdk21</artifactId>
-                  </configuration>
-                </execution>
-              </executions>
-            </plugin>
+                  <generatePom>true</generatePom>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
         </plugins>
       </build>
     </profile>
@@ -183,13 +184,14 @@
                 <phase>install</phase>
                 <goals>
                   <goal>install-file</goal>
-                  </goals>
+                </goals>
                 <configuration>
                   <pomFile>${project.basedir}/src/resources/gnu_pom.xml</pomFile>
                   <file>target/${project.build.finalName}.jar</file>
                   <groupId>com.aerospike</groupId>
                   <artifactId>aerospike-client${crypto.type}-jdk21</artifactId>
-                  </configuration>
+                  <generatePom>true</generatePom>
+                </configuration>
                 </execution>
               </executions>
             </plugin>
@@ -301,7 +303,6 @@
           </sourceFileIncludes>
           </configuration>
         </plugin>
-
     </plugins>
 
   </build>
diff --git a/examples/pom.xml b/examples/pom.xml
index 7e668d44d..8d8da1e34 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.aerospike</groupId>
     <artifactId>aerospike-parent</artifactId>
-    <version>9.0.2</version>
+    <version>${revision}</version>
   </parent>
   <artifactId>aerospike-examples</artifactId>
   <packaging>jar</packaging>
diff --git a/pom.xml b/pom.xml
index fb3e8f36c..4eea320ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
   <groupId>com.aerospike</groupId>
   <artifactId>aerospike-parent</artifactId>
   <name>aerospike-parent</name>
-  <version>9.0.2</version>
+  <version>${revision}</version>
   <packaging>pom</packaging>
   <url>https://github.com/aerospike/aerospike-client-java</url>
 
@@ -29,6 +29,7 @@
   </modules>
 
   <properties>
+    <revision>9.0.2</revision>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
@@ -43,6 +44,7 @@
     <jbcrypt.version>0.4</jbcrypt.version>
     <commons-cli.version>1.9.0</commons-cli.version>
     <junit.version>4.13.1</junit.version>
+    <maven-deploy-plugin.version>3.1.3</maven-deploy-plugin.version>
     <crypto.type></crypto.type>
   </properties>
 
@@ -134,6 +136,31 @@
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
           <version>${maven-javadoc-plugin.version}</version>
+          </plugin>
+
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>flatten-maven-plugin</artifactId>
+          <configuration>
+            <updatePomFile>true</updatePomFile>
+            <flattenMode>resolveCiFriendliesOnly</flattenMode>
+            </configuration>
+          <executions>
+            <execution>
+              <id>flatten</id>
+              <phase>process-resources</phase>
+              <goals>
+                <goal>flatten</goal>
+                </goals>
+              </execution>
+            <execution>
+              <id>flatten.clean</id>
+              <phase>clean</phase>
+              <goals>
+                <goal>clean</goal>
+              </goals>
+            </execution>
+          </executions>
         </plugin>
       </plugins>
     </pluginManagement>
diff --git a/test/pom.xml b/test/pom.xml
index e6d5d0086..8649bb7f7 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>com.aerospike</groupId>
     <artifactId>aerospike-parent</artifactId>
-    <version>9.0.2</version>
+    <version>${revision}</version>
   </parent>
   <artifactId>aerospike-client-test</artifactId>
   <packaging>jar</packaging>