SWS-1073 - Introduce Jenkins CI.

This commit is contained in:
Greg Turnquist
2019-06-06 09:22:04 -05:00
parent 10e9cd9b90
commit 0f89d45261
15 changed files with 393 additions and 897 deletions

239
Jenkinsfile vendored Normal file
View File

@@ -0,0 +1,239 @@
pipeline {
agent none
triggers {
pollSCM 'H/10 * * * *'
}
options {
disableConcurrentBuilds()
}
stages {
stage("Test: baseline (jdk8)") {
agent {
docker {
image 'adoptopenjdk/openjdk8:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=distribute ci/test.sh"
}
}
stage("Test other configurations") {
parallel {
stage("Test: springnext (jdk8)") {
agent {
docker {
image 'adoptopenjdk/openjdk8:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=springnext ci/test.sh"
}
}
stage("Test: springnext-buildsnapshot (jdk8)") {
agent {
docker {
image 'adoptopenjdk/openjdk8:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=springnext-buildsnapshot ci/test.sh"
}
}
stage("Test: spring-buildsnapshot (jdk8)") {
agent {
docker {
image 'adoptopenjdk/openjdk8:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=spring-buildsnapshot ci/test.sh"
}
}
stage("Test: baseline (jdk11)") {
agent {
docker {
image 'adoptopenjdk/openjdk11:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=distribute,java11 ci/test.sh"
}
}
stage("Test: springnext (jdk11)") {
agent {
docker {
image 'adoptopenjdk/openjdk11:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=springnext,java11 ci/test.sh"
}
}
stage("Test: springnext-buildsnapshot (jdk11)") {
agent {
docker {
image 'adoptopenjdk/openjdk11:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=springnext-buildsnapshot,java11 ci/test.sh"
}
}
stage("Test: spring-buildsnapshot (jdk11)") {
agent {
docker {
image 'adoptopenjdk/openjdk11:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh "PROFILE=spring-buildsnapshot,java11 ci/test.sh"
}
}
}
}
stage('Deploy to Artifactory') {
agent {
docker {
image 'adoptopenjdk/openjdk8:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c')
}
steps {
script {
// Warm up this plugin quietly before using it.
sh "./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version"
PROJECT_VERSION = sh(
script: "./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO",
returnStdout: true
).trim()
RELEASE_TYPE = 'milestone' // .RC? or .M?
if (PROJECT_VERSION.endsWith('BUILD-SNAPSHOT')) {
RELEASE_TYPE = 'snapshot'
} else if (PROJECT_VERSION.endsWith('RELEASE')) {
RELEASE_TYPE = 'release'
}
OUTPUT = sh(
script: "PROFILE=distribute,docs,${RELEASE_TYPE} ci/build.sh",
returnStdout: true
).trim()
echo "$OUTPUT"
build_info_path = OUTPUT.split('\n')
.find { it.contains('Artifactory Build Info Recorder') }
.split('Saving Build Info to ')[1]
.trim()[1..-2]
dir(build_info_path + '/..') {
stash name: 'build_info', includes: "*.json"
}
}
}
}
stage('Promote to Bintray') {
when {
branch 'release-2.x'
}
agent {
docker {
image 'springci/spring-ws-openjdk8-with-jq:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
environment {
ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c')
}
steps {
script {
// Warm up this plugin quietly before using it.
sh "./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version"
PROJECT_VERSION = sh(
script: "./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO",
returnStdout: true
).trim()
if (PROJECT_VERSION.endsWith('RELEASE')) {
unstash name: 'build_info'
sh "ci/promote-to-bintray.sh"
} else {
echo "${PROJECT_VERSION} is not a candidate for promotion to Bintray."
}
}
}
}
stage('Sync to Maven Central') {
when {
branch 'release-2.x'
}
agent {
docker {
image 'springci/spring-ws-openjdk8-with-jq:latest'
args '-v $HOME/.m2:/root/.m2'
}
}
environment {
BINTRAY = credentials('Bintray-spring-operator')
SONATYPE = credentials('oss-token')
}
steps {
script {
// Warm up this plugin quietly before using it.
sh "./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version"
PROJECT_VERSION = sh(
script: "./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO",
returnStdout: true
).trim()
if (PROJECT_VERSION.endsWith('RELEASE')) {
unstash name: 'build_info'
sh "ci/sync-to-maven-central.sh"
} else {
echo "${PROJECT_VERSION} is not a candidate for syncing to Maven Central."
}
}
}
}
}
post {
changed {
script {
slackSend(
color: (currentBuild.currentResult == 'SUCCESS') ? 'good' : 'danger',
channel: '#spring-ws',
message: "${currentBuild.fullDisplayName} - `${currentBuild.currentResult}`\n${env.BUILD_URL}")
emailext(
subject: "[${currentBuild.fullDisplayName}] ${currentBuild.currentResult}",
mimeType: 'text/html',
recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider']],
body: "<a href=\"${env.BUILD_URL}\">${currentBuild.fullDisplayName} is reported as ${currentBuild.currentResult}</a>")
}
}
}
}

View File

@@ -1,3 +1,9 @@
image:https://spring.io/badges/spring-ws/ga.svg["Spring Web Services", link="https://spring.io/projects/spring-ws#learn"]
image:https://spring.io/badges/spring-ws/snapshot.svg["Spring Web Services", link="https://spring.io/projects/spring-ws#learn"]
image:https://jenkins.spring.io/buildStatus/icon?job=spring-ws%2Fmaster&subject=master[link=https://jenkins.spring.io/view/SpringWebServices/job/spring-ws/]
image:https://jenkins.spring.io/buildStatus/icon?job=spring-ws%2F2.x&subject=2.x[link=https://jenkins.spring.io/view/SpringWebServices/job/spring-ws/]
= Spring Web Services
Spring Web Services is a product of the Spring community focused on creating
@@ -5,25 +11,80 @@ document-driven Web services. Spring Web Services aims to facilitate
contract-first SOAP service development, allowing for the creation of flexible
web services using one of the many ways to manipulate XML payloads.
== Project Status
To see project status, https://github.com/spring-projects/spring-ws#project-status[visit this on master branch].
== Installation
Releases of Spring Web Services are available for download from Maven Central,
as well as our own repository, http://repo.spring.io/release[http://repo.springsource.org/release].
as well as our own repository, https://repo.spring.io/release[https://repo.spring.io/release].
Please visit https://projects.spring.io/spring-ws to get the right Maven/Gradle settings for your selected version.
Please visit https://spring.io/projects/spring-ws to get the right Maven/Gradle settings for your selected version.
== Building Spring Web Services
. Run `mvn clean package`
. Run `./mvnw clean package`
This will generate the artifacts.
You can also import the project into your IDE.
== Making a release
1. Create a new release (on the main branch).
+
----
% ci/create-release.sh <release version> <next snapshot version>
----
+
2. With the release tagged, push the tagged version to the release branch.
+
----
% git checkout -b release-2.x
% git reset --hard <tag>
% git push -f origin release-2.x
----
NOTE: You can chain the previous set of commands together using `&&`.
The pipeline will build and release the "release" branch. It will also build a new a new snapshot and stage it on artifactory.
=== Running CI tasks locally
Since the pipeline uses Docker, it's easy to:
* Debug what went wrong on your local machine.
* Test out a a tweak to your `test.sh` script before sending it out.
* Experiment against a new image before submitting your pull request.
All of these use cases are great reasons to essentially run what Jenkins does on your local machine.
IMPORTANT: To do this you must have Docker installed on your machine.
1. `docker run -it --mount type=bind,source="$(pwd)",target=/spring-ws-github adoptopenjdk/openjdk8:latest /bin/bash`
+
This will launch the Docker image and mount your source code at `spring-ws-github`.
+
2. `cd spring-ws-github`
+
Next, run the `test.sh` script from inside the container:
+
2. `PROFILE=none ci/test.sh`
Since the container is binding to your source, you can make edits from your IDE and continue to run build jobs.
If you need to test the `build.sh` script, then do this:
1. `docker run -it --mount type=bind,source="$(pwd)",target=/spring-ws-github adoptopenjdk/openjdk8:latest /bin/bash`
+
This will launch the Docker image and mount your source code at `spring-ws-github` and the temporary
artifactory output directory at `spring-ws-artifactory`.
+
Next, run the `build.sh` script from inside the container:
+
2. `ci/build.sh`
IMPORTANT: `build.sh` will attempt to push to Artifactory. If you don't supply credentials, it will fail.
NOTE: Docker containers can eat up disk space fast! From time to time, run `docker system prune` to clean out old images.
== Code of Conduct
This project adheres to the Contributor Covenant link:CODE_OF_CONDUCT.adoc[code of conduct].

6
ci/Dockerfile Normal file
View File

@@ -0,0 +1,6 @@
FROM adoptopenjdk/openjdk8:latest
RUN apt-get update && apt-get install -y jq
RUN apt-get clean \
&& rm -rf /var/lib/apt/lists/*

View File

@@ -1,94 +0,0 @@
== Spring Web Services CI
Spring Web Services uses Concourse as it's CI tool of choice. This provides support for:
* Pipelines against the `master` and `2.x` branch
* Support for pull requests
=== Creating a pipeline
Using the `fly` command, you can execute a series of commands to create multiple pipelines to manage everything. But
first, some critical credentials are needed.
Create a `credentials.yml` file like this:
[source,yml]
----
github-access-token: <your Personal Access Token from github>
docker-email: <your docker hub email address>
docker-username: <your docker hub username>
docker-password: <your docker hub password>
artifactory-username: <your artifactory username>
artifactory-password: <your artifactory encoded password>
----
WARNING: Do NOT check this file into source control! If you'll check, `credentials.yml` is listed in `.gitignore` to prevent tihs.
With this in place, run the following `fly` commands to create pipelines:
----
% fly -t spring-team sp -p spring-ws-2.x -c ci/pipeline-template.yml -l credentials.yml -v branch=2.x
----
With these pipelines in place, you can now activate and expose them:
----
% fly -t spring-team unpause-pipeline -p spring-ws-2.x
% fly -t spring-team expose-pipeline -p spring-ws-2.x
----
=== Making a release
1. Create a new release (on the main branch).
+
----
% ci/create-release.sh <release version> <next snapshot version>
----
+
2. With the release officially tagged, just push it to master.
+
----
% git push
----
The pipeline will pick up the next tag and release it. It will also build a new snapshot and stage it on artifactory.
=== Running CI tasks locally
Since Concourse is built on top of Docker, it's easy to:
* Debug what went wrong on your local machine.
* Test out a a tweak to your `test.sh` script before sending it out.
* Experiment against a new image before submitting your pull request.
All of these use cases are great reasons to essentially run what Concourse does on your local machine.
IMPORTANT: To do this you must have Docker installed on your machine.
1. `docker run -it --mount type=bind,source="$(pwd)",target=/spring-ws-github openjdk:8-jdk /bin/bash`
+
This will launch the Docker image and mount your source code at `spring-ws-github`.
+
Next, run the `test.sh` script from inside the container:
+
2. `PROFILE=none spring-ws-github/ci/test.sh`
Since the container is binding to your source, you can make edits from your IDE and continue to run build jobs.
If you need to test the `build.sh` script, then do this:
1. `mkdir /tmp/spring-ws-artifactory`
2. `docker run -it --mount type=bind,source="$(pwd)",target=/spring-ws-github --mount type=bind,source="/tmp/spring-ws-artifactory",target=/spring-ws-artifactory openjdk:8-jdk /bin/bash`
+
This will launch the Docker image and mount your source code at `spring-ws-github` and the temporary
artifactory output directory at `spring-ws-artifactory`.
+
Next, run the `build.sh` script from inside the container:
+
3. `spring-ws-github/ci/build.sh`
IMPORTANT: `build.sh` doesn't actually push to Artifactory so don't worry about accidentally deploying anything.
It just deploys to a local folder. That way, the `artifactory-resource` later in the pipeline can pick up these artifacts
and deliver them to artifactory.

View File

@@ -2,13 +2,4 @@
set -euo pipefail
[[ -d $PWD/maven && ! -d $HOME/.m2 ]] && ln -s $PWD/maven $HOME/.m2
spring_ws_artifactory=$(pwd)/spring-ws-artifactory
rm -rf $HOME/.m2/repository/org/springframework/ws 2> /dev/null || :
cd spring-ws-github
./mvnw -Pdistribute,snapshot,docs -Dmaven.test.skip=true clean deploy \
-DaltDeploymentRepository=distribution::default::file://${spring_ws_artifactory}
./mvnw -P${PROFILE} -Dmaven.test.skip=true clean deploy -B

View File

@@ -1,20 +0,0 @@
---
platform: linux
image_resource:
type: docker-image
source:
repository: openjdk
tag: 8-jdk
inputs:
- name: spring-ws-github
outputs:
- name: spring-ws-artifactory
caches:
- path: maven
run:
path: spring-ws-github/ci/build.sh

View File

@@ -1,633 +0,0 @@
---
resource_types:
- name: artifactory-resource
type: registry-image
source:
repository: springio/artifactory-resource
tag: 0.0.6
- name: github-status
type: registry-image
source:
repository: dpb587/github-status-resource
tag: master
- name: pull-request
type: registry-image
source:
repository: jtarchie/pr
tag: latest
- name: slack-notification
type: registry-image
source:
repository: nebhale/slack-notification-resource
resources:
- name: openjdk:8-jdk
type: registry-image
icon: docker
source:
repository: openjdk
tag: 8-jdk
- name: openjdk:11-jdk
type: registry-image
icon: docker
source:
repository: openjdk
tag: 11-jdk
- name: spring-ws-github
type: git
icon: github-circle
source:
uri: https://github.com/spring-projects/spring-ws.git
branch: ((branch))
- name: spring-ws-artifactory
type: artifactory-resource
icon: package-variant
source:
uri: https://repo.spring.io
username: ((artifactory-username))
password: ((artifactory-password))
build_name: spring-ws
- name: spring-ws-pull-requests
type: pull-request
icon: source-pull
source:
access_token: ((github-access-token))
repo: spring-projects/spring-ws
base: ((branch))
- name: spring-ws-release
type: git
icon: github-circle
source:
uri: https://github.com/spring-projects/spring-ws.git
tag_filter: v*
- name: spring-ws-status
type: github-status
icon: eye-check
source:
access_token: ((github-access-token))
repository: spring-projects/spring-ws
branch: ((branch))
- name: slack
type: slack-notification
icon: slack
source:
url: ((slack))
groups:
- name: spring-ws
jobs:
- spring-ws-test-jdk8
- spring-ws-test-jdk8-spring-next
- spring-ws-test-jdk8-spring-next-snapshots
- spring-ws-test-jdk8-snapshots
- spring-ws-test-jdk11
- spring-ws-test-jdk11-spring-next
- spring-ws-test-jdk11-spring-next-snapshots
- spring-ws-test-jdk11-snapshots
- build
- name: pull-requests
jobs:
- spring-ws-pull-requests
- name: release
jobs:
- release-to-artifactory
- promote-to-bintray
- sync-to-maven-central
jobs:
- name: spring-ws-test-jdk8
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:8-jdk
trigger: true
- task: test
file: spring-ws-github/ci/test.yml
params: { PROFILE: "distribute,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk8-spring-next
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:8-jdk
trigger: true
- task: test
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk8-spring-next-snapshots
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:8-jdk
trigger: true
- task: test
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext-buildsnapshot,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk8-snapshots
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:8-jdk
trigger: true
- task: test
file: spring-ws-github/ci/test.yml
params: { PROFILE: "spring-buildsnapshot,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk11
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:11-jdk
trigger: true
- task: test
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "distribute,java11,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk11-spring-next
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:11-jdk
trigger: true
- task: test
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext,java11,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk11-spring-next-snapshots
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:11-jdk
trigger: true
- task: test
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext-buildsnapshot,java11,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-test-jdk11-snapshots
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
- get: openjdk:11-jdk
trigger: true
- task: test
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "spring-buildsnapshot,java11,convergence" }
on_failure:
put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Test has succeeded"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: build
serial: true
public: true
plan:
- get: spring-ws-github
trigger: true
passed: [
spring-ws-test-jdk8,
spring-ws-test-jdk8-spring-next,
spring-ws-test-jdk8-spring-next-snapshots,
spring-ws-test-jdk8-snapshots,
spring-ws-test-jdk11,
spring-ws-test-jdk11-spring-next,
spring-ws-test-jdk11-spring-next-snapshots,
spring-ws-test-jdk11-snapshots
]
- put: spring-ws-status
params:
commit: spring-ws-github
state: pending
- task: build
file: spring-ws-github/ci/build.yml
- put: spring-ws-artifactory
params:
build_number: ${BUILD_NAME}
build_uri: ${ATC_EXTERNAL_URL}/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}
repo: libs-snapshot-local
folder: spring-ws-artifactory
artifact_set:
- include:
- "/**"
properties:
zip.deployed: false
zip.displayname: "spring-ws"
zip.name: "spring-ws"
zip.type: "docs"
on_failure:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: failure
- put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "build has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: success
- put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <SUCCESS>"
text: "build has succeeded!"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: spring-ws-pull-requests
public: true
plan:
- get: spring-ws-github
resource: spring-ws-pull-requests
trigger: true
version: every
- get: openjdk:11-jdk
- put: spring-ws-pull-requests
params:
path: spring-ws-github
status: pending
- aggregate:
- task: test-jdk8
file: spring-ws-github/ci/test.yml
params: { PROFILE: "distribute,convergence" }
- task: test-jdk8-spring-next
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext,convergence" }
- task: test-jdk8-spring-next-snapshots
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext-buildsnapshot,convergence" }
- task: test-jdk8-snapshots
file: spring-ws-github/ci/test.yml
params: { PROFILE: "spring-buildsnapshot,convergence" }
- task: test-jdk11
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "distribute,java11,convergence" }
- task: test-jdk11-spring-next
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext,java11,convergence" }
- task: test-jdk11-spring-next-snapshots
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "springnext-buildsnapshot,java11,convergence" }
- task: test-jdk11-snapshots
image: openjdk:11-jdk
file: spring-ws-github/ci/test.yml
params: { PROFILE: "spring-buildsnapshot,java11,convergence" }
on_failure:
aggregate:
- put: spring-ws-pull-requests
params:
path: spring-ws-github
status: failure
- put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "build has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
aggregate:
- put: spring-ws-pull-requests
params:
path: spring-ws-github
status: success
- put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <SUCCESS>"
text: "build has succeeded!"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: release-to-artifactory
serial: true
public: true
plan:
- get: spring-ws-github
resource: spring-ws-release
trigger: true
- put: spring-ws-status
params:
commit: spring-ws-github
state: pending
- task: build
file: spring-ws-github/ci/build.yml
- put: spring-ws-artifactory
params:
build_number: ${BUILD_NAME}
build_uri: ${ATC_EXTERNAL_URL}/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}
repo: libs-release-local
folder: spring-ws-artifactory
artifact_set:
- include:
- "/**"
properties:
zip.deployed: false
zip.displayname: "spring-ws"
zip.name: "spring-ws"
zip.type: "docs"
on_failure:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: failure
- put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Releasing to artifactory has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: success
- put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <SUCCESS>"
text: "Releasing to artifactory has succeeded!"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: promote-to-bintray
serial: true
plan:
- get: spring-ws-github
resource: spring-ws-release
- get: spring-ws-artifactory
trigger: true
passed: [release-to-artifactory]
params:
save_build_info: true
- task: promote-to-bintray
file: spring-ws-github/ci/promote-to-bintray.yml
params:
ARTIFACTORY_USERNAME: ((artifactory-username))
ARTIFACTORY_PASSWORD: ((artifactory-password))
on_failure:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: failure
- put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Promoting to bintray has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: success
- put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <SUCCESS>"
text: "Promoting to bintray has succeeded!"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
- name: sync-to-maven-central
serial: true
plan:
- get: spring-ws-github
resource: spring-ws-release
- get: spring-ws-artifactory
trigger: true
passed: [promote-to-bintray]
params:
save_build_info: true
- task: sync-to-maven-central
file: spring-ws-github/ci/sync-to-maven-central.yml
params:
BINTRAY_USERNAME: ((bintray-username))
BINTRAY_API_KEY: ((bintray-api-key))
SONATYPE_USER_TOKEN: ((sonatype-user-token))
SONATYPE_PASSWORD_TOKEN: ((sonatype-user-token-password))
ARTIFACTORY_USERNAME: ((artifactory-username))
ARTIFACTORY_PASSWORD: ((artifactory-password))
on_failure:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: failure
- put: slack
params:
attachments:
- color: danger
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <FAILURE>"
text: "Syncing to maven central has failed"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME
on_success:
aggregate:
- put: spring-ws-status
params:
commit: spring-ws-github
state: success
- put: slack
params:
attachments:
- color: good
fallback: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME <SUCCESS>"
text: "Syncing to maven central has succeeded!"
title: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME #$BUILD_NAME"
title_link: $ATC_EXTERNAL_URL/teams/$BUILD_TEAM_NAME/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME

View File

@@ -2,24 +2,20 @@
set -e -u
apt-get update
apt-get install -y jq
buildName=`jq -r '.name' build-info.json`
buildNumber=`jq -r '.number' build-info.json`
groupId=`jq -r '.modules[0].id' build-info.json | sed 's/\(.*\):.*:.*/\1/'`
version=`jq -r '.modules[0].id' build-info.json | sed 's/.*:.*:\(.*\)/\1/'`
buildName=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.name' )
buildNumber=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.number' )
groupId=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/\(.*\):.*:.*/\1/' )
version=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/.*:.*:\(.*\)/\1/' )
targetRepo="libs-release-local"
echo "Promoting ${buildName}/${buildNumber} to ${targetRepo}"
echo "Promoting ${buildName}/${buildNumber}/${groupId}/${version} to libs-release-local"
curl \
-s \
--connect-timeout 240 \
--max-time 2700 \
-u ${ARTIFACTORY_USERNAME}:${ARTIFACTORY_PASSWORD} \
-H "Content-type:application/json" \
-d "{\"sourceRepos\": [\"libs-release-local\"], \"targetRepo\" : \"spring-distributions\", \"async\":\"true\"}" \
-u ${ARTIFACTORY_USR}:${ARTIFACTORY_PSW} \
-H 'Content-type:application/json' \
-d '{"sourceRepos": ["libs-release-local"], "targetRepo" : "spring-distributions", "async":"true"}' \
-f \
-X \
POST "https://repo.spring.io/api/build/distribute/${buildName}/${buildNumber}" > /dev/null || { echo "Failed to distribute" >&2; exit 1; }

View File

@@ -1,19 +0,0 @@
---
platform: linux
image_resource:
type: docker-image
source:
repository: openjdk
tag: 8-jdk
inputs:
- name: spring-ws-artifactory
- name: spring-ws-github
run:
path: spring-ws-github/ci/promote-to-bintray.sh
params:
ARTIFACTORY_USERNAME:
ARTIFACTORY_PASSWORD:

View File

@@ -2,23 +2,22 @@
set -e -u
apt-get update
apt-get install -y jq
buildName=`jq -r '.name' build-info.json`
buildNumber=`jq -r '.number' build-info.json`
groupId=`jq -r '.modules[0].id' build-info.json | sed 's/\(.*\):.*:.*/\1/'`
version=`jq -r '.modules[0].id' build-info.json | sed 's/.*:.*:\(.*\)/\1/'`
buildName=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.name' )
buildNumber=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.number' )
groupId=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/\(.*\):.*:.*/\1/' )
version=$( cat spring-ws-artifactory/build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/.*:.*:\(.*\)/\1/' )
echo "Synching ${buildName}/${buildNumber}/${groupId}/${version} to Maven Central..."
echo "Syncing ${buildName}/${buildNumber} to Maven Central"
curl \
-s \
--connect-timeout 240 \
--max-time 2700 \
-u ${BINTRAY_USERNAME}:${BINTRAY_API_KEY} \
-H "Content-Type: application/json" -d "{ \"username\": \"${SONATYPE_USER_TOKEN}\", \"password\": \"${SONATYPE_PASSWORD_TOKEN}\"}" \
-f \
-X \
POST "https://api.bintray.com/maven_central_sync/spring/jars/${groupId}/versions/${version}" > /dev/null || { echo "Failed to sync" >&2; exit 1; }
curl \
-s \
--connect-timeout 240 \
--max-time 2700 \
-u ${BINTRAY_USR}:${BINTRAY_PSW} \
-H 'Content-Type: application/json' \
-d "{ \"username\": \"${SONATYPE_USR}\", \"password\": \"${SONATYPE_PSW}\"}" \
-f \
-X \
POST "https://api.bintray.com/maven_central_sync/spring/jars/${groupId}/versions/${version}" > /dev/null || { echo "Failed to sync" >&2; exit 1; }
echo "Sync complete"

View File

@@ -1,21 +0,0 @@
---
platform: linux
image_resource:
type: docker-image
source:
repository: openjdk
tag: 8-jdk
inputs:
- name: spring-ws-artifactory
- name: spring-ws-github
run:
path: spring-ws-github/ci/sync-to-maven-central.sh
params:
BINTRAY_USERNAME:
BINTRAY_API_KEY:
SONATYPE_USER_TOKEN:
SONATYPE_PASSWORD_TOKEN:

View File

@@ -2,10 +2,4 @@
set -euo pipefail
[[ -d $PWD/maven && ! -d $HOME/.m2 ]] && ln -s $PWD/maven $HOME/.m2
rm -rf $HOME/.m2/repository/org/springframework/ws 2> /dev/null || :
cd spring-ws-github
./mvnw -P${PROFILE} clean test
./mvnw -P${PROFILE} clean dependency:list test -Dsort -B

View File

@@ -1,17 +0,0 @@
---
platform: linux
image_resource:
type: docker-image
source:
repository: openjdk
tag: 8-jdk
inputs:
- name: spring-ws-github
caches:
- path: maven
run:
path: spring-ws-github/ci/test.sh

77
pom.xml
View File

@@ -337,25 +337,40 @@
</profile>
<profile>
<id>gpg</id>
<properties>
<gpg.useagent>true</gpg.useagent>
</properties>
<id>snapshot</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<groupId>org.jfrog.buildinfo</groupId>
<artifactId>artifactory-maven-plugin</artifactId>
<version>2.6.1</version>
<inherited>false</inherited>
<executions>
<execution>
<id>sign-artifact</id>
<phase>verify</phase>
<id>build-info</id>
<goals>
<goal>sign</goal>
<goal>publish</goal>
</goals>
<configuration>
<buildInfo>
<buildUrl>{{BUILD_URL}}</buildUrl>
</buildInfo>
<deployProperties>
<zip.name>spring-ws</zip.name>
<zip.displayname>spring-ws</zip.displayname>
<zip.deployed>false</zip.deployed>
<zip.type>docs</zip.type>
<archives>*:*:*:*@zip</archives>
</deployProperties>
<publisher>
<contextUrl>https://repo.spring.io</contextUrl>
<username>{{ARTIFACTORY_USR}}</username>
<password>{{ARTIFACTORY_PSW}}</password>
<repoKey>libs-snapshot-local</repoKey>
<snapshotRepoKey>libs-snapshot-local</snapshotRepoKey>
</publisher>
</configuration>
</execution>
</executions>
</plugin>
@@ -380,15 +395,22 @@
<goal>publish</goal>
</goals>
<configuration>
<buildInfo>
<buildUrl>{{BUILD_URL}}</buildUrl>
</buildInfo>
<deployProperties>
<archives>*:*:*:*@zip zip.name:spring-ws, zip.displayname:Spring Web Services, zip.deployed:false</archives>
<zip.name>spring-ws</zip.name>
<zip.displayname>spring-ws</zip.displayname>
<zip.deployed>false</zip.deployed>
<zip.type>docs</zip.type>
<archives>*:*:*:*@zip</archives>
</deployProperties>
<publisher>
<contextUrl>https://repo.spring.io</contextUrl>
<username>{{USERNAME}}</username>
<password>{{PASSWORD}}</password>
<username>{{ARTIFACTORY_USR}}</username>
<password>{{ARTIFACTORY_PSW}}</password>
<repoKey>libs-milestone-local</repoKey>
<snapshotRepoKey>libs-snapshot-local</snapshotRepoKey>
<snapshotRepoKey>libs-milestone-local</snapshotRepoKey>
</publisher>
</configuration>
</execution>
@@ -415,15 +437,22 @@
<goal>publish</goal>
</goals>
<configuration>
<buildInfo>
<buildUrl>{{BUILD_URL}}</buildUrl>
</buildInfo>
<deployProperties>
<archives>*:*:*:*@zip zip.name:spring-ws, zip.displayname:Spring Web Services, zip.deployed:false</archives>
<zip.name>spring-ws</zip.name>
<zip.displayname>spring-ws</zip.displayname>
<zip.deployed>false</zip.deployed>
<zip.type>docs</zip.type>
<archives>*:*:*:*@zip</archives>
</deployProperties>
<publisher>
<contextUrl>https://repo.spring.io</contextUrl>
<username>{{USERNAME}}</username>
<password>{{PASSWORD}}</password>
<username>{{ARTIFACTORY_USR}}</username>
<password>{{ARTIFACTORY_PSW}}</password>
<repoKey>libs-release-local</repoKey>
<snapshotRepoKey>libs-snapshot-local</snapshotRepoKey>
<snapshotRepoKey>libs-release-local</snapshotRepoKey>
</publisher>
</configuration>
</execution>
@@ -627,12 +656,12 @@
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0</version>
<version>2.3.2</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.jvnet.staxex</groupId>
@@ -642,6 +671,10 @@
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
</exclusion>
<exclusion>
<groupId>org.jvnet.mimepull</groupId>
<artifactId>mimepull</artifactId>
</exclusion>
</exclusions>
</dependency>

View File

@@ -1,19 +0,0 @@
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>${env.USERNAME}</username>
<password>${env.PASSWORD}</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>${env.USERNAME}</username>
<password>${env.PASSWORD}</password>
</server>
</servers>
</settings>