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/github-release/action.yaml b/.github/actions/github-release/action.yaml new file mode 100644 index 000000000..c987d3b9b --- /dev/null +++ b/.github/actions/github-release/action.yaml @@ -0,0 +1,56 @@ +name: Create github release +description: Creates a github release + +inputs: + artifact-version: + description: "" + required: true + github-token: + description: "" + required: true + +runs: + using: composite + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Get previous tag + shell: bash + id: get-prev-tag + run: | + # Fetch all tags + git fetch --tags + echo "previous-tag=$(git tag --sort=-creatordate | sed -n '1p')" >> $GITHUB_OUTPUT + + # Extract commit messages between previous tag and the current tag. + - name: Get release notes + shell: bash + id: release-notes + run: | + notes=$(git log "${{steps.get-previous-tag.outputs.previous-tag }}..HEAD" --pretty=format:"%s" --no-merges) + + # GitHub Actions requires that multiline output is escaped: + notes="${notes//'%'/'%25'}" + notes="${notes//$'\n'/'%0A'}" + notes="${notes//$'\r'/'%0D'}" + + echo "notes=$notes" >> $GITHUB_OUTPUT + + - name: Debug + shell: bash + run: | + echo "artifact-version: ${{ inputs.artifact-version }}" + echo "body: ${{ steps.release-notes.outputs.notes }}" + + # Create a new release using GitHub's built-in action + #- name: Create GitHub Release + # uses: actions/create-release@v1 + # env: + # GITHUB_TOKEN: ${{ inputs.github-token }} + # with: + # tag_name: ${{ inputs.artifact-version }} + # release_name: ${{ inputs.artifact-version }} + # body: ${{ steps.release-notes.outputs.notes }} + # draft: false + # prerelease: false diff --git a/.github/actions/publish-to-jfrog/action.yaml b/.github/actions/publish-to-jfrog/action.yaml index 68f8a7654..821128395 100644 --- a/.github/actions/publish-to-jfrog/action.yaml +++ b/.github/actions/publish-to-jfrog/action.yaml @@ -13,40 +13,77 @@ 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: 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..a0df97ca0 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,37 @@ jobs: server-tag: ${{ inputs.server-tag }} use-server-rc: ${{ inputs.use-server-rc }} + - name: Generate docs and sources if release + if: ${{ inputs.upload-artifacts == true }} + working-directory: client + run: | + mvn source:jar javadoc:jar + + - 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..536f6d2de 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,55 @@ 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 }} + + - 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: Create GitHub release + uses: ./.github/actions/github-release + with: + artifact-version: ${{ steps.get-artifact-version.outputs.artifact-version }} + github-token: ${{ secrets.GITHUB_TOKEN }} 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 @@ com.aerospike aerospike-parent - 9.0.2 + ${revision} aerospike-benchmarks jar 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 @@ 4.0.0 com.aerospike aerospike-client-bc-jdk21 - 9.0.1 + 9.0.2 jar Aerospike Java Client BC Aerospike Java client interface to Aerospike database server. Uses Bouncy Castle crypto library for RIPEMD-160 hashing. 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 @@ 4.0.0 com.aerospike aerospike-client-jdk21 - 9.0.1 + 9.0.2 jar Aerospike Java Client Aerospike Java client interface to Aerospike database server 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..3dd615a7f 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -6,9 +6,9 @@ com.aerospike aerospike-parent - 9.0.2 + ${revision} - aerospike-client-jdk21 + aerospike-client${crypto.type}-jdk21 jar aerospike-client-jdk21 @@ -114,16 +114,17 @@ install install-file - + - ${project.basedir}/src/resources/bouncy_pom.xml + ${project.basedir}/deploy-resources/bouncycastle_pom.xml target/${project.build.finalName}.jar com.aerospike aerospike-client${crypto.type}-jdk21 - - - - + true + + + + @@ -183,13 +184,14 @@ install install-file - + - ${project.basedir}/src/resources/gnu_pom.xml + ${project.basedir}/deploy-resources/gnu_pom.xml target/${project.build.finalName}.jar com.aerospike aerospike-client${crypto.type}-jdk21 - + true + @@ -301,7 +303,6 @@ - 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 @@ com.aerospike aerospike-parent - 9.0.2 + ${revision} aerospike-examples jar diff --git a/pom.xml b/pom.xml index fb3e8f36c..4eea320ed 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.aerospike aerospike-parent aerospike-parent - 9.0.2 + ${revision} pom https://github.com/aerospike/aerospike-client-java @@ -29,6 +29,7 @@ + 9.0.2 UTF-8 UTF-8 @@ -43,6 +44,7 @@ 0.4 1.9.0 4.13.1 + 3.1.3 @@ -134,6 +136,31 @@ org.apache.maven.plugins maven-javadoc-plugin ${maven-javadoc-plugin.version} + + + + org.codehaus.mojo + flatten-maven-plugin + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + 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 @@ com.aerospike aerospike-parent - 9.0.2 + ${revision} aerospike-client-test jar