Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add maven publish for 1.3.x release #3507

Merged
merged 1 commit into from
May 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ codecov:
require_ci_to_pass: yes

coverage:
precision: 2
round: down
range: '80...100'
status:
project:
default:
target: 80% # the required coverage value
threshold: 2% # the leniency in hitting the target

ignore:
- '**/tests/*.py'
Expand Down
93 changes: 93 additions & 0 deletions jenkins/opensearch/maven-publish-1.3.x.jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
lib = library(identifier: '[email protected]', retriever: modernSCM([
$class: 'GitSCMSource',
remote: 'https://github.com/opensearch-project/opensearch-build-libraries.git',
]))

pipeline {
options {
timeout(time: 2, unit: 'HOURS')
}
agent none
environment {
AGENT_X64 = 'Jenkins-Agent-AL2-X64-C54xlarge-Docker-Host'
}
triggers {
parameterizedCron '''
H/60 * * * * %INPUT_MANIFEST=1.3.10/opensearch-1.3.10.yml
'''
}
parameters {
string(
name: 'COMPONENT_NAME',
description: 'If this field contains one or more component names (e.g. OpenSearch common-utils ...), will build with "--component <COMPONENT_NAME> ...", else build everything in the INPUT_MANIFEST.',
trim: true
)
string(
name: 'INPUT_MANIFEST',
description: 'Input manifest under the manifests folder, e.g. 2.0.0/opensearch-2.0.0.yml.',
trim: true
)
}
stages {
stage('dockerAgent-setup') {
agent {
docker {
label AGENT_X64
image 'docker/library/alpine:3'
registryUrl 'https://public.ecr.aws/'
alwaysPull true
}
}
steps {
script {
echo("Detect Docker Images and Related Parameters")
dockerAgent = detectDockerAgent()
currentBuild.description = INPUT_MANIFEST
}
}
}
stage('publish-maven-snaphots') {
environment {
SNAPSHOT_REPO_URL = "https://aws.oss.sonatype.org/content/repositories/snapshots/"
}
agent {
docker {
label AGENT_X64
image dockerAgent.image
args dockerAgent.args
alwaysPull true
}
}
steps {
script {
buildManifest(
componentName: "${COMPONENT_NAME}",
inputManifest: "manifests/${INPUT_MANIFEST}",
platform: 'linux',
architecture: 'x64',
distribution: 'tar',
snapshot: true
)

String mavenPath = "$WORKSPACE/tar/builds/opensearch/maven"

if (fileExists(mavenPath)) {
withCredentials([
string(credentialsId: 'maven-snapshots-username', variable: 'SONATYPE_USERNAME'),
string(credentialsId: 'maven-snapshots-password', variable: 'SONATYPE_PASSWORD')
]) {
sh("$WORKSPACE/publish/publish-snapshot.sh ${mavenPath}")
}
} else {
echo "Skipping publishing snapshots, ${mavenPath} does not exist."
}
}
}
post {
always {
postCleanup()
}
}
}
}
}
141 changes: 141 additions & 0 deletions publish/publish-snapshot.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
#!/bin/bash

# Copyright OpenSearch Contributors
###### Information ############################################################################
# SPDX-License-Identifier: Apache-2.0
#
# The OpenSearch Contributors require contributions made to
# this file be licensed under the Apache-2.0 license or a
# compatible open source license.
#
# Name: publish-snapshot.sh
# Language: Shell
#
# About: Deploy opensearch artifacts to a sonatype snapshot repository.
# This script will search POM files under the passed in directory and publish artifacts to
# a snapshot repository using the mvn deploy plugin.
#
# Usage: ./publish-snapshot.sh <directory>
#
###############################################################################################
set -e

[ -z "${1:-}" ] && {
usage
}

usage() {
echo "usage: $0 [-h] [dir]"
echo " dir parent directory of artifacts to be published to org/opensearch namespace."
echo " example: dir = ~/.m2/repository/org/opensearch where dir contains artifacts of a path:"
echo " /maven/reindex-client/1.0.0-SNAPSHOT/reindex-client-1.0.0-SNAPSHOT.jar"
echo " -h display help"
echo "Required environment variables:"
echo "SONATYPE_USERNAME - username with publish rights to a sonatype repository"
echo "SONATYPE_PASSWORD - password for sonatype"
echo "SNAPSHOT_REPO_URL - repository URL ex. http://localhost:8081/nexus/content/repositories/snapshots/"
exit 1
}

while getopts ":h" option; do
case $option in
h)
usage
;;
\?)
echo "Invalid option -$OPTARG" >&2
usage
;;
esac
done

[ -z "${SONATYPE_USERNAME}" ] && {
echo "SONATYPE_USERNAME is required"
exit 1
}

[ -z "${SONATYPE_PASSWORD}" ] && {
echo "SONATYPE_PASSWORD is required"
exit 1
}

[ -z "${SNAPSHOT_REPO_URL}" ] && {
echo "REPO_URL is required"
exit 1
}

if [ ! -d "$1" ]; then
echo "Invalid directory $1 does not exist"
usage
fi

create_maven_settings() {
# Create a settings.xml file with the user+password for maven
mvn_settings="${workdir}/mvn-settings.xml"
cat >${mvn_settings} <<-EOF
<?xml version="1.0" encoding="UTF-8" ?>
<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
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>nexus</id>
<username>${SONATYPE_USERNAME}</username>
<password>${SONATYPE_PASSWORD}</password>
</server>
</servers>
</settings>
EOF
}

url="${SNAPSHOT_REPO_URL}"
workdir=$(mktemp -d)

function cleanup() {
rm -rf "${workdir}"
}

trap cleanup TERM INT EXIT

create_maven_settings

cd "$1"

echo "searching for poms under $PWD"

pomFiles="$(find "." -name '*.pom')"
if [ -z "${pomFiles}" ]; then
echo "No artifacts found under $PWD"
exit 1
fi

for pom in ${pomFiles}; do
pom_dir="$(dirname "${pom}")"
for FILE in "${pom_dir}"/*; do
# The POM is deployed with the artifact in a single deploy-file command, we can skip over it
if [[ $FILE != $pom ]] &&
[[ $FILE != *"test-fixtures"* ]] && # This is a hack to ensure the OpenSearch build-tools test fixture jar is not uploaded instead of the actual build-tools jar.
[[ $FILE != *"javadoc"* ]] &&
[[ $FILE != *"sources"* ]]; then
extension="${FILE##*.}"
case $extension in jar | war | zip)
echo "Uploading: ${FILE} with ${pom} to ${url}"
mvn --settings="${mvn_settings}" deploy:deploy-file \
-DgeneratePom=false \
-DrepositoryId=nexus \
-Durl="${SNAPSHOT_REPO_URL}" \
-DpomFile="${pom}" \
-Dfile="${FILE}" || echo "Failed to upload ${FILE}"
;;
*) echo "Skipping upload for ${FILE}" ;;
esac
fi
done

echo "Finished uploading ${pom_dir}"
done

echo "==========================================="
echo "Done."
echo "==========================================="