diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cf0c428b6..1ecc57cc9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,13 +17,34 @@ name: Release on: - workflow_dispatch: { } + workflow_dispatch: + inputs: + release-version: + required: false + default: '' + description: >- + Release version (e.g. 5.7.0 or 5.7.0-rc.1). + Leave empty to let Maven compute it from the current SNAPSHOT version. + type: string + development-version: + required: false + default: '' + description: >- + Next development version (e.g. 5.8.0-SNAPSHOT). + Leave empty for automatic increment (e.g. 5.7.1-SNAPSHOT or 5.7.0-rc.2-SNAPSHOT). + type: string + dry-run: + required: false + default: false + description: >- + Perform a dry run without pushing changes or creating releases. + type: boolean permissions: { } jobs: - create-release: - name: Create Release + release: + name: Release runs-on: ubuntu-latest timeout-minutes: 15 permissions: @@ -31,72 +52,110 @@ jobs: packages: write # Required to push images to ghcr.io if: "${{ github.repository_owner == 'DependencyTrack' }}" steps: - - name: Checkout Repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 - with: - persist-credentials: false - - name: Set up JDK - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # tag=v5.2.0 - with: - java-version: '21' - distribution: 'temurin' - cache: maven - - name: Set up QEMU - uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # tag=v3.7.0 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # tag=v3.12.0 - with: - install: true - - name: Docker login - uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # tag=v3.6.0 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ github.repository_owner == 'DependencyTrack' && secrets.BOT_IMAGE_PUSH_TOKEN || secrets.GITHUB_TOKEN }} - - name: Perform Release - run: |- - git config user.name "dependencytrack-bot" - git config user.email "106437498+dependencytrack-bot@users.noreply.github.com" - - BUILD_ARGS=( - '-Dcheckstyle.skip' - '-DskipTests' - '-Dquarkus.container-image.registry=ghcr.io' - "-Dquarkus.container-image.group=${GITHUB_REPOSITORY_OWNER,,}" - '-Dquarkus.container-image.additional-tags=latest' - '-Dquarkus.container-image.build=true' - '-Dquarkus.container-image.push=true' - '-Dquarkus.docker.buildx.platform=linux/amd64,linux/arm64' - ) - - mvn -B --no-transfer-progress release:prepare \ - -DpreparationGoals="clean verify" \ - -Darguments="${BUILD_ARGS[*]}" \ - -DpushChanges=false - - name: Push Changes - uses: ad-m/github-push-action@master - with: - branch: ${{ github.ref }} - github_token: ${{ secrets.BOT_RELEASE_TOKEN }} - tags: true - - name: Determine Release Tag - id: determine-release-tag - run: |- - TAG_NAME="$(sed -nr 's/^scm.tag=(v[0-9.]+)$/\1/p' release.properties)" - echo "TAG_NAME=${TAG_NAME}" >> $GITHUB_OUTPUT - - name: Create GitHub Release - env: - GITHUB_TOKEN: "${{ secrets.BOT_RELEASE_TOKEN }}" - run: |- - gh release create "${{ steps.determine-release-tag.outputs.TAG_NAME }}" \ - --target ${{ github.ref_name }} \ - --verify-tag \ - --generate-notes - - name: Upload BOMs to GitHub Release - env: - GITHUB_TOKEN: "${{ secrets.BOT_RELEASE_TOKEN }}" - run: |- - find . -name quarkus-run-cyclonedx.json -exec \ - sh -c 'mv {} "$(echo {} | cut -d "/" -f 2)-${{ steps.determine-release-tag.outputs.TAG_NAME }}.cdx.json"' \; - gh release upload "${{ steps.determine-release-tag.outputs.TAG_NAME }}" \ - ./*.cdx.json --clobber + - name: Checkout Repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + with: + token: ${{ github.repository_owner == 'DependencyTrack' && secrets.BOT_RELEASE_TOKEN || secrets.GITHUB_TOKEN }} + fetch-depth: 0 + + - name: Set up JDK + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # tag=v5.2.0 + with: + distribution: 'temurin' + java-version: '21' + cache: 'maven' + + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # tag=v3.7.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # tag=v3.12.0 + with: + install: true + + - name: Docker login + if: ${{ !inputs.dry-run }} + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # tag=v3.6.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ github.repository_owner == 'DependencyTrack' && secrets.BOT_IMAGE_PUSH_TOKEN || secrets.GITHUB_TOKEN }} + + - name: Configure Git + run: | + git config user.name "dependencytrack-bot" + git config user.email "106437498+dependencytrack-bot@users.noreply.github.com" + + - name: Perform Maven Release + run: |- + MAVEN_ARGS="-B" + if [[ -n "${{ inputs.release-version }}" ]]; then + MAVEN_ARGS="${MAVEN_ARGS} -DreleaseVersion=${{ inputs.release-version }}" + fi + if [[ -n "${{ inputs.development-version }}" ]]; then + MAVEN_ARGS="${MAVEN_ARGS} -DdevelopmentVersion=${{ inputs.development-version }}" + fi + if [[ "${{ inputs.dry-run }}" == "true" ]]; then + MAVEN_ARGS="${MAVEN_ARGS} -DdryRun=true" + fi + export MAVEN_ARGS + + IS_PRERELEASE="false" + if [[ -n "${{ inputs.release-version }}" ]]; then + if [[ "${{ inputs.release-version }}" == *-* ]]; then + IS_PRERELEASE="true" + fi + else + CURRENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) + RELEASE_VERSION="${CURRENT_VERSION%-SNAPSHOT}" + if [[ "${RELEASE_VERSION}" == *-* ]]; then + IS_PRERELEASE="true" + fi + fi + + BUILD_ARGS=( + "-Dquarkus.container-image.group=${GITHUB_REPOSITORY_OWNER,,}" + '-Dquarkus.container-image.build=true' + '-Dquarkus.docker.buildx.platform=linux/amd64,linux/arm64' + ) + + if [[ "${IS_PRERELEASE}" != "true" ]]; then + BUILD_ARGS+=('-Dquarkus.container-image.additional-tags=latest') + fi + + if [[ "${{ inputs.dry-run }}" == "true" ]]; then + BUILD_ARGS+=('-Dquarkus.container-image.push=false') + else + BUILD_ARGS+=('-Dquarkus.container-image.push=true') + fi + + mvn release:prepare -Darguments="${BUILD_ARGS[*]}" + + - name: Create GitHub Release + if: ${{ !inputs.dry-run }} + env: + GITHUB_TOKEN: "${{ secrets.BOT_RELEASE_TOKEN }}" + run: | + RELEASE_VERSION=$(git describe --tags --abbrev=0) + echo "Release version: ${RELEASE_VERSION}" + + PRERELEASE_FLAG="" + if [[ "${RELEASE_VERSION}" == *-* ]]; then + PRERELEASE_FLAG="--prerelease" + fi + + gh release create "${RELEASE_VERSION}" \ + --generate-notes \ + ${PRERELEASE_FLAG} + + - name: Upload BOMs to GitHub Release + if: ${{ !inputs.dry-run }} + env: + GITHUB_TOKEN: "${{ secrets.BOT_RELEASE_TOKEN }}" + run: |- + RELEASE_VERSION=$(git describe --tags --abbrev=0) + while IFS= read -r -d '' bom; do + MODULE=$(echo "${bom}" | cut -d "/" -f 2) + mv "${bom}" "${MODULE}-${RELEASE_VERSION}.cdx.json" + done < <(find . -name quarkus-run-cyclonedx.json -print0) + gh release upload "${RELEASE_VERSION}" ./*.cdx.json --clobber diff --git a/pom.xml b/pom.xml index 70068a71c..1ca442302 100644 --- a/pom.xml +++ b/pom.xml @@ -471,9 +471,14 @@ maven-release-plugin 3.3.1 + @{project.version} true - SemVerVersionPolicy - v@{project.version} + true + true + quick + clean verify -Pquick + clean + false