blob: b02c4e0ca3b4999df9e43ea2fd603a2fd454eb8d [file] [log] [blame]
#!/usr/bin/env bash
#
# ============LICENSE_START=======================================================
# ONAP
# ================================================================================
# Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
# Modifications Copyright (C) 2020 Bell Canada.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============LICENSE_END=========================================================
###
##############################################################################
# Usage: usage
##############################################################################
function usage() {
echo
echo -e "syntax: $(basename "$0") "
echo -e "\t [-f|-l|-d]"
echo -e "\t -s <custom-settings> "
echo -e "\t -a <artifact> "
echo
echo -e "Options:"
echo -e "\t -f|--file-repo: deploy in the file repository"
echo -e "\t -l|--local-repo: install in the local repository"
echo -e "\t -d|--dependencies: install dependencies in the local repository"
echo -e "\t -s|--settings: custom settings.xml"
echo -e "\t -a|--artifact: file artifact (jar or pom) to deploy and/or install"
echo
echo
}
##############################################################################
# Usage: init <artifact>
#
# If the artifact is a jar, this function extracts the maven metadata for
# consumption in this script.
#
# As a result the global variables will be set:
# WORKING_DIR: working directory with extracted files.
# WORKING_POM: pom file location
# WORKING_POM_PROPERTIES: pom properties file location
##############################################################################
function init
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local artifact="${1}"
if [[ ! -f ${artifact} ]]; then
echo "${artifact}: artifact does not exist"
return 1
fi
if [[ ${artifact} != *.jar ]]; then
return 0
fi
local dir=$(mktemp -d)
local jar="${artifact##*/}"
WORKING_DIR=$(realpath "${dir}")
cp -p "${artifact}" "${WORKING_DIR}/${jar}"
pushd "${dir}"
local rc=0
# determine name of 'pom' file within JAR
local pom=$(jar tf "${jar}" META-INF | grep '/pom\.xml$' | head -1)
if [[ -n ${pom} ]] ; then
jar xf "${jar}" "${pom}"
WORKING_POM=$(realpath "${pom}")
else
echo "${artifact}: pom not found"
fi
local pomProperties=$(jar tf "${jar}" META-INF | grep '/pom\.properties$' | head -1)
if [[ -n ${pomProperties} ]]; then
jar xf "${jar}" "${pomProperties}"
WORKING_POM_PROPERTIES=$(realpath ${pomProperties})
source "${WORKING_POM_PROPERTIES}"
echo "${artifact}: sourcing in ${WORKING_POM_PROPERTIES}"
else
echo "${artifact}: pom.properties not found"
if [[ -n ${WORKING_POM} ]]; then
if ! getPomAttributes "${WORKING_POM}" artifactId groupId version ; then
echo "${WORKING_POM}: cannot extract maven coordinates"
rc=1
fi
else
echo "${artifact}: cannot extract maven coordinates"
rc=1
fi
fi
if [[ -z ${version} ]] || [[ -z ${groupId} ]] || [[ -z ${artifactId} ]]; then
echo "${artifact}: some coordinates cannot be extracted"
rc=1
fi
echo "${artifact}: coordinates ${groupId}:${artifactId}:${version}"
popd
return ${rc}
}
##############################################################################
# Usage: cleanup
#
# Clean up temporary resources.
##############################################################################
function cleanup
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
if [[ -n ${WORKING_DIR} ]]; then
rm -rf "${WORKING_DIR}"
fi
}
##############################################################################
# Usage: getPomAttributes <pom-file> <attribute> ...
#
# This function performs simplistic parsing of a 'pom.xml' file, extracting
# the specified attributes (e.g. 'groupId', 'artifactId', 'version'). The
# attributes are returned as environment variables with the associated name
##############################################################################
function getPomAttributes
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="$1"
if [[ ! -f "${file}" ]]; then
echo "${file}: file does not exist"
return 1
fi
local tab=$'\t' rval=0 attr value
shift
for attr in "$@" ; do
# Try to fetch the parameter associated with the 'pom.xml' file.
# Initially, the 'parent' element is excluded. If the desired
# parameter is not found, the 'parent' element is included in the
# second attempt.
value=$(sed -n \
-e '/<parent>/,/<\/parent>/d' \
-e '/<dependencies>/,/<\/dependencies>/d' \
-e '/<build>/,/<\/build>/d' \
-e '/<profiles>/,/<\/profiles>/d' \
-e '/<description>/,/<\/description>/d' \
-e '/<packaging>/,/<\/packaging>/d' \
-e '/<modelVersion>/,/<\/modelVersion>/d' \
-e '/<properties>/,/<\/properties>/d' \
-e "/^[ ${tab}]*<${attr}>\([^<]*\)<\/${attr}>.*/{s//\1/p;}" \
<"${file}")
if [[ "${value}" == "" ]]; then
# need to check parent for parameter
value=$(sed -n \
-e '/<dependencies>/,/<\/dependencies>/d' \
-e '/<build>/,/<\/build>/d' \
-e '/<profiles>/,/<\/profiles>/d' \
-e '/<description>/,/<\/description>/d' \
-e '/<packaging>/,/<\/packaging>/d' \
-e '/<modelVersion>/,/<\/modelVersion>/d' \
-e '/<properties>/,/<\/properties>/d' \
-e "/^[ ${tab}]*<${attr}>\([^<]*\)<\/${attr}>.*/{s//\1/p;}" \
<"${file}")
if [[ "${value}" == "" ]] ; then
echo "${file}: Can't determine ${attr}"
rval=1
fi
fi
# the following sets an environment variable with the name referred
# to by ${attr}
read "${attr}" <<<"${value}"
done
return ${rval}
}
##############################################################################
# Usage: setMavenProxyArgs
#
# This function performs parsing of http proxy environment variable if provided,
# extracting the attributes such as proxy host, port, username and password.
# These proxy attributes are set into the global variable for maven proxy
# settings to be used as build arguments with maven commands.
##############################################################################
function setMavenProxyArgs
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
if [[ -z ${http_proxy} ]]; then
return 0
fi
local proxy_creds="${http_proxy#*//}"
local proxy="${proxy_creds#*@}"
local host="${proxy%:*}"
local port="${proxy#*:}"
MVN_PROXY_SETTINGS="-DproxyHost=${host} -DproxyPort=${port}"
if [[ "$proxy_creds" == *"@"* ]]; then
local creds="${proxy_creds%%@*}"
local username="${creds%:*}"
local password="${creds#*:}"
MVN_PROXY_SETTINGS+=" -DproxyUsername=${username} -DproxyPassword=${password}"
fi
}
##############################################################################
# Usage: deployJar <jar-file>
#
# This function deploys a JAR file in a repository, as well as
# the 'pom.xml' member it contains.
#################################################################
function deployJar
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ ! -f ${file} ]]; then
return 1
fi
local repoId repoUrl
if [[ "${version}" =~ SNAPSHOT ]] ; then
repoId=${SNAPSHOT_REPOSITORY_ID}
repoUrl=${SNAPSHOT_REPOSITORY_URL}
else
repoId=${RELEASE_REPOSITORY_ID}
repoUrl=${RELEASE_REPOSITORY_URL}
fi
if [[ -z ${repoUrl} ]] || [[ -z ${repoId} ]]; then
echo "{file}: no repository id/url to deploy jar"
return 1
fi
echo "${file}: deploying jar artifact to repository ${repoId}: ${repoUrl}"
echo "${file}: coordinates ${groupId} ${artifactId} ${version}"
mvn ${CUSTOM_SETTINGS} ${MVN_PROXY_SETTINGS} deploy:deploy-file \
-Dfile="${file}" \
-Dversion="${version}" \
-Dpackaging=jar \
-DgeneratePom=false \
-DpomFile="${WORKING_POM}" \
-DrepositoryId="${repoId}" \
-Durl="${repoUrl}" \
-DupdateReleaseInfo=true
return ${?}
}
##############################################################################
# Usage: deployPom <pom-file>
#
# This function deploys a 'pom.xml' file in the local repository
##############################################################################
function deployPom
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ ! -f ${file} ]]; then
return 1
fi
if ! getPomAttributes "${file}" artifactId groupId version ; then
echo "${file}: cannot deploy pom due to missing attributes"
return 1
fi
local repoId repoUrl
if [[ "${version}" =~ SNAPSHOT ]] ; then
repoId=${SNAPSHOT_REPOSITORY_ID}
repoUrl=${SNAPSHOT_REPOSITORY_URL}
else
repoId=${RELEASE_REPOSITORY_ID}
repoUrl=${RELEASE_REPOSITORY_URL}
fi
echo "${file}: deploying pom artifact to repository ${repoId}: ${repoUrl}"
echo "${file}: coordinates ${groupId} ${artifactId} ${version}"
mvn ${CUSTOM_SETTINGS} ${MVN_PROXY_SETTINGS} deploy:deploy-file \
-Dfile="${file}" \
-Dpackaging=pom \
-DgeneratePom=false \
-DgroupId="${groupId}" \
-DartifactId="${artifactId}" \
-Dversion="${version}" \
-DrepositoryId="${repoId}" \
-Durl="${repoUrl}" \
-DupdateReleaseInfo=true
return ${?}
}
##############################################################################
# Usage: deployArtifact
#
# This function deploys a maven artifact in a repository
##############################################################################
function deployArtifact
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ -z "${file}" ]]; then
echo "${file}: artifact file not provided"
return 1
fi
if [[ ! -f "${file}" ]]; then
echo "${file}: artifact file does not exist"
return 1
fi
case "${file}" in
*pom.xml|*.pom)
deployPom "${file}"
return ${?}
;;
*.jar)
deployJar "${file}"
return ${?}
;;
*) echo "${file}: Don't know how to deploy artifact"
return 1
;;
esac
}
##############################################################################
# Usage: installJar <artifact-file>
#
# This function installs a jar packaged artifact in the local repository
##############################################################################
function installJar
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ ! -f ${file} ]]; then
return 1
fi
mvn ${CUSTOM_SETTINGS} ${MVN_PROXY_SETTINGS} \
org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile="${file}"
return $?
}
##############################################################################
# Usage: installPom <pom-file>
#
# This function installs a pom file in the local repository
##############################################################################
function installPom
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ ! -f ${file} ]]; then
return 1
fi
mvn ${CUSTOM_SETTINGS} ${MVN_PROXY_SETTINGS} \
org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
-Dpackaging=pom \
-Dfile="${file}" \
-DpomFile="${file}"
return $?
}
##############################################################################
# Usage: installArtifact
#
# This function installs a maven artifacts in the local repository
##############################################################################
function installArtifact
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ -z "${file}" ]]; then
echo "${file}: artifact file not provided"
return 1
fi
if [[ ! -f "${file}" ]]; then
echo "${file}: artifact file does not exist"
return 1
fi
case "${file}" in
*pom.xml|*.pom)
installPom "${file}"
return ${?}
;;
*.jar)
installJar "${file}"
return ${?}
;;
*) echo "${file}: Don't know how to install the artifact"
return 1
;;
esac
}
##############################################################################
# Usage: installDependencies <pom-file>
#
# This function installs the dependencies of an artifact in the file or
# local repository
##############################################################################
function installDependencies
{
if [[ ${DEBUG} == y ]]; then
echo "-- ${FUNCNAME[0]} $* --"
set -x
fi
local file="${1}"
if [[ ! -f ${file} ]]; then
return 1
fi
if [[ -z ${DEPENDENCY_REPO_URL} ]]; then
echo "${file}: no repo url to install dependencies"
return 1
fi
echo "${file}: deploying dependencies from repository ${DEPENDENCY_REPO_URL}"
echo "${file}: coordinates ${groupId} ${artifactId} ${version}"
mvn ${CUSTOM_SETTINGS} ${MVN_PROXY_SETTINGS} \
org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \
-DartifactId="${artifactId}" \
-DgroupId="${groupId}" \
-Dversion="${version}" \
-DremoteRepositories="${DEPENDENCY_REPO_URL}"
return ${?}
}
##############################################################################
# MAIN
##############################################################################
if [[ ${DEBUG} == y ]]; then
echo "-- $0 $* --"
set -x
fi
# reset globals
unset ARTIFACT_FILE
unset LOCAL_INSTALL
unset INSTALL_DEPS
unset FILE_REPO_INSTALL
unset WORKING_DIR
unset WORKING_POM
unset WORKING_POM_PROPERTIES
unset DEPENDENCY_REPO_URL
unset SETTINGS_FILE
unset CUSTOM_SETTINGS
unset MVN_PROXY_SETTINGS
# process input
until [[ -z "$1" ]]; do
case $1 in
-a|--artifact) shift
ARTIFACT_FILE=$1
;;
-s|--settings) shift
SETTINGS_FILE=$1
;;
-l|--local-repo) LOCAL_INSTALL="true"
;;
-d|--dependencies) INSTALL_DEPS="true"
;;
-f|--file-repo) FILE_REPO_INSTALL="true"
;;
*) usage
exit 1
;;
esac
shift
done
if [[ -z ${ARTIFACT_FILE} ]]; then
echo "No artifact file provided: $*"
usage
exit 1
fi
if [[ -n ${SETTINGS_FILE} ]]; then
CUSTOM_SETTINGS="--settings=${SETTINGS_FILE}"
fi
# Set proxy attributes into MVN_PROXY_SETTINGS variable
setMavenProxyArgs
# retval has the count of failed operations
retval=0
# initialize
init "${ARTIFACT_FILE}"
retval=$?
if [[ ${retval} != 0 ]]; then
cleanup
exit ${retval}
fi
# remote repo deploy operation
#
# SNAPSHOT_REPOSITORY_URL and RELEASE_REPOSITORY_URL
# are pre-existing environmental variables (base.conf)
if [[ -n ${SNAPSHOT_REPOSITORY_URL} ]] || [[ -n ${RELEASE_REPOSITORY_URL} ]]; then
deployArtifact "${ARTIFACT_FILE}"
retval=$(( retval + ${?} ))
fi
# deploy in file repository
if [[ -n ${FILE_REPO_INSTALL} ]]; then
FILE_REPO_ID="file-repository"
FILE_REPO_URL="file:${HOME}/.m2/file-repository"
SNAPSHOT_REPOSITORY_ID="${FILE_REPO_ID}"
SNAPSHOT_REPOSITORY_URL="${FILE_REPO_URL}"
RELEASE_REPOSITORY_ID="${FILE_REPO_ID}"
RELEASE_REPOSITORY_URL="${FILE_REPO_URL}"
mkdir -p "${FILE_REPO_URL#file:}" 2> /dev/null
deployArtifact "${ARTIFACT_FILE}"
retval=$(( retval + ${?} ))
fi
# install in local repository
if [[ -n ${LOCAL_INSTALL} ]]; then
installArtifact "${ARTIFACT_FILE}"
retval=$(( retval + ${?} ))
fi
# install dependencies in local and/or file repositories
if [[ -n ${INSTALL_DEPS} ]]; then
if [[ -n ${FILE_REPO_INSTALL} ]]; then
DEPENDENCY_REPO_URL="${FILE_REPO_URL}"
installDependencies "${ARTIFACT_FILE}"
retval=$(( retval + ${?} ))
fi
if [[ -n ${LOCAL_INSTALL} ]]; then
DEPENDENCY_REPO_URL="file:${HOME}/.m2/repository"
installDependencies "${ARTIFACT_FILE}"
retval=$(( retval + ${?} ))
fi
fi
cleanup
exit ${retval}