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 + + + + +