Skip to main content
Jump to: navigation, search

EE4J Maven Publishing

To publish Maven artifacts and release them, you need to use the nexus-staging-maven-plugin. The plugin has been configured in the ee4j parent pom, starting with version 1.0.5. Make sure you're using at least that version:

    <parent>
        <groupId>org.eclipse.ee4j</groupId>
        <artifactId>project</artifactId>
        <version>1.0.5</version>
    </parent>

The configuration in the parent pom causes the Maven deploy operation to be done using the nexus-staging-maven-plugin instead.

I created a job to do the build and deploy to staging for JAF. The same approach should work for most simple projects.

Create a freestyle job using the usual setup with all the required configuration and security injection. Here's the script I use for the job. It can be used to build and deploy either a SNAPSHOT release or a final release. Note that it depends on the version number already having been updated if you want to deploy a final release. You could replace the simple use of "mvn deploy" with the use of the maven-release-plugin, as others have explained. The key parts of this script are the use of the nexus-staging-maven-plugin to clean up any existing staging repositories to allow this job to be run multiple times to redeploy the artifacts.

Note that I have deploy-snapshot and deploy-release profiles in my pom, largely for historical reasons. Change or remove those as appropriate. You will need to customize the Maven build and deploy commands for your project.

TOOLS_PREFIX='/opt/tools'
JAVA_PREFIX="${TOOLS_PREFIX}/java/oracle"
MVN_HOME="${TOOLS_PREFIX}/apache-maven/latest"
JAVA_HOME="${JAVA_PREFIX}/jdk-8/latest"
PATH="${MVN_HOME}/bin:${JAVA_HOME}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

HELP_PLUGIN='org.apache.maven.plugins:maven-help-plugin:2.1.1'

# Workaround: GPG initialization
gpg --batch --import ${KEYRING}
for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
do
  echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
done

mvnq() {
    # filter out progress reports (-B) and download details
    mvn -B "$@" | grep -v '^\[INFO\] Download'
}

#
# If we're deploying a SNAPSHOT release, it's easy.
#
VERSION=$(mvn -B ${HELP_PLUGIN}:evaluate \
           -Dexpression=project.version 2> /dev/null | grep -v INFO)
case "$VERSION" in
*-SNAPSHOT)
    mvnq -Pstaging -Pdeploy-snapshot clean deploy
    exit
    ;;
esac

#
# Clean up from any previous failures
# List all the profiles, then for each profile,
# list all the repositories and drop them.
#
for name in $(mvnq nexus-staging:rc-list-profiles | \
    grep -v 'Central Bundles' | \
    awk '$3 == "BOTH" {print $4}')
do
    name=${name//./}    # squash out all the dots
    for id in $(mvnq nexus-staging:rc-list | \
        awk '$1 ~ /\[INFO\]/ && $2 ~ /^'"${name}"'\-[0-9]+$/ {print $2}')
    do
        echo "Dropping $id"
        mvnq -DstagingRepositoryId="$id" nexus-staging:rc-drop
    done
done


#
# Build and deploy
#
# Since we depend on other staged artifacts, need to use -Pstaging
# when building and deploying.
#
mvnq -Poss-release -Pstaging -Pdeploy-release clean deploy

When the above job is used to deploy a final release to a staging repository, the deployed artifacts can be tested, and a Release Review can be started. Once the testing is complete and the Release Review is approved, a job with the following script is used to actually release the staged artifacts. This script should not need to be customized per project.

TOOLS_PREFIX='/opt/tools'
JAVA_PREFIX="${TOOLS_PREFIX}/java/oracle"
MVN_HOME="${TOOLS_PREFIX}/apache-maven/latest"
JAVA_HOME="${JAVA_PREFIX}/jdk-8/latest"
PATH="${MVN_HOME}/bin:${JAVA_HOME}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

mvnq() {
    # filter out progress reports (-B) and download details
    mvn -B "$@" | grep -v '^\[INFO\] Download'
}

#
# List all the profiles, then for each profile,
# list all the repositories and release them.
# XXX - Assumes we want to release everything that's currently staged.
#
for name in $(mvnq nexus-staging:rc-list-profiles | \
    grep -v 'Central Bundles' | \
    awk '$3 == "BOTH" {print $4}')
do
    name=${name//./}    # squash out all the dots
    for id in $(mvnq nexus-staging:rc-list | \
        awk '$1 ~ /\[INFO\]/ && $2 ~ /^'"${name}"'\-[0-9]+$/ {print $2}')
    do
        echo "Releasing $id"
        mvnq -DstagingRepositoryId="$id" nexus-staging:rc-release
    done
done 

Back to the top