mirror of
https://github.com/mapstruct/mapstruct.git
synced 2025-07-12 00:00:08 +08:00
#3602 Automate release with JReleaser
Add JReleaser for automating the release and add a step for automating the publishing of the website
This commit is contained in:
parent
b33942a010
commit
9a5e6b1892
76
.github/scripts/update-website.sh
vendored
Normal file
76
.github/scripts/update-website.sh
vendored
Normal file
@ -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
|
123
.github/workflows/release.yml
vendored
Normal file
123
.github/workflows/release.yml
vendored
Normal file
@ -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>.*</project.build.outputTimestamp@project.build.outputTimestamp>\${git.commit.author.time}</project.build.outputTimestamp@g" parent/pom.xml
|
||||
git config --global user.email "${{ vars.GH_BOT_EMAIL }}"
|
||||
git config --global user.name "GitHub Action"
|
||||
git commit -a -m "Next version ${{ env.NEXT_VERSION }}"
|
||||
git push
|
||||
|
||||
update-website:
|
||||
# This job has been inspired by the JReleaser update-website job (https://github.com/jreleaser/jreleaser/blob/main/.github/workflows/release.yml)
|
||||
name: Update Website
|
||||
needs: [release]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: mapstruct/mapstruct.org
|
||||
ref: main
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GIT_WEBSITE_ACCESS_TOKEN }}
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: ${{ vars.JAVA_VERSION }}
|
||||
distribution: ${{ vars.JAVA_DISTRO }}
|
||||
|
||||
- name: Download assets
|
||||
shell: bash
|
||||
run: |
|
||||
curl -sL https://raw.githubusercontent.com/mapstruct/mapstruct/main/.github/scripts/update-website.sh --output update-website.sh --create-dirs --output-dir tmp
|
||||
curl -sL "https://github.com/mapstruct/mapstruct/releases/download/${VERSION}/mapstruct-${VERSION}-dist.tar.gz" --output mapstruct-${VERSION}-dist.tar.gz --create-dirs --output-dir tmp
|
||||
env:
|
||||
VERSION: ${{ github.event.inputs.version }}
|
||||
|
||||
- name: Commit
|
||||
shell: bash
|
||||
env:
|
||||
VERSION: ${{ github.event.inputs.version }}
|
||||
GH_BOT_EMAIL: ${{ vars.GH_BOT_EMAIL }}
|
||||
run: |
|
||||
chmod +x update-website.sh
|
||||
./update-website.sh
|
29
NEXT_RELEASE_CHANGELOG.md
Normal file
29
NEXT_RELEASE_CHANGELOG.md
Normal file
@ -0,0 +1,29 @@
|
||||
### Features
|
||||
|
||||
* Support conditional mapping for source parameters (#2610, #3459, #3270)
|
||||
* Add `@SourcePropertyName` to handle a property name of the source object (#3323) - Currently only applicable for `@Condition` methods
|
||||
|
||||
### Enhancements
|
||||
|
||||
* Improve error message for mapping to `target = "."` using expression (#3485)
|
||||
* Improve error messages for auto generated mappings (#2788)
|
||||
* Remove unnecessary casts to long (#3400)
|
||||
|
||||
### Bugs
|
||||
|
||||
* `@Condition` cannot be used only with `@Context` parameters (#3561)
|
||||
* `@Condition` treated as ambiguous mapping for methods returning Boolean/boolean (#3565)
|
||||
* Subclass mapping warns about unmapped property that is mapped in referenced mapper (#3360)
|
||||
* Interface inherited build method is not found (#3463)
|
||||
* Bean with getter returning Stream is treating the Stream as an alternative setter (#3462)
|
||||
* Using `Mapping#expression` and `Mapping#conditionalQualifiedBy(Name)` should lead to compile error (#3413)
|
||||
* Defined mappings for subclass mappings with runtime exception subclass exhaustive strategy not working if result type is abstract class (#3331)
|
||||
|
||||
### Documentation
|
||||
|
||||
* Clarify that `Mapping#ignoreByDefault` is inherited in nested mappings in documentation (#3577)
|
||||
|
||||
### Build
|
||||
|
||||
* Improve tests to show that Lombok `@SuperBuilder` is supported (#3524)
|
||||
* Add Java 21 CI matrix build (#3473)
|
142
parent/pom.xml
142
parent/pom.xml
@ -21,6 +21,15 @@
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<project.repository>mapstruct/mapstruct</project.repository>
|
||||
<local.repository.path>/tmp/repository</local.repository.path>
|
||||
<java.version>1.8</java.version>
|
||||
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||
<!-- value comes from property git.commit.author.time -->
|
||||
<project.build.outputTimestamp>${git.commit.author.time}</project.build.outputTimestamp>
|
||||
|
||||
<org.mapstruct.gem.version>1.0.0.Alpha3</org.mapstruct.gem.version>
|
||||
<org.apache.maven.plugins.enforcer.version>3.4.1</org.apache.maven.plugins.enforcer.version>
|
||||
<org.apache.maven.plugins.surefire.version>3.2.2</org.apache.maven.plugins.surefire.version>
|
||||
@ -30,7 +39,7 @@
|
||||
<com.puppycrawl.tools.checkstyle.version>8.36.1</com.puppycrawl.tools.checkstyle.version>
|
||||
<org.junit.jupiter.version>5.10.1</org.junit.jupiter.version>
|
||||
<junit-pioneer.version>2.2.0</junit-pioneer.version>
|
||||
<add.release.arguments />
|
||||
<jreleaser.plugin.version>1.12.0</jreleaser.plugin.version>
|
||||
<forkCount>1</forkCount>
|
||||
<assertj.version>3.24.2</assertj.version>
|
||||
<!-- automatically run annotation processors within the incremental compilation -->
|
||||
@ -392,10 +401,6 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
@ -410,11 +415,6 @@
|
||||
<deployAtEnd>true</deployAtEnd>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.6</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-enforcer-plugin</artifactId>
|
||||
@ -461,21 +461,6 @@
|
||||
<source>8</source>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-release-plugin</artifactId>
|
||||
<version>2.5.3</version>
|
||||
<configuration>
|
||||
<arguments>-DskipTests ${add.release.arguments}</arguments>
|
||||
<preparationGoals>clean install</preparationGoals>
|
||||
<pushChanges>false</pushChanges>
|
||||
<localCheckout>true</localCheckout>
|
||||
<tagNameFormat>@{project.version}</tagNameFormat>
|
||||
<autoVersionSubmodules>true</autoVersionSubmodules>
|
||||
<useReleaseProfile>false</useReleaseProfile>
|
||||
<releaseProfiles>release</releaseProfiles>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
@ -522,6 +507,11 @@
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>versions-maven-plugin</artifactId>
|
||||
<version>2.16.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.eclipse.m2e</groupId>
|
||||
<artifactId>lifecycle-mapping</artifactId>
|
||||
@ -663,6 +653,7 @@
|
||||
<exclude>maven-settings.xml</exclude>
|
||||
<exclude>readme.md</exclude>
|
||||
<exclude>CONTRIBUTING.md</exclude>
|
||||
<exclude>NEXT_RELEASE_CHANGELOG.md</exclude>
|
||||
<exclude>.gitattributes</exclude>
|
||||
<exclude>.gitignore</exclude>
|
||||
<exclude>.factorypath</exclude>
|
||||
@ -791,12 +782,21 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>versions-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>release</id>
|
||||
<id>publication</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>release</name>
|
||||
</property>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
@ -823,18 +823,86 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>stage</id>
|
||||
<properties>
|
||||
<altDeploymentRepository>local::file:${maven.multiModuleProjectDirectory}/target/staging-deploy</altDeploymentRepository>
|
||||
</properties>
|
||||
<build>
|
||||
<defaultGoal>deploy</defaultGoal>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>jreleaser</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<groupId>org.jreleaser</groupId>
|
||||
<artifactId>jreleaser-maven-plugin</artifactId>
|
||||
<version>${jreleaser.plugin.version}</version>
|
||||
<configuration>
|
||||
<gitRootSearch>true</gitRootSearch>
|
||||
<jreleaser>
|
||||
<project>
|
||||
<name>Mapstruct</name>
|
||||
<links>
|
||||
<homepage>https://mapstruct.org/</homepage>
|
||||
<documentation>https://mapstruct.org/documentation/stable/reference/html/</documentation>
|
||||
</links>
|
||||
</project>
|
||||
<signing>
|
||||
<active>ALWAYS</active>
|
||||
<armored>true</armored>
|
||||
</signing>
|
||||
<checksum>
|
||||
<files>false</files>
|
||||
</checksum>
|
||||
<deploy>
|
||||
<maven>
|
||||
<nexus2>
|
||||
<maven-central>
|
||||
<active>ALWAYS</active>
|
||||
<url>https://oss.sonatype.org/service/local</url>
|
||||
<snapshotUrl>https://oss.sonatype.org/content/repositories/snapshots/</snapshotUrl>
|
||||
<closeRepository>true</closeRepository>
|
||||
<releaseRepository>true</releaseRepository>
|
||||
<stagingRepositories>${maven.multiModuleProjectDirectory}/target/staging-deploy</stagingRepositories>
|
||||
<artifactOverrides>
|
||||
<artifactOverride>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct-jdk8</artifactId>
|
||||
<sourceJar>false</sourceJar>
|
||||
<javadocJar>false</javadocJar>
|
||||
</artifactOverride>
|
||||
</artifactOverrides>
|
||||
</maven-central>
|
||||
</nexus2>
|
||||
</maven>
|
||||
</deploy>
|
||||
<release>
|
||||
<github>
|
||||
<tagName>{{projectVersion}}</tagName>
|
||||
<releaseName>{{projectVersion}}</releaseName>
|
||||
<changelog>
|
||||
<external>${maven.multiModuleProjectDirectory}/NEXT_RELEASE_CHANGELOG.md</external>
|
||||
</changelog>
|
||||
</github>
|
||||
</release>
|
||||
<files>
|
||||
<artifacts>
|
||||
<artifact>
|
||||
<path>${maven.multiModuleProjectDirectory}/distribution/target/mapstruct-{{projectVersion}}-dist.tar.gz</path>
|
||||
</artifact>
|
||||
<artifact>
|
||||
<path>${maven.multiModuleProjectDirectory}/distribution/target/mapstruct-{{projectVersion}}-dist.zip</path>
|
||||
</artifact>
|
||||
</artifacts>
|
||||
</files>
|
||||
</jreleaser>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
13
pom.xml
13
pom.xml
@ -27,7 +27,6 @@
|
||||
<module>core</module>
|
||||
<module>core-jdk8</module>
|
||||
<module>processor</module>
|
||||
<module>integrationtest</module>
|
||||
</modules>
|
||||
<properties>
|
||||
<maven.deploy.skip>true</maven.deploy.skip>
|
||||
@ -71,5 +70,17 @@
|
||||
<module>distribution</module>
|
||||
</modules>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>test</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>release</name>
|
||||
<value>!true</value>
|
||||
</property>
|
||||
</activation>
|
||||
<modules>
|
||||
<module>integrationtest</module>
|
||||
</modules>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
|
Loading…
x
Reference in New Issue
Block a user