This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new 9bcea9b5a8 chore: Continued working on the release scripts.
9bcea9b5a8 is described below
commit 9bcea9b5a8fbf117d83361d5e9d4f2ed16e25607
Author: Christofer Dutz <[email protected]>
AuthorDate: Thu Jul 31 17:15:58 2025 +0200
chore: Continued working on the release scripts.
---
tools/release-0-update-generated-code.sh | 20 ++++----
tools/release-1-create-branch.sh | 20 ++++----
tools/release-2-prepare-release.sh | 85 +++++++++++++++++++++++---------
tools/release-3-finish-release.sh | 26 ++++++++++
tools/stage.pom | 28 +++++++++++
5 files changed, 137 insertions(+), 42 deletions(-)
diff --git a/tools/release-0-update-generated-code.sh
b/tools/release-0-update-generated-code.sh
index 96e846da78..59ea22a2ce 100755
--- a/tools/release-0-update-generated-code.sh
+++ b/tools/release-0-update-generated-code.sh
@@ -19,7 +19,7 @@
# under the License.
# ----------------------------------------------------------------------------
-DIRECTORY=..
+DIRECTORY="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
########################################################################################################################
# 0. Check Docker Memory Availability
@@ -48,7 +48,7 @@ fi
# 1. Check if there are uncommitted changes as these would automatically be
committed (local)
########################################################################################################################
-if [[ $(git status --porcelain) ]]; then
+if [[ $(git -C "$DIRECTORY" status --porcelain) ]]; then
# Changes
echo "❌ There are untracked files or changed files, aborting."
exit 1
@@ -102,7 +102,7 @@ find "$DIRECTORY/plc4py/plc4py/protocols" -mindepth 2 -type
f ! \( -name '__init
# 4. Make sure the NOTICE file has the current year in the second line
########################################################################################################################
-NOTICE_FILE="../NOTICE"
+NOTICE_FILE="$DIRECTORY/NOTICE"
CURRENT_YEAR=$(date +%Y)
EXPECTED="Copyright 2017-${CURRENT_YEAR} The Apache Software Foundation"
@@ -123,12 +123,12 @@ fi
# 5 Run the maven build for all modules with "update-generated-code" enabled
(Docker container)
########################################################################################################################
-if ! docker compose build; then
+if ! docker -f "$DIRECTORY/tools/docker-compose.yml" compose build; then
echo "❌ Got non-0 exit code from building the release docker container,
aborting."
exit 1
fi
-if ! docker compose run releaser bash /ws/mvnw -e -P
with-c,with-dotnet,with-go,with-java,with-python,enable-all-checks,update-generated-code
-Dmaven.repo.local=/ws/out/.repository clean package -DskipTests; then
+if ! docker -f "$DIRECTORY/tools/docker-compose.yml" compose run releaser bash
/ws/mvnw -e -P
with-c,with-dotnet,with-go,with-java,with-python,enable-all-checks,update-generated-code
-Dmaven.repo.local=/ws/out/.repository clean package -DskipTests; then
echo "❌ Got non-0 exit code from running the code-generation inside
docker, aborting."
exit 1
fi
@@ -137,7 +137,7 @@ fi
# 6. Make sure the generated driver documentation is up-to-date.
########################################################################################################################
-if ! docker compose run releaser bash /ws/mvnw -e -P with-java
-Dmaven.repo.local=/ws/out/.repository clean site -pl :plc4j-driver-all; then
+if ! docker -f "$DIRECTORY/tools/docker-compose.yml" compose run releaser bash
/ws/mvnw -e -P with-java -Dmaven.repo.local=/ws/out/.repository clean site -pl
:plc4j-driver-all; then
echo "❌ Got non-0 exit code from running the site code-generation inside
docker, aborting."
exit 1
fi
@@ -146,11 +146,11 @@ fi
# 7. Commit and push any changed files
########################################################################################################################
-if [[ $(git status --porcelain) ]]; then
+if [[ $(git -C "$DIRECTORY" status --porcelain) ]]; then
echo "Committing changes."
- git add --all
- git commit -m "chore: updated generated code"
- git push
+ git -C "$DIRECTORY" add --all
+ git -C "$DIRECTORY" commit -m "chore: updated generated code"
+ git -C "$DIRECTORY" push
else
echo "No changes."
fi
diff --git a/tools/release-1-create-branch.sh b/tools/release-1-create-branch.sh
index 4b62b5e34d..f416428758 100755
--- a/tools/release-1-create-branch.sh
+++ b/tools/release-1-create-branch.sh
@@ -19,13 +19,13 @@
# under the License.
# ----------------------------------------------------------------------------
-DIRECTORY=$(pwd)
+DIRECTORY="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
########################################################################################################################
# 0. Check if there are uncommitted changes as these would automatically be
committed (local)
########################################################################################################################
-if [[ $(git status --porcelain) ]]; then
+if [[ $(git -C "$DIRECTORY" status --porcelain) ]]; then
# Changes
echo "❌ There are untracked files or changed files, aborting."
exit 1
@@ -35,7 +35,7 @@ fi
# 1. Get and calculate the current version (local)
########################################################################################################################
-PROJECT_VERSION=$(../mvnw -f ../pom.xml -q -Dexec.executable=echo
-Dexec.args="\${project.version}" --non-recursive exec:exec)
+PROJECT_VERSION=$("$(DIRECTORY)"/mvnw -f "$(DIRECTORY)/pom.xml" -q
-Dexec.executable=echo -Dexec.args="\${project.version}" --non-recursive
exec:exec)
RELEASE_VERSION=${PROJECT_VERSION%"-SNAPSHOT"}
RELEASE_SHORT_VERSION=${RELEASE_VERSION%".0"}
BRANCH_NAME="rel/$RELEASE_SHORT_VERSION"
@@ -63,7 +63,7 @@ esac
# 4. Do a simple maven branch command with pushChanges=false
########################################################################################################################
-if ! docker compose run releaser bash /ws/mvnw -e -P
with-c,with-dotnet,with-go,with-java,with-python,enable-all-checks,update-generated-code
-Dmaven.repo.local=/ws/out/.repository release:branch
-DautoVersionSubmodules=true -DpushChanges=false
-DdevelopmentVersion="$NEW_VERSION" -DbranchName="$BRANCH_NAME"; then
+if ! docker -f "$DIRECTORY/tools/docker-compose.yml" compose run releaser bash
/ws/mvnw -e -P
with-c,with-dotnet,with-go,with-java,with-python,enable-all-checks,update-generated-code
-Dmaven.repo.local=/ws/out/.repository release:branch
-DautoVersionSubmodules=true -DpushChanges=false
-DdevelopmentVersion="$NEW_VERSION" -DbranchName="$BRANCH_NAME"; then
echo "❌ Got non-0 exit code from docker compose, aborting."
exit 1
fi
@@ -72,7 +72,7 @@ fi
# 5 Remove the "(Unreleased)" prefix from the current version of the
RELEASE_NOTES file (local)
########################################################################################################################
-if ! sed -i '' "s/(Unreleased) Apache PLC4X $PROJECT_VERSION*/Apache PLC4X
$RELEASE_VERSION/" ../RELEASE_NOTES; then
+if ! sed -i '' "s/(Unreleased) Apache PLC4X $PROJECT_VERSION*/Apache PLC4X
$RELEASE_VERSION/" $DIRECTORY/RELEASE_NOTES; then
echo "❌ Got non-0 exit code from updating RELEASE_NOTES, aborting."
exit 1
fi
@@ -97,7 +97,7 @@ Bug Fixes\n\
==============================================================\n\
"
echo NEW_VERSION
-if ! sed -i '' "1s/.*/$NEW_HEADER/" ../RELEASE_NOTES; then
+if ! sed -i '' "1s/.*/$NEW_HEADER/" $DIRECTORY/RELEASE_NOTES; then
echo "❌ Got non-0 exit code from adding a new header to RELEASE_NOTES,
aborting."
exit 1
fi
@@ -106,11 +106,11 @@ fi
# 7. Commit the change (local)
########################################################################################################################
-if ! git add --all; then
+if ! git -C "$DIRECTORY" add --all; then
echo "❌ Got non-0 exit code from adding all changes files, aborting."
exit 1
fi
-if ! git commit -m "chore: prepared the RELEASE_NOTES for the next version.";
then
+if ! git -C "$DIRECTORY" commit -m "chore: prepared the RELEASE_NOTES for the
next version."; then
echo "❌ Got non-0 exit code from committing changes files, aborting."
exit 1
fi
@@ -119,7 +119,7 @@ fi
# 8. Push the changes (local)
########################################################################################################################
-if ! git push; then
+if ! git -C "$DIRECTORY" push; then
echo "❌ Got non-0 exit code from pushing changes, aborting."
exit 1
fi
@@ -128,7 +128,7 @@ fi
# 9. Switch to the release branch (local)
########################################################################################################################
-if ! git checkout "$BRANCH_NAME"; then
+if ! git -C "$DIRECTORY" checkout "$BRANCH_NAME"; then
echo "❌ Got non-0 exit code from switching branches to the release branch,
aborting."
exit 1
fi
diff --git a/tools/release-2-prepare-release.sh
b/tools/release-2-prepare-release.sh
index cfa1fd69b2..f66cef3d3b 100755
--- a/tools/release-2-prepare-release.sh
+++ b/tools/release-2-prepare-release.sh
@@ -19,19 +19,19 @@
# under the License.
# ----------------------------------------------------------------------------
-DIRECTORY=$(pwd)
+DIRECTORY="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
########################################################################################################################
# 0. Check if there are uncommitted changes as these would automatically be
committed (local)
########################################################################################################################
-if [[ $(git status --porcelain) ]]; then
+if [[ $(git -C "$DIRECTORY" status --porcelain) ]]; then
# Changes
echo "❌ There are untracked files or changed files, aborting."
exit 1
fi
-PROJECT_VERSION=$(../mvnw -f ../pom.xml -q -Dexec.executable=echo
-Dexec.args="\${project.version}" --non-recursive exec:exec)
+PROJECT_VERSION=$("$DIRECTORY"/mvnw -f "$DIRECTORY"/pom.xml -q
-Dexec.executable=echo -Dexec.args="\${project.version}" --non-recursive
exec:exec)
RELEASE_VERSION=${PROJECT_VERSION%"-SNAPSHOT"}
IFS='.' read -ra VERSION_SEGMENTS <<< "$RELEASE_VERSION"
NEW_VERSION="${VERSION_SEGMENTS[0]}.${VERSION_SEGMENTS[1]}.$((VERSION_SEGMENTS[2]
+ 1))-SNAPSHOT"
@@ -40,7 +40,7 @@
NEW_VERSION="${VERSION_SEGMENTS[0]}.${VERSION_SEGMENTS[1]}.$((VERSION_SEGMENTS[2
# 1. Do a simple release-prepare command
########################################################################################################################
-if ! docker compose run releaser bash /ws/mvnw -e -P
with-c,with-dotnet,with-go,with-java,with-python,enable-all-checks,update-generated-code
-Dmaven.repo.local=/ws/out/.repository release:prepare
-DautoVersionSubmodules=true -DreleaseVersion="$RELEASE_VERSION"
-DdevelopmentVersion="$NEW_VERSION" -Dtag="v$RELEASE_VERSION"; then
+if ! docker -f "$DIRECTORY/tools/docker-compose.yml" compose run releaser bash
/ws/mvnw -e -P
with-c,with-dotnet,with-go,with-java,with-python,enable-all-checks,update-generated-code
-Dmaven.repo.local=/ws/out/.repository release:prepare
-DautoVersionSubmodules=true -DreleaseVersion="$RELEASE_VERSION"
-DdevelopmentVersion="$NEW_VERSION" -Dtag="v$RELEASE_VERSION"; then
echo "❌ Got non-0 exit code from docker compose, aborting."
exit 1
fi
@@ -49,7 +49,7 @@ fi
# 2. Push the changes (local)
########################################################################################################################
-if ! git push; then
+if ! git -C "$DIRECTORY" push; then
echo "❌ Got non-0 exit code from pushing changes to git, aborting."
exit 1
fi
@@ -59,7 +59,7 @@ fi
########################################################################################################################
echo "Performing Release:"
-docker compose build
+docker -f "$DIRECTORY/tools/docker-compose.yml" compose build
if ! docker compose run releaser bash /ws/mvnw -e
-Dmaven.repo.local=/ws/out/.repository
-DaltDeploymentRepository=snapshot-repo::default::file:/ws/out/.local-artifacts-dir
release:perform; then
echo "❌ Got non-0 exit code from docker compose, aborting."
exit 1
@@ -70,7 +70,7 @@ fi
########################################################################################################################
echo "Signing artifacts:"
-find ../out/.local-artifacts-dir -print | grep -E
'^((.*\.pom)|(.*\.jar)|(.*\.kar)|(.*\.nar)|(.*-features\.xml)|(.*-cyclonedx\.json)|(.*-cyclonedx\.xml)|(.*-site\.xml)|(.*\.zip))$'
| while read -r line ; do
+find $DIRECTORY/out/.local-artifacts-dir -print | grep -E
'^((.*\.pom)|(.*\.jar)|(.*\.kar)|(.*\.nar)|(.*-features\.xml)|(.*-cyclonedx\.json)|(.*-cyclonedx\.xml)|(.*-site\.xml)|(.*\.zip))$'
| while read -r line ; do
echo "Processing $line"
if ! gpg -ab "$line"; then
echo "❌ Got non-0 exit code from signing artifact, aborting."
@@ -83,11 +83,24 @@ done
########################################################################################################################
echo "Deploying artifacts:"
-if ! ../mvnw -f ../jenkins.pom -X -P deploy-releases wagon:upload; then
- echo "❌ Got non-0 exit code from staging artifacts, aborting."
+if ! "$(DIRECTORY)/mvnw" -f "$(DIRECTORY)/tools/stage.pom"
nexus-staging:deploy-staged-repository; then
+ cho "❌ Got non-0 exit code from staging artifacts, aborting."
exit 1
fi
+echo "Closing staging repository:"
+if ! "$(DIRECTORY)/mvnw" -f "$(DIRECTORY)/tools/stage.pom"
nexus-staging:rc-close; then
+ cho "❌ Got non-0 exit code from closing staging repository, aborting."
+ exit 1
+fi
+
+# Get the url of the closed repo to add that to the VOTE email
+DEPLOY_PROPS="$HOME/.m2/repository/.nexus-staging/deploy.properties"
+STAGING_REPO_ID=$(grep stagingRepositoryId "$DEPLOY_PROPS" | cut -d= -f2)
+NEXUS_URL="https://repository.apache.org/"
+STAGING_REPO_URL="$NEXUS_URL/content/repositories/$STAGING_REPO_ID"
+echo "✅ Staging repository closed: $STAGING_REPO_URL"
+
########################################################################################################################
# 6. Prepare a directory for the release candidate
########################################################################################################################
@@ -95,29 +108,57 @@ fi
echo "Staging release candidate:"
read -r -p 'Release-Candidate number: ' rcNumber
RELEASE_CANDIDATE="rc$rcNumber"
-RELEASE_VERSION=$(find
../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/ -maxdepth 1 -type d
| grep -vE 'plc4x-parent/$' | xargs -n 1 basename)
-mkdir -p "../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}"
-cp ../README.md "../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/README"
-cp ../RELEASE_NOTES "../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-source-release.zip"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-source-release.zip.asc"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip.asc"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-source-release.zip.sha512"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip.sha512"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.json"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.json"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.json.asc"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.json.asc"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.xml"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.xml"
-cp
"../out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.xml.asc"
"../out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.xml.asc"
+RELEASE_VERSION=$(find
$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/ -maxdepth 1
-type d | grep -vE 'plc4x-parent/$' | xargs -n 1 basename)
+mkdir -p "$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}"
+cp "$DIRECTORY/README.md"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/README"
+cp "$DIRECTORY/RELEASE_NOTES"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-source-release.zip"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-source-release.zip.asc"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip.asc"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-source-release.zip.sha512"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip.sha512"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.json"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.json"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.json.asc"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.json.asc"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.xml"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.xml"
+cp
"$DIRECTORY/out/.local-artifacts-dir/org/apache/plc4x/plc4x-parent/${RELEASE_VERSION}/plc4x-parent-${RELEASE_VERSION}-cyclonedx.xml.asc"
"$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-cyclonedx.xml.asc"
########################################################################################################################
# 7. Upload the release candidate artifacts to SVN
########################################################################################################################
-cd "../out/stage/${RELEASE_VERSION}" || exit
+cd "$DIRECTORY/out/stage/${RELEASE_VERSION}" || exit
svn import "${RELEASE_CANDIDATE}"
"https://dist.apache.org/repos/dist/dev/plc4x/${RELEASE_VERSION}/${RELEASE_CANDIDATE}"
-m"Staging of ${RELEASE_CANDIDATE} of PLC4X ${RELEASE_VERSION}"
########################################################################################################################
-# 8. TODO: Make sure the currently used GPG key is available in the KEYS file
+# 8. Make sure the currently used GPG key is available in the KEYS file
########################################################################################################################
+ORIGINAL_FILE="$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip"
+SIGNED_FILE="$DIRECTORY/out/stage/${RELEASE_VERSION}/${RELEASE_CANDIDATE}/apache-plc4x-${RELEASE_VERSION}-source-release.zip.asc"
+
+KEYS_URL="https://dist.apache.org/repos/dist/release/plc4x/KEYS"
+TEMP_DIR=$(mktemp -d)
+KEYS_FILE="$TEMP_DIR/KEYS"
+KEYRING="$TEMP_DIR/pubring.kbx"
+
+# Fetch KEYS file
+echo "🔽 Downloading KEYS file from $KEYS_URL"
+curl -fsSL "$KEYS_URL" -o "$KEYS_FILE"
+
+# Import keys into temporary keyring
+echo "🔑 Importing KEYS into temporary GPG keyring"
+gpg --no-default-keyring --keyring "$KEYRING" --import "$KEYS_FILE" >
/dev/null 2>&1
+
+# Verify the signature
+echo "🧾 Verifying signature on $SIGNED_FILE"
+if gpg --no-default-keyring --keyring "$KEYRING" --verify "$SIGNED_FILE"
"$ORIGINAL_FILE" 2>&1 | grep -q "Good signature"; then
+ echo "✅ Signature is valid and signed by a key in the Apache PLC4X KEYS file"
+else
+ echo "❌ Signature is invalid or the key is not in the Apache PLC4X KEYS file"
+ exit 1
+fi
+
+# Cleanup
+rm -rf "$TEMP_DIR"
+
########################################################################################################################
# 9. TODO: Close the Nexus staging repository
########################################################################################################################
diff --git a/tools/release-3-finish-release.sh
b/tools/release-3-finish-release.sh
new file mode 100644
index 0000000000..10df19fc15
--- /dev/null
+++ b/tools/release-3-finish-release.sh
@@ -0,0 +1,26 @@
+########################################################################################################################
+# TODO: Send out the [RESULT][VOTE] email
+########################################################################################################################
+
+########################################################################################################################
+# TODO: Add this version to the website/resources/plc4x-doap.rdf file (On HEAD)
+########################################################################################################################
+
+########################################################################################################################
+# TODO: Update the website generation config to now serve the newly released
version, make that the
+# default (website/antora-playbook.yml on HEAD)
+########################################################################################################################
+
+########################################################################################################################
+# TODO: Move the release candidate from the dev part of svn to the release part
+########################################################################################################################
+
+########################################################################################################################
+# TODO: Release the Nexus staging repository
+########################################################################################################################
+
+# TODO: mvn nexus-staging:rc-release
+
+########################################################################################################################
+# TODO: Send out the [NOTICE] email
+########################################################################################################################
diff --git a/tools/stage.pom b/tools/stage.pom
new file mode 100644
index 0000000000..1eba31cb09
--- /dev/null
+++ b/tools/stage.pom
@@ -0,0 +1,28 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+ http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.plc4x</groupId>
+ <artifactId>deploy-wrapper</artifactId>
+ <version>1.0.0</version>
+ <packaging>pom</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.sonatype.plugins</groupId>
+ <artifactId>nexus-staging-maven-plugin</artifactId>
+ <version>1.7.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <serverId>apache.releases.https</serverId>
+ <nexusUrl>https://repository.apache.org/</nexusUrl>
+ <autoReleaseAfterClose>false</autoReleaseAfterClose>
+
<repositoryDirectory>../out/.local-artifacts-dir</repositoryDirectory>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file