# The contents of this file are subject to the terms of the Common Development and # Distribution License (the License). You may not use this file except in compliance with the # License. # # You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the # specific language governing permission and limitations under the License. # # When distributing Covered Software, include this CDDL Header Notice in each file and include # the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL # Header, with the fields enclosed by brackets [] replaced by your own identifying # information: "Portions copyright [year] [name of copyright owner]". # # Copyright 2022-2026 3A Systems, LLC. name: Release on: workflow_dispatch: inputs: releaseVersion: description: "Default version to use when preparing a release." required: true default: "X.Y.Z" developmentVersion: description: "Default version to use for new local working copy." required: true default: "X.Y.Z-SNAPSHOT" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false permissions: contents: read jobs: release-maven: runs-on: 'ubuntu-latest' # contents: write is required to push the release commits and tags produced by # maven-release-plugin, to create the GitHub release and to update the wiki. permissions: contents: write steps: - name: Print github context env: GITHUB_CONTEXT: ${{ toJSON(github) }} run: echo "$GITHUB_CONTEXT" - name: Install rpm for distribution shell: bash run: | sudo apt-get update sudo apt-get install -y rpm - uses: actions/checkout@v6 with: fetch-depth: 0 submodules: recursive - name: Set up Java for publishing to Maven Central Repository OSS uses: actions/setup-java@v5 with: java-version: ${{ github.event.workflow_run.head_branch == 'sustaining/4.10.x' && '8' || '11'}} distribution: 'temurin' server-id: ossrh server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD - name: Cache Maven packages uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-m2-repository-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-m2-repository - name: Install gpg secret key env: GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} if: ${{ env.GPG_PRIVATE_KEY!=''}} run: | cat <(echo -e "${{ secrets.GPG_PRIVATE_KEY }}") | gpg --batch --import gpg --list-secret-keys --keyid-format LONG git config --global user.signingkey B02611B009E5302EB58D102D6C2EDF3C90D33841 - name: Configure Git User run: | git config --global user.name "Open Identity Platform Community" git config --global user.email "open-identity-platform-opendj@googlegroups.com" - name: Release and publish to the Maven Central Repository env: GITHUB_ACTOR: ${{ github.actor }} GITHUB_TOKEN: ${{ github.token }} MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }} MAVEN_OPTS: -Dhttps.protocols=TLSv1.2 -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.requestSentEnabled=true -Dmaven.wagon.http.retryHandler.count=10 if: ${{ env.MAVEN_USERNAME!='' && env.MAVEN_PASSWORD!='' }} run: mvn --batch-mode -Darguments="-Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }}" -DsignTag=true -DtagNameFormat="${{ github.event.inputs.releaseVersion }}" -DreleaseVersion=${{ github.event.inputs.releaseVersion }} -DdevelopmentVersion=${{ github.event.inputs.developmentVersion }} release:prepare release:perform --file pom.xml # Hand the just-released server zip to the release-msi job (the MSI can only be # built on Windows), so it does not have to rebuild opendj-server-legacy. - name: Upload the server zip for the MSI job continue-on-error: true uses: actions/upload-artifact@v7 with: name: release-server-zip retention-days: 1 path: target/checkout/opendj-server-legacy/target/package/*.zip # A missing zip means release-msi cannot build: fail this step (the job keeps # going thanks to continue-on-error, but the loss is visible). if-no-files-found: error - name: Release on GitHub uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 with: name: ${{ github.event.inputs.releaseVersion }} tag_name: ${{ github.event.inputs.releaseVersion }} draft: false prerelease: false fail_on_unmatched_files: false generate_release_notes: true files: | target/checkout/opendj-server-legacy/target/package/*.zip target/checkout/opendj-ldap-toolkit/target/*.zip target/checkout/opendj-packages/opendj-deb/opendj-deb-standard/target/*.deb target/checkout/opendj-packages/opendj-rpm/opendj-rpm-standard/target/rpm/opendj/RPMS/noarch/*.rpm target/checkout/opendj-packages/opendj-docker/target/Dockerfile.zip target/checkout/opendj-packages/opendj-openshift-template/*.yaml target/checkout/opendj-doc-generated-ref/target/*.zip target/checkout/opendj-dsml-servlet/target/*.war target/checkout/opendj-rest2ldap-servlet/target/*.war - uses: actions/checkout@v6 continue-on-error: true with: repository: ${{ github.repository }}.wiki path: ${{ github.event.repository.name }}.wiki fetch-depth: 0 - name: Publish docs to wiki continue-on-error: true shell: bash env: GITHUB_ACTOR: ${{ github.actor }} GITHUB_TOKEN: ${{ github.token }} run: | cd ${{ github.event.repository.name }}.wiki rm -rf asciidoc mkdir asciidoc cp -R ../target/checkout/opendj-doc-generated-ref/target/asciidoc/pdf ../${{ github.event.repository.name }}.wiki/asciidoc git add -A git commit -a -m "upload docs after release ${{ github.event.inputs.releaseVersion }}" git tag -f ${{ github.event.inputs.releaseVersion }} git push --quiet --force git push --quiet --force origin ${{ github.event.inputs.releaseVersion }} - uses: actions/checkout@v6 continue-on-error: true with: repository: OpenIdentityPlatform/doc.openidentityplatform.org path: doc.openidentityplatform.org token: ${{ secrets.OIP_PAT_GH_TOKEN }} - name: Publish docs to site continue-on-error: true shell: bash run: | export REPO_NAME_LC=$(echo '${{github.event.repository.name}}' | tr '[:upper:]' '[:lower:]') export SITE_DOC_FOLDER=${REPO_NAME_LC}-doc-generated-ref export TAG_NAME='${{github.event.repository.name}}-${{ github.event.inputs.releaseVersion }}' cd doc.openidentityplatform.org git tag -f ${TAG_NAME} git push --quiet --force origin ${TAG_NAME} # The MSI can only be built on Windows. Reuses the server zip built by release-maven # (installed into the local repo), so only the opendj-msi-standard module is built here. # continue-on-error: an MSI failure must not break the release. release-msi: name: Windows MSI release runs-on: 'windows-latest' continue-on-error: true # contents: write is required by action-gh-release to attach the MSI to the release; # the workflow-level default above is contents: read. permissions: contents: write needs: - release-maven steps: - uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.releaseVersion }} submodules: recursive - name: Set up Java uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' # restore, not the full cache action: the install:install-file below puts a # dependency-less generated pom for opendj-server-legacy into the local repository, # and saving that under the key build-maven restores from would seed every later # Windows build with it. - name: Cache Maven packages uses: actions/cache/restore@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-m2-repository-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-m2-repository - name: Setup WiX (.NET tool) shell: bash run: | echo "DOTNET_ROLL_FORWARD=Major" >> "$GITHUB_ENV" export DOTNET_ROLL_FORWARD=Major dotnet tool install --global wix --version 5.0.2 || dotnet tool update --global wix --version 5.0.2 echo "$HOME/.dotnet/tools" >> "$GITHUB_PATH" export PATH="$HOME/.dotnet/tools:$PATH" wix --version wix extension add -g WixToolset.UI.wixext/5.0.2 || true - name: Download the server zip built by release-maven uses: actions/download-artifact@v8 with: name: release-server-zip path: server-zip - name: Install the server zip into the local Maven repository shell: bash run: | # The artifact carries both zips and the slim one sorts first ('-' < '.'), so # filter it out: the slim zip lacks the JDBC/Cassandra backend drivers and the # MSI must be packaged from the full server zip. ZIP=$(ls server-zip/*.zip | grep -v -- '-slim\.zip$' | head -1) echo "Installing $ZIP as opendj-server-legacy:${{ github.event.inputs.releaseVersion }}:zip" mvn --batch-mode install:install-file -Dfile="$ZIP" \ -DgroupId=org.openidentityplatform.opendj -DartifactId=opendj-server-legacy \ -Dversion=${{ github.event.inputs.releaseVersion }} -Dpackaging=zip - name: Build the MSI (packaging only, no rebuild) env: MAVEN_OPTS: -Dhttps.protocols=TLSv1.2 -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.requestSentEnabled=true -Dmaven.wagon.http.retryHandler.count=10 # -P: do not rely on the wix.exe file-activation of distribution-windows-msi. The # profile now lives in opendj-msi-standard and wraps its , and the module is # part of every reactor, so -pl always resolves it; what -P buys is forcing the # plugins on when wix.exe is not under %USERPROFILE%\.dotnet\tools. Without it this # builds a pom that produces nothing, and fail_on_unmatched_files below is the only # symptom - the job's continue-on-error swallows everything else. run: mvn --batch-mode --errors -DskipTests package -pl :opendj-msi-standard -Pdistribution-windows-msi --file pom.xml - name: Attach the MSI to the GitHub release uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 with: tag_name: ${{ github.event.inputs.releaseVersion }} fail_on_unmatched_files: true files: opendj-packages/opendj-msi/opendj-msi-standard/target/*.msi release-docker: name: Docker release runs-on: 'ubuntu-latest' needs: - release-maven # packages: write is required for the GHCR login that authenticates with GITHUB_TOKEN. permissions: contents: read packages: write steps: - uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.releaseVersion }} fetch-depth: 1 submodules: recursive - name: Docker meta id: meta uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0 with: images: | ${{ github.repository }} ghcr.io/${{ github.repository }}/${{ github.event.repository.name }} tags: | type=raw,value=latest type=raw,value=${{ github.event.inputs.releaseVersion }} - name: Set up QEMU uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 - name: Login to DockerHub uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to GHCR uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push image uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0 continue-on-error: true with: context: ./opendj-packages/opendj-docker file: ./opendj-packages/opendj-docker/Dockerfile build-args: | VERSION=${{ github.event.inputs.releaseVersion }} platforms: linux/amd64, linux/arm64/8, linux/ppc64le, linux/s390x, linux/riscv64 #, linux/arm/v7 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} release-docker-alpine: name: Docker release runs-on: 'ubuntu-latest' needs: - release-maven # packages: write is required for the GHCR login that authenticates with GITHUB_TOKEN. permissions: contents: read packages: write steps: - uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.releaseVersion }} fetch-depth: 1 submodules: recursive - name: Docker meta id: meta uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0 with: images: | ${{ github.repository }} ghcr.io/${{ github.repository }}/${{ github.event.repository.name }} tags: | type=raw,value=alpine type=raw,value=${{ github.event.inputs.releaseVersion }}-alpine - name: Set up QEMU uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 - name: Login to DockerHub uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to GHCR uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push image continue-on-error: true uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0 with: context: ./opendj-packages/opendj-docker file: ./opendj-packages/opendj-docker/Dockerfile-alpine build-args: | VERSION=${{ github.event.inputs.releaseVersion }} platforms: linux/amd64, linux/arm64/8, linux/s390x, linux/ppc64le, linux/386, linux/riscv64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}