diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..c4e9832f8
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,115 @@
+name: Release new version
+
+on:
+ workflow_dispatch:
+ inputs:
+ push:
+ description: 'Push artifacts to Central and commits to the repository'
+ required: true
+ default: true
+ type: 'boolean'
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ packages: write
+ env:
+ STAGED_REPOSITORY: target/checkout/target/staging-deploy
+
+ steps:
+ - name: Check if release is running from master
+ run: |
+ if [ "${GITHUB_REF}" != "refs/heads/master" ]; then
+ echo "Release is only allowed from master branch"
+ exit 1
+ fi
+
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Install java
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ gpg-private-key: ${{ secrets.JRELEASER_GPG_SECRET_KEY }}
+ gpg-passphrase: MAVEN_GPG_PASSPHRASE
+ cache: 'maven'
+
+ - name: Configure git
+ run: |
+ git config user.name "Airlift Release"
+ git config user.email "airlift-bot@airlift.io"
+
+ - name: Lock branch before release
+ uses: github/lock@v2
+ id: release-lock
+ with:
+ mode: 'lock'
+
+ - name: Run mvn release:prepare
+ env:
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.JRELEASER_GPG_PASSPHRASE }}
+ run: |
+ ./mvnw -B release:prepare -Poss-release,oss-stage
+
+ - name: Determine release version
+ run: |
+ export VERSION=$(grep 'scm.tag=' release.properties | cut -d'=' -f2)
+ echo "VERSION=${VERSION}" >> $GITHUB_ENV
+ echo "Releasing version: ${VERSION}"
+
+ - name: Run mvn release:perform to local staging
+ env:
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.JRELEASER_GPG_PASSPHRASE }}
+ run: |
+ ./mvnw -B release:perform -Poss-release,oss-stage
+
+ - name: Display git status and history
+ run: |
+ git status
+ git log --oneline -n 2
+
+ - name: List locally staged artifacts
+ run: |
+ find ${{ env.STAGED_REPOSITORY }} -type f
+
+ - name: Run JReleaser
+ uses: jreleaser/release-action@v2
+ env:
+ JRELEASER_PROJECT_VERSION: ${{ env.VERSION }}
+ JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ JRELEASER_GPG_PUBLIC_KEY: ${{ vars.JRELEASER_GPG_PUBLIC_KEY }}
+ JRELEASER_GPG_SECRET_KEY: ${{ secrets.JRELEASER_GPG_SECRET_KEY }}
+ JRELEASER_GPG_PASSPHRASE: ${{ secrets.JRELEASER_GPG_PASSPHRASE }}
+ JRELEASER_NEXUS2_MAVEN_CENTRAL_USERNAME: ${{ secrets.JRELEASER_NEXUS2_MAVEN_CENTRAL_USERNAME }}
+ JRELEASER_NEXUS2_MAVEN_CENTRAL_TOKEN: ${{ secrets.JRELEASER_NEXUS2_MAVEN_CENTRAL_TOKEN }}
+ JRELEASER_NEXUS2_END_STAGE: ${{ inputs.push && 'RELEASE' || 'CLOSE' }}
+ JRELEASER_SKIP_RELEASE: ${{ inputs.push && 'false' || 'true' }}
+ with:
+ setup-java: false
+
+ - name: Push git changes
+ if: ${{ inputs.push }}
+ run: |
+ git status
+ git push origin master
+
+ - name: Unlock branch after a release
+ uses: github/lock@v2
+ id: release-unlock
+ with:
+ mode: 'unlock'
+
+ - name: Upload JReleaser logs
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: jreleaser-logs
+ path: |
+ out/jreleaser/trace.log
+ out/jreleaser/output.properties
diff --git a/airbase/pom.xml b/airbase/pom.xml
index 85b595046..14d74dc69 100644
--- a/airbase/pom.xml
+++ b/airbase/pom.xml
@@ -1650,6 +1650,27 @@
+
+
+ oss-stage
+
+
+ local::file:./target/staging-deploy
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+
+
+ false
+
+
+
+
+
+
ci
diff --git a/jreleaser.yml b/jreleaser.yml
new file mode 100644
index 000000000..8f2f0fb38
--- /dev/null
+++ b/jreleaser.yml
@@ -0,0 +1,76 @@
+# Hooks that will run on the CI to generate the summary of the steps
+hooks:
+ condition: '"{{ Env.CI }}" == true'
+ script:
+ before:
+ - filter:
+ includes: ['session']
+ run: |
+ echo "### {{command}}" >> $GITHUB_STEP_SUMMARY
+ echo "| Step | Outcome |" >> $GITHUB_STEP_SUMMARY
+ echo "| ---- | ------- |" >> $GITHUB_STEP_SUMMARY
+ success:
+ - filter:
+ excludes: ['session']
+ run: 'echo "| {{event.name}} | :white_check_mark: |" >> $GITHUB_STEP_SUMMARY'
+ - filter:
+ includes: ['session']
+ run: echo "" >> $GITHUB_STEP_SUMMARY
+ failure:
+ - filter:
+ excludes: ['session']
+ run: 'echo "| {{event.name}} | :x: |" >> $GITHUB_STEP_SUMMARY'
+ - filter:
+ includes: ['session']
+ run: |
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "### Failure" >> $GITHUB_STEP_SUMMARY
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
+ echo "{{event.stacktrace}}\`\`\`" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+
+# Project configuration
+project:
+ name: airbase
+ description: Base POM for Airlift
+ license: Apache-2
+ java:
+ groupId: io.airlift
+ multiProject: true
+
+# Ordered as defined in the https://jreleaser.org/guide/latest/concepts/workflow.html#_full_release
+signing:
+ active: ALWAYS
+ armored: true
+
+# Deploy to OSSRH
+deploy:
+ maven:
+ pomchecker:
+ failOnWarning: false # We don't want to fail the build on warnings
+ failOnError: false # We don't want to fail the build on errors
+ nexus2:
+ maven-central:
+ active: ALWAYS
+ url: https://oss.sonatype.org/service/local
+ snapshotUrl: https://oss.sonatype.org/content/repositories/snapshots/
+ javadocJar: false # Not every module has javadoc (packaging)
+ closeRepository: true
+ releaseRepository: true
+ stagingRepositories:
+ - target/checkout/target/staging-deploy
+
+# Release to Github
+release:
+ github:
+ owner: airlift
+ overwrite: true # if tag already exists, overwrite it
+ skipTag: true # created by the release plugin
+ branch: master
+ uploadAssets: NEVER
+ tagName: '{{projectVersion}}'
+ files: false
+ draft: false
+ releaseNotes:
+ enabled: true
+ configurationFile: .github/release.yml
diff --git a/pom.xml b/pom.xml
index 3b31e80ac..9ce8bef3c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,5 +146,24 @@
+
+ oss-stage
+
+
+ local::file:./target/staging-deploy
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+
+
+ false
+
+
+
+
+