diff --git a/.github/scripts/update-website.sh b/.github/scripts/update-website.sh
new file mode 100644
index 000000000..8fa989a1d
--- /dev/null
+++ b/.github/scripts/update-website.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+#
+# Copyright MapStruct Authors.
+#
+# Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+#
+
+# env vars:
+# VERSION
+# GH_BOT_EMAIL
+
+# This script has been inspired by the JReleaser update-website.sh (https://github.com/jreleaser/jreleaser/blob/main/.github/scripts/update-website.sh)
+set -e
+
+function computePlainVersion() {
+ echo $1 | sed 's/\([[:digit:]]*\)\.\([[:digit:]]*\)\.\([[:digit:]]*\).*/\1.\2.\3/'
+}
+
+function computeMajorMinorVersion() {
+ echo $1 | sed 's/\([[:digit:]]*\)\.\([[:digit:]]*\).*/\1.\2/'
+}
+
+function isStable() {
+ local PLAIN_VERSION=$(computePlainVersion $1)
+ if [ "${PLAIN_VERSION}" == "$1" ]; then
+ echo "yes"
+ else
+ echo "no"
+ fi
+}
+
+STABLE=$(isStable $VERSION)
+MAJOR_MINOR_VERSION=$(computeMajorMinorVersion $VERSION)
+
+DEV_VERSION=`grep devVersion config.toml | sed 's/.*"\(.*\)"/\1/'`
+MAJOR_MINOR_DEV_VERSION=$(computeMajorMinorVersion $DEV_VERSION)
+STABLE_VERSION=`grep stableVersion config.toml | sed 's/.*"\(.*\)"/\1/'`
+MAJOR_MINOR_STABLE_VERSION=$(computeMajorMinorVersion $STABLE_VERSION)
+
+echo "📝 Updating versions"
+sed -i '' -e "s/^devVersion = \"\(.*\)\"/devVersion = \"${VERSION}\"/g" config.toml
+
+if [ "${STABLE}" == "yes" ]; then
+ sed -i '' -e "s/^stableVersion = \"\(.*\)\"/stableVersion = \"${VERSION}\"/g" config.toml
+ if [ "${MAJOR_MINOR_STABLE_VERSION}" != ${MAJOR_MINOR_VERSION} ]; then
+ echo "📝 Updating new stable version"
+ # This means that we have a new stable version and we need to change the order of the releases.
+ sed -i '' -e "s/^order = \(.*\)/order = 500/g" data/releases/${MAJOR_MINOR_VERSION}.toml
+ NEXT_STABLE_ORDER=$((`ls -1 data/releases | wc -l` - 2))
+ sed -i '' -e "s/^order = \(.*\)/order = ${NEXT_STABLE_ORDER}/g" data/releases/${MAJOR_MINOR_STABLE_VERSION}.toml
+ git add data/releases/${MAJOR_MINOR_STABLE_VERSION}.toml
+ fi
+elif [ "${MAJOR_MINOR_DEV_VERSION}" != "${MAJOR_MINOR_VERSION}" ]; then
+ echo "📝 Updating new dev version"
+ # This means that we are updating for a new dev version, but the last dev version is not the one that we are doing.
+ # Therefore, we need to update add the new data configuration
+ cp data/releases/${MAJOR_MINOR_DEV_VERSION}.toml data/releases/${MAJOR_MINOR_VERSION}.toml
+ sed -i '' -e "s/^order = \(.*\)/order = 1000/g" data/releases/${MAJOR_MINOR_VERSION}.toml
+fi
+
+sed -i '' -e "s/^name = \"\(.*\)\"/name = \"${VERSION}\"/g" data/releases/${MAJOR_MINOR_VERSION}.toml
+sed -i '' -e "s/^releaseDate = \(.*\)/releaseDate = $(date +%F)/g" data/releases/${MAJOR_MINOR_VERSION}.toml
+git add data/releases/${MAJOR_MINOR_VERSION}.toml
+git add config.toml
+
+echo "📝 Updating distribution resources"
+tar -xf tmp/mapstruct-${VERSION}-dist.tar.gz --directory tmp
+rm -rf static/documentation/${MAJOR_MINOR_VERSION}
+cp -R tmp/mapstruct-${VERSION}/docs static/documentation/${MAJOR_MINOR_VERSION}
+mv static/documentation/${MAJOR_MINOR_VERSION}/reference/html/mapstruct-reference-guide.html static/documentation/${MAJOR_MINOR_VERSION}/reference/html/index.html
+git add static/documentation/${MAJOR_MINOR_VERSION}
+
+git config --global user.email "${GH_BOT_EMAIL}"
+git config --global user.name "GitHub Action"
+git commit -a -m "Releasing version ${VERSION}"
+git push
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..5e4cddbee
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,123 @@
+name: Release
+
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Release version'
+ required: true
+ next:
+ description: 'Next version'
+ required: false
+
+env:
+ JAVA_VERSION: '11'
+ JAVA_DISTRO: 'zulu'
+
+jobs:
+ release:
+ # This job has been inspired by the moditect release (https://github.com/moditect/moditect/blob/main/.github/workflows/release.yml)
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Setup Java
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ vars.JAVA_VERSION }}
+ distribution: ${{ vars.JAVA_DISTRO }}
+ cache: maven
+
+ - name: Set release version
+ id: version
+ run: |
+ RELEASE_VERSION=${{ github.event.inputs.version }}
+ NEXT_VERSION=${{ github.event.inputs.next }}
+ PLAIN_VERSION=`echo ${RELEASE_VERSION} | awk 'match($0, /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)/) { print substr($0, RSTART, RLENGTH); }'`
+ COMPUTED_NEXT_VERSION="${PLAIN_VERSION}-SNAPSHOT"
+ if [ -z $NEXT_VERSION ]
+ then
+ NEXT_VERSION=$COMPUTED_NEXT_VERSION
+ fi
+ ./mvnw -ntp -B versions:set versions:commit -DnewVersion=$RELEASE_VERSION -pl :mapstruct-parent -DgenerateBackupPoms=false
+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git config --global user.name "GitHub Action"
+ git commit -a -m "Releasing version $RELEASE_VERSION"
+ git push
+ echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV
+ echo "NEXT_VERSION=$NEXT_VERSION" >> $GITHUB_ENV
+ echo "PLAIN_VERSION=$PLAIN_VERSION" >> $GITHUB_ENV
+
+ - name: Stage
+ run: |
+ export GPG_TTY=$(tty)
+ ./mvnw -ntp -B --file pom.xml \
+ -Dmaven.site.skip=true -Drelease=true -Ppublication,stage
+
+ - name: Release
+ env:
+ JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
+ JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}
+ JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
+ JRELEASER_NEXUS2_MAVEN_CENTRAL_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
+ JRELEASER_NEXUS2_MAVEN_CENTRAL_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
+ run: |
+ ./mvnw -ntp -B --file pom.xml -pl :mapstruct-parent -Pjreleaser jreleaser:release
+
+ - name: JReleaser output
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: jreleaser-release
+ path: |
+ parent/target/jreleaser/trace.log
+ parent/target/jreleaser/output.properties
+
+ - name: Set next version
+ run: |
+ ./mvnw -ntp -B versions:set versions:commit -DnewVersion=${{ env.NEXT_VERSION }} -pl :mapstruct-parent -DgenerateBackupPoms=false
+ sed -i -e "s@project.build.outputTimestamp>.*\${git.commit.author.time}
UTF-8
+
+ mapstruct/mapstruct
+ /tmp/repository
+ 1.8
+ ${java.version}
+ ${java.version}
+
+ ${git.commit.author.time}
+
1.0.0.Alpha3
3.4.1
3.2.2
@@ -30,7 +39,7 @@
8.36.1
5.10.1
2.2.0
-
+ 1.12.0
1
3.24.2
@@ -392,10 +401,6 @@
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
-
- 1.8
- 1.8
-
org.apache.maven.plugins
@@ -410,11 +415,6 @@
true
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.6
-
org.apache.maven.plugins
maven-enforcer-plugin
@@ -461,21 +461,6 @@
8
-
- org.apache.maven.plugins
- maven-release-plugin
- 2.5.3
-
- -DskipTests ${add.release.arguments}
- clean install
- false
- true
- @{project.version}
- true
- false
- release
-
-
org.apache.maven.plugins
maven-resources-plugin
@@ -522,6 +507,11 @@
+
+ org.codehaus.mojo
+ versions-maven-plugin
+ 2.16.2
+
org.eclipse.m2e
lifecycle-mapping
@@ -663,6 +653,7 @@
maven-settings.xml
readme.md
CONTRIBUTING.md
+ NEXT_RELEASE_CHANGELOG.md
.gitattributes
.gitignore
.factorypath
@@ -791,12 +782,21 @@
+
+ org.codehaus.mojo
+ versions-maven-plugin
+
- release
+ publication
+
+
+ release
+
+
@@ -823,18 +823,86 @@
+
+
+
+
+ stage
+
+ local::file:${maven.multiModuleProjectDirectory}/target/staging-deploy
+
+
+ deploy
+
+
+
+ jreleaser
+
+
- org.apache.maven.plugins
- maven-gpg-plugin
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
+ org.jreleaser
+ jreleaser-maven-plugin
+ ${jreleaser.plugin.version}
+
+ true
+
+
+ Mapstruct
+
+ https://mapstruct.org/
+ https://mapstruct.org/documentation/stable/reference/html/
+
+
+
+ ALWAYS
+ true
+
+
+ false
+
+
+
+
+
+ ALWAYS
+ https://oss.sonatype.org/service/local
+ https://oss.sonatype.org/content/repositories/snapshots/
+ true
+ true
+ ${maven.multiModuleProjectDirectory}/target/staging-deploy
+
+
+ org.mapstruct
+ mapstruct-jdk8
+ false
+ false
+
+
+
+
+
+
+
+
+ {{projectVersion}}
+ {{projectVersion}}
+
+ ${maven.multiModuleProjectDirectory}/NEXT_RELEASE_CHANGELOG.md
+
+
+
+
+
+
+ ${maven.multiModuleProjectDirectory}/distribution/target/mapstruct-{{projectVersion}}-dist.tar.gz
+
+
+ ${maven.multiModuleProjectDirectory}/distribution/target/mapstruct-{{projectVersion}}-dist.zip
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 25a5ead6b..90402f0ca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,6 @@
core
core-jdk8
processor
- integrationtest
true
@@ -71,5 +70,17 @@
distribution
+
+ test
+
+
+ release
+ !true
+
+
+
+ integrationtest
+
+