Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java: Update workflow to zip bundle files and use build-matrix.json #2128

Merged
merged 6 commits into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/json_matrices/build-matrix.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
"RUNNER": "ubuntu-latest",
"ARCH": "x64",
"TARGET": "x86_64-unknown-linux-gnu",
"PACKAGE_MANAGERS": ["pypi", "npm"]
"PACKAGE_MANAGERS": ["pypi", "npm", "maven"]
},
{
"OS": "ubuntu",
"NAMED_OS": "linux",
"RUNNER": ["self-hosted", "Linux", "ARM64"],
"ARCH": "arm64",
"TARGET": "aarch64-unknown-linux-gnu",
"PACKAGE_MANAGERS": ["pypi", "npm"],
"PACKAGE_MANAGERS": ["pypi", "npm", "maven"],
"CONTAINER": "2_28"
},
{
Expand All @@ -22,15 +22,15 @@
"RUNNER": "macos-12",
"ARCH": "x64",
"TARGET": "x86_64-apple-darwin",
"PACKAGE_MANAGERS": ["pypi", "npm"]
"PACKAGE_MANAGERS": ["pypi", "npm", "maven"]
},
{
"OS": "macos",
"NAMED_OS": "darwin",
"RUNNER": "macos-latest",
"ARCH": "arm64",
"TARGET": "aarch64-apple-darwin",
"PACKAGE_MANAGERS": ["pypi", "npm"]
"PACKAGE_MANAGERS": ["pypi", "npm", "maven"]
},
{
"OS": "ubuntu",
Expand Down
227 changes: 162 additions & 65 deletions .github/workflows/java-cd.yml
Original file line number Diff line number Diff line change
@@ -1,77 +1,76 @@
name: Java Prepare Deployment

on:
pull_request:
paths:
- .github/workflows/java-cd.yml
- .github/workflows/install-shared-dependencies/action.yml
- .github/workflows/start-self-hosted-runner/action.yml
- .github/json_matrices/build-matrix.json
push:
tags:
- "v*.*"
workflow_dispatch:
inputs:
version:
description: 'The release version of GLIDE, formatted as *.*.* or *.*.*-rc*'
required: true
inputs:
version:
description: "The release version of GLIDE, formatted as *.*.* or *.*.*-rc*"
required: true
maven_publish:
description: "Publish to Maven Central"
required: true
type: boolean

concurrency:
group: java-cd-${{ github.head_ref || github.ref }}
cancel-in-progress: true

permissions:
id-token: write
id-token: write

jobs:
start-self-hosted-runner:
if: github.repository_owner == 'valkey-io'
load-platform-matrix:
runs-on: ubuntu-latest
environment: AWS_ACTIONS
outputs:
PLATFORM_MATRIX: ${{ steps.load-platform-matrix.outputs.PLATFORM_MATRIX }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Start self hosted EC2 runner
uses: ./.github/workflows/start-self-hosted-runner
with:
role-to-assume: ${{ secrets.ROLE_TO_ASSUME }}
aws-region: ${{ secrets.AWS_REGION }}
ec2-instance-id: ${{ secrets.AWS_EC2_INSTANCE_ID }}
- name: Checkout
uses: actions/checkout@v4

- name: load-platform-matrix
id: load-platform-matrix
shell: bash
run: |
# Get the matrix from the matrix.json file, without the object that has the IMAGE key
export "PLATFORM_MATRIX=$(jq 'map(select(.PACKAGE_MANAGERS | contains(["maven"])))' < .github/json_matrices/build-matrix.json | jq -c .)"
echo "PLATFORM_MATRIX=${PLATFORM_MATRIX}" >> $GITHUB_OUTPUT

set-release-version:
runs-on: ubuntu-latest
outputs:
RELEASE_VERSION: ${{ steps.release-version.outputs.RELEASE_VERSION }}
steps:
- name: Set the release version
id: release-version
shell: bash
run: |
if ${{ github.event_name == 'workflow_dispatch' }}; then
R_VERSION="${{ env.INPUT_VERSION }}"
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
else
R_VERSION=${GITHUB_REF:11}
fi
echo "RELEASE_VERSION=${R_VERSION}" >> $GITHUB_ENV
echo "Release version detected: $R_VERSION"
echo "RELEASE_VERSION=$R_VERSION" >> $GITHUB_OUTPUT
env:
INPUT_VERSION: ${{ github.event.inputs.version }}

create-binaries-to-publish:
needs: start-self-hosted-runner
needs: [set-release-version, load-platform-matrix]
if: github.repository_owner == 'valkey-io'
timeout-minutes: 35
env:
JAVA_VERSION: '11'
JAVA_VERSION: "11"
RELEASE_VERSION: ${{ needs.set-release-version.outputs.RELEASE_VERSION }}
strategy:
# Run all jobs
fail-fast: false
matrix:
host:
- {
OS: ubuntu,
RUNNER: ubuntu-latest,
TARGET: x86_64-unknown-linux-gnu,
}
- {
OS: ubuntu,
RUNNER: ["self-hosted", "Linux", "ARM64"],
TARGET: aarch64-unknown-linux-gnu,
}
- {
OS: macos,
RUNNER: macos-12,
TARGET: x86_64-apple-darwin,
}
- {
OS: macos,
RUNNER: macos-latest,
TARGET: aarch64-apple-darwin,
}
host: ${{ fromJson(needs.load-platform-matrix.outputs.PLATFORM_MATRIX) }}

runs-on: ${{ matrix.host.RUNNER }}

Expand All @@ -86,27 +85,10 @@ jobs:
else
echo "No cleaning needed"
fi

- uses: actions/checkout@v4
with:
submodules: recursive

- name: Set the release version
shell: bash
run: |
if ${{ github.event_name == 'pull_request' }}; then
R_VERSION="255.255.255"
elif ${{ github.event_name == 'workflow_dispatch' }}; then
R_VERSION="${{ env.INPUT_VERSION }}"
else
R_VERSION=${GITHUB_REF:11}
fi
echo "RELEASE_VERSION=${R_VERSION}" >> $GITHUB_ENV
echo "Release version detected: $R_VERSION"
env:
EVENT_NAME: ${{ github.event_name }}
INPUT_VERSION: ${{ github.event.inputs.version }}

- name: Set up JDK
uses: actions/setup-java@v4
with:
Expand Down Expand Up @@ -137,7 +119,8 @@ jobs:
- name: Build java client
working-directory: java
run: |
./gradlew :client:publishToMavenLocal -Psigning.secretKeyRingFile=secring.gpg -Psigning.password="${{ secrets.GPG_PASSWORD }}" -Psigning.keyId=${{ secrets.GPG_KEY_ID }}
./gradlew :client:publishToMavenLocal -Psigning.secretKeyRingFile=secring.gpg \
-Psigning.password="${{ secrets.GPG_PASSWORD }}" -Psigning.keyId=${{ secrets.GPG_KEY_ID }}
env:
GLIDE_RELEASE_VERSION: ${{ env.RELEASE_VERSION }}

Expand All @@ -158,3 +141,117 @@ jobs:
name: java-${{ matrix.host.TARGET }}
path: |
java/bundle*.jar

publish-to-maven-central-deployment:
if: ${{ inputs.maven_publish == true || github.event_name == 'push' }}
acarbonetto marked this conversation as resolved.
Show resolved Hide resolved
needs: [set-release-version, create-binaries-to-publish]
runs-on: ubuntu-latest
outputs:
DEPLOYMENT_ID: ${{ steps.maven-deployment.outputs.DEPLOYMENT_ID }}
env:
RELEASE_VERSION: ${{ needs.set-release-version.outputs.RELEASE_VERSION }}
steps:
- name: Download published artifacts
uses: actions/download-artifact@v4

- name: Move all required files to one directory
run: |
mkdir maven-files
cd maven-files
for file in $(find ../. -name "*.jar"); do jar xf "$file" ; done

- name: Generate sha1 and md5 files for all Maven files
run: |
cd maven-files
for i in *.jar *.pom *.module; do md5sum $i | cut -d ' ' -f 1 > $i.md5; done
for i in *.jar *.pom *.module; do sha1sum $i | cut -d ' ' -f 1 > $i.sha1; done

- name: Move files to the correct directory tree
run: |
mkdir -p build/io/valkey/valkey-glide/${{ env.RELEASE_VERSION }}
cp -a maven-files/* build/io/valkey/valkey-glide/${{ env.RELEASE_VERSION }}
rm -rf build/io/valkey/valkey-glide/${{ env.RELEASE_VERSION }}/META-INF
cd build
zip -r ../build io

- name: Upload bundle to CI artifacts
uses: actions/upload-artifact@v4
with:
name: valkey-${{ env.RELEASE_VERSION }}
path: |
build

- name: Publish to Maven Central
id: maven-deployment
run: |
export DEPLOYMENT_ID=`curl --request POST \
-u "${{ secrets.CENTRAL_TOKEN_USERNAME }}:${{ secrets.CENTRAL_TOKEN_PASSWORD }}" \
--form bundle=@build.zip \
https://central.sonatype.com/api/v1/publisher/upload | tail -n 1`
echo "DEPLOYMENT_ID=$DEPLOYMENT_ID" >> $GITHUB_ENV
echo "DEPLOYMENT_ID=$DEPLOYMENT_ID" >> $GITHUB_OUTPUT
GumpacG marked this conversation as resolved.
Show resolved Hide resolved
echo Uploaded to Maven deployment with deployment ID $DEPLOYMENT_ID. Will be released if smoke tests pass and approved for release.

- name: Check status of deployment
run: |
for ((retries = 0; retries < 20; retries++)); do
sleep 5
export DEPLOYMENT_STATUS=`curl --request POST \
-u "${{ secrets.CENTRAL_TOKEN_USERNAME }}:${{ secrets.CENTRAL_TOKEN_PASSWORD }}" \
"https://central.sonatype.com/api/v1/publisher/status?id=${{ env.DEPLOYMENT_ID }}" \
| jq '.deploymentState'`

if [[ $DEPLOYMENT_STATUS == ""\"VALIDATED"\"" ]]; then exit 0; fi
done

curl --request POST \
-u "${{ secrets.CENTRAL_TOKEN_USERNAME }}:${{ secrets.CENTRAL_TOKEN_PASSWORD }}" \
"https://central.sonatype.com/api/v1/publisher/status?id=${{ env.DEPLOYMENT_ID }}" \
| jq
echo "Deployment ${{ env.DEPLOYMENT_ID }} was unsuccessful with status $DEPLOYMENT_STATUS"
exit 1

- uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "11"

- name: Install protoc (protobuf)
uses: arduino/setup-protoc@v3
with:
version: "26.1"
acarbonetto marked this conversation as resolved.
Show resolved Hide resolved
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Test deployment
working-directory: java
run: |
export ORG_GRADLE_PROJECT_centralManualTestingAuthHeaderName="Authorization"
export ORG_GRADLE_PROJECT_centralManualTestingAuthHeaderValue="Bearer $(echo "${{ secrets.CENTRAL_TOKEN_USERNAME }}:${{ secrets.CENTRAL_TOKEN_PASSWORD }}" | base64)"
export GLIDE_RELEASE_VERSION=${{ env.RELEASE_VERSION }}
./gradlew :benchmarks:run --args="--minimal --clients glide"

- name: Drop deployment if validation fails
if: ${{ failure() }}
run: |
curl --request DELETE \
-u "${{ secrets.CENTRAL_TOKEN_USERNAME }}:${{ secrets.CENTRAL_TOKEN_PASSWORD }}" \
"https://central.sonatype.com/api/v1/publisher/deployment/${{ env.DEPLOYMENT_ID }}"

publish-release-to-maven:
if: ${{ inputs.maven_publish == true || github.event_name == 'push' }}
needs: [publish-to-maven-central-deployment]
runs-on: ubuntu-latest
environment: AWS_ACTIONS
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
env:
DEPLOYMENT_ID: ${{ needs.publish-to-maven-central-deployment.outputs.DEPLOYMENT_ID }}
steps:
- name: Publish to Maven
run: |
curl --request POST \
-u "${{ secrets.CENTRAL_TOKEN_USERNAME }}:${{ secrets.CENTRAL_TOKEN_PASSWORD }}" \
"https://central.sonatype.com/api/v1/publisher/deployment/${{ env.DEPLOYMENT_ID }}"
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@
* Java: `XRange`/`XRevRange` should return `null` instead of `GlideException` when given a negative count ([#1920](https://github.com/valkey-io/valkey-glide/pull/1920))
* Python: Fix `XClaim` return type to `List[bytes]` instead of `List[TEncodable]` ([#2075](https://github.com/valkey-io/valkey-glide/pull/2075))

### Operational Enhancements
* CI/CD: Add workflow for automating Maven release ([#2128](https://github.com/valkey-io/valkey-glide/pull/2128))

## 1.0.0 (2024-07-09)

#### Changes
Expand Down
14 changes: 12 additions & 2 deletions java/benchmarks/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@ repositories {
}

dependencies {
implementation project(':client')
def releaseVersion = System.getenv("GLIDE_RELEASE_VERSION");

if (releaseVersion) {
implementation "io.valkey:valkey-glide:" + releaseVersion
Yury-Fridlyand marked this conversation as resolved.
Show resolved Hide resolved
} else {
implementation project(':client')
}

// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation 'com.google.guava:guava:32.1.1-jre'
Expand All @@ -26,5 +32,9 @@ run.dependsOn ':client:buildRustRelease'
application {
// Define the main class for the application.
mainClass = 'glide.benchmarks.BenchmarkingApp'
applicationDefaultJvmArgs = ['-Djava.library.path=../target/release']
// Runs for GITHUB_ACTIONS for testing release Maven deployment. Force benchmarks to use glide-rs from Maven Central
// deployments.
if (!System.getenv("ORG_GRADLE_PROJECT_centralManualTestingAuthHeaderName")) {
GumpacG marked this conversation as resolved.
Show resolved Hide resolved
applicationDefaultJvmArgs = ['-Djava.library.path=../target/release']
}
}
11 changes: 11 additions & 0 deletions java/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@ repositories {

subprojects {
repositories {
// Runs for GITHUB_ACTIONS for testing release Maven deployment.
if(System.getenv("ORG_GRADLE_PROJECT_centralManualTestingAuthHeaderName")) {
maven {
name = "centralManualTesting"
url "https://central.sonatype.com/api/v1/publisher/deployments/download/"
credentials(HttpHeaderCredentials)
authentication {
header(HttpHeaderAuthentication)
}
}
}
mavenCentral()
}
// minimal java compatibility level
Expand Down
Loading