blob: 47190d0bafd6e02da122e4b7482298ee4d0fb49a [file] [log] [blame]
Samuli Silvius9e9afd72018-12-21 14:23:51 +02001#! /usr/bin/env bash
2
3# COPYRIGHT NOTICE STARTS HERE
4#
Bartek Grzybowski8583bf92020-10-21 13:58:05 +02005# Copyright 2018-2020© Samsung Electronics Co., Ltd.
Samuli Silvius9e9afd72018-12-21 14:23:51 +02006#
7# Licensed under the Apache License, Version 2.0 (the "License");
8# you may not use this file except in compliance with the License.
9# You may obtain a copy of the License at
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18#
19# COPYRIGHT NOTICE ENDS HERE
20
Samuli Silvius9e9afd72018-12-21 14:23:51 +020021### This script prepares Nexus repositories data blobs for ONAP
22
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020023## The script requires following dependencies are installed: nodejs, jq, docker, twine, expect
Mateusz Pilatb12b4402019-05-23 15:55:56 +020024## All required resources are expected in the upper directory created during
25## download procedure as DATA_DIR or in the directory given as --input-directory
26## All lists used must be in project data_lists directory or in the directory given
27## as --resource-list-directory
Samuli Silvius9e9afd72018-12-21 14:23:51 +020028
29# Fail fast settings
30set -e
31
Tomáš Levora8d272bd2019-03-12 15:06:35 +010032TIMESTAMP="date +'%Y-%m-%d_%H-%M-%S'"
33SCRIPT_LOG="/tmp/$(basename $0)_$(eval ${TIMESTAMP}).log"
34
35# Log everything
36exec &> >(tee -a "${SCRIPT_LOG}")
37
Bartek Grzybowski8583bf92020-10-21 13:58:05 +020038# Nexus repository properties
Samuli Silvius9e9afd72018-12-21 14:23:51 +020039NEXUS_DOMAIN="nexus"
Bartek Grzybowski65b93842020-10-22 12:46:17 +020040NEXUS_HOST="127.0.0.1"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010041NEXUS_PORT="8081"
42NEXUS_DOCKER_PORT="8082"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010043DEFAULT_REGISTRY="docker.io"
Samuli Silvius9e9afd72018-12-21 14:23:51 +020044
45# Nexus repository credentials
46NEXUS_USERNAME=admin
47NEXUS_PASSWORD=admin123
48NEXUS_EMAIL=admin@example.org
49
Tomáš Levora8d272bd2019-03-12 15:06:35 +010050# Setting paths
51LOCAL_PATH="$(readlink -f $(dirname ${0}))"
Mateusz Pilatb12b4402019-05-23 15:55:56 +020052
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020053# Defaults
Tomáš Levorae878f032019-06-13 13:31:01 +020054DOCKER_LOAD="false"
Tomáš Levorabe748842019-09-04 13:56:53 +020055NPM_PUSH="false"
56PYPI_PUSH="false"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010057DATA_DIR="$(realpath ${LOCAL_PATH}/../../resources)"
Mateusz Pilatb12b4402019-05-23 15:55:56 +020058NEXUS_DATA_DIR="${DATA_DIR}/nexus_data"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010059LISTS_DIR="${LOCAL_PATH}/data_lists"
60
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020061# Required dependencies
Tomáš Levorabe748842019-09-04 13:56:53 +020062COMMANDS=(jq docker)
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020063
Mateusz Pilatb12b4402019-05-23 15:55:56 +020064usage () {
Tomáš Levora55b43662019-07-17 13:42:47 +020065 echo "
66 Usage: $(basename $0) [OPTION...] [FILE]...
Mateusz Pilatb12b4402019-05-23 15:55:56 +020067
Tomáš Levora55b43662019-07-17 13:42:47 +020068 This script prepares Nexus repositories data blobs for ONAP
69
70 Following dependencies are required: nodejs, jq, docker, twine, expect
71 By default, without any lists or dirs provided, the resources are expected as downloaded
72 during download process and default lists will be used to build the Nexus blob in the same
73 resources dir
74
75 Examples:
76 $(basename $0) --input-directory </path/to/downloaded/files/dir> -ld --output-directory
77 </path/to/output/dir> --resource-list-directory </path/to/dir/with/resource/list>
78 # Docker images, npms and pypi packages will be loaded from specified directory
79 # and the blob is created
80 $(basename $0) -d </path/to/docker/images/list> -d </path/to/another/docker/images/list>
81 -n </path/to/npm/list> -p </path/to/pip/list>
82 # Docker images, npms and pypi packages will be pushed to Nexus based and provided data
83 # lists (multiple lists can be provided)
84
85 -d | --docker use specific list of docker images to be pushed into Nexus
86 (in case of -ld used, this list will be used for loading of
87 the images)
88 -h | --help print this usage
89 -i | --input-directory use specific directory containing resources needed to
90 create nexus blob
91 The structure of this directory must organized as described
92 in build guide
93 -ld | --load-docker-images load docker images from resource directory
94 -n | --npm list of npm packages to be pushed into Nexus
95 -o | --output-directory use specific directory for the target blob
96 -p | --pypi use specific list of pypi packages to be pushed into Nexus
97 -rl | --resource-list-directory use specific directory with docker, pypi and npm lists
Bartek Grzybowski8583bf92020-10-21 13:58:05 +020098 -c | --container-name use specific Nexus docker container name
Mateusz Pilatb12b4402019-05-23 15:55:56 +020099 "
100 exit 1
101}
102
Tomáš Levorae878f032019-06-13 13:31:01 +0200103load_docker_images () {
104 for ARCHIVE in $(sed $'s/\r// ; /^#/d ; s/\:/\_/g ; s/\//\_/g ; s/$/\.tar/g' ${1} | awk '{ print $1 }'); do
105 docker load -i ${NXS_SRC_DOCKER_IMG_DIR}/${ARCHIVE}
106 done
107}
108
Tomáš Levorabe748842019-09-04 13:56:53 +0200109prepare_npm () {
110 # Configure NPM registry to our Nexus repository
111 echo "Configure NPM registry to ${NPM_REGISTRY}"
112 npm config set registry "${NPM_REGISTRY}"
113
114 # Login to NPM registry
115 /usr/bin/expect <<- EOF
116 spawn npm login
117 expect "Username:"
118 send "${NEXUS_USERNAME}\n"
119 expect "Password:"
120 send "${NEXUS_PASSWORD}\n"
121 expect Email:
122 send "${NEXUS_EMAIL}\n"
123 expect eof
124 EOF
125}
126
127patch_npm () {
128 # Patch problematic package
129 PATCHED_NPM="$(grep tsscmp ${1} | sed $'s/\r// ; s/\\@/\-/ ; s/$/\.tgz/')"
130 if [[ ! -z "${PATCHED_NPM}" ]] && ! zgrep -aq "${NPM_REGISTRY}" "${PATCHED_NPM}" 2>/dev/null
131 then
132 tar xzf "${PATCHED_NPM}"
133 rm -f "${PATCHED_NPM}"
134 sed -i 's|\"registry\":\ \".*\"|\"registry\":\ \"'"${NPM_REGISTRY}"'\"|g' package/package.json
135 tar -zcf "${PATCHED_NPM}" package
136 rm -rf package
137 fi
138}
139
Tomáš Levora80594072019-07-11 10:38:23 +0200140push_npm () {
141 for ARCHIVE in $(sed $'s/\r// ; s/\\@/\-/g ; s/$/\.tgz/g' ${1}); do
142 npm publish --access public ${ARCHIVE} > /dev/null
143 echo "NPM ${ARCHIVE} pushed to Nexus"
144 done
145}
146
147push_pip () {
Tomáš Levorabe748842019-09-04 13:56:53 +0200148 for PACKAGE in $(sed $'s/\r//; s/==/-/' ${1}); do
149 twine upload -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" --repository-url ${PYPI_REGISTRY} ${PACKAGE}* > /dev/null
Tomáš Levora80594072019-07-11 10:38:23 +0200150 echo "PYPI ${PACKAGE} pushed to Nexus"
Tomáš Levora55b43662019-07-17 13:42:47 +0200151 done
Tomáš Levora80594072019-07-11 10:38:23 +0200152}
153
154docker_login () {
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200155 if ! grep -wqs ${DOCKER_REGISTRY} ~/.docker/config.json; then
156 echo "Docker login to ${DOCKER_REGISTRY}"
157 echo -n "${NEXUS_PASSWORD}" | docker login -u "${NEXUS_USERNAME}" --password-stdin ${DOCKER_REGISTRY} > /dev/null
158 fi
Tomáš Levora80594072019-07-11 10:38:23 +0200159}
160
161push_docker () {
162 for IMAGE in $(sed $'s/\r// ; /^#/d' ${1} | awk '{ print $1 }'); do
163 PUSH=""
164 if [[ ${IMAGE} != *"/"* ]]; then
165 PUSH="${DOCKER_REGISTRY}/library/${IMAGE}"
166 elif [[ ${IMAGE} == *"${DEFAULT_REGISTRY}"* ]]; then
167 if [[ ${IMAGE} == *"/"*"/"* ]]; then
168 PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})"
169 else
170 PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'\/library/' <<< ${IMAGE})"
171 fi
172 elif [[ -z $(sed -n '/\.[^/].*\//p' <<< ${IMAGE}) ]]; then
173 PUSH="${DOCKER_REGISTRY}/${IMAGE}"
Tomáš Levora80594072019-07-11 10:38:23 +0200174 else
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200175 # substitute all host names with $DOCKER_REGISTRY
176 repo_host=$(sed -e 's/\/.*$//' <<< ${IMAGE})
177 PUSH="$(sed -e 's/'"${repo_host}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})"
Tomáš Levora80594072019-07-11 10:38:23 +0200178 fi
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200179 docker tag ${IMAGE} ${PUSH}
180 docker push ${PUSH}
181 # Remove created tag
182 docker rmi ${PUSH}
Tomáš Levora80594072019-07-11 10:38:23 +0200183 echo "${IMAGE} pushed as ${PUSH} to Nexus"
184 done
185}
186
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200187validate_container_name () {
188 # Verify $1 is a valid hostname
189 if ! echo "${1}" | egrep -q "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";
190 then
191 echo "ERROR: ${1} is not a valid name!"
192 exit 1;
193 fi
194}
195
Tomáš Levorabe748842019-09-04 13:56:53 +0200196while [ "${1}" != "" ]; do
197 case ${1} in
198 -d | --docker ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100199 NXS_DOCKER_IMG_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200200 ;;
201 -i | --input-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100202 DATA_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200203 ;;
204 -ld | --load-docker-images ) DOCKER_LOAD="true"
205 ;;
206 -n | --npm ) NPM_PUSH="true"
207 COMMANDS+=(expect npm)
208 shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100209 NXS_NPM_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200210 ;;
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200211 -c | --container-name ) shift
212 validate_container_name "${1}"
213 NEXUS_DOMAIN="${1}"
214 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200215 -o | --output-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100216 NEXUS_DATA_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200217 ;;
218 -p | --pypi ) PYPI_PUSH="true"
219 COMMANDS+=(twine)
220 shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100221 NXS_PYPI_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200222 ;;
223 -rl | --resource-list-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100224 LISTS_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200225 ;;
226 -h | --help ) usage
227 ;;
228 *) usage
Tomáš Levora479673b2019-11-06 11:49:52 +0100229 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200230 esac
231 shift
232done
233
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200234# Verify all dependencies are available in PATH
235FAILED_COMMANDS=()
Tomáš Levora55b43662019-07-17 13:42:47 +0200236for cmd in ${COMMANDS[*]}; do
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200237 command -v $cmd >/dev/null 2>&1 || FAILED_COMMANDS+=($cmd)
238done
Tomáš Levora55b43662019-07-17 13:42:47 +0200239
240if [ ${#FAILED_COMMANDS[*]} -gt 0 ]; then
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200241 echo "Following commands where not found in PATH and are required:"
242 echo ${FAILED_COMMANDS[*]}
243 echo "Aborting."
244 exit 1
245fi
246
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200247# Nexus repository locations
Bartek Grzybowski65b93842020-10-22 12:46:17 +0200248NPM_REGISTRY="http://${NEXUS_HOST}:${NEXUS_PORT}/repository/npm-private/"
249PYPI_REGISTRY="http://${NEXUS_HOST}:${NEXUS_PORT}/repository/pypi-private/"
250DOCKER_REGISTRY="${NEXUS_HOST}:${NEXUS_DOCKER_PORT}"
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200251
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100252# Setup directories with resources for docker, npm and pypi
253NXS_SRC_DOCKER_IMG_DIR="${DATA_DIR}/offline_data/docker_images_for_nexus"
254NXS_SRC_NPM_DIR="${DATA_DIR}/offline_data/npm_tar"
255NXS_SRC_PYPI_DIR="${DATA_DIR}/offline_data/pypi"
256
Tomáš Levorafeaa6b42019-05-29 09:45:29 +0200257# Setup specific resources lists
Tomáš Levora55b43662019-07-17 13:42:47 +0200258NXS_INFRA_LIST="${LISTS_DIR}/infra_docker_images.list"
Tomáš Levorafeaa6b42019-05-29 09:45:29 +0200259NXS_DOCKER_IMG_LIST="${LISTS_DIR}/onap_docker_images.list"
Tomáš Levora55b43662019-07-17 13:42:47 +0200260NXS_RKE_DOCKER_IMG_LIST="${LISTS_DIR}/rke_docker_images.list"
Tomáš Levora39505562019-10-03 13:31:54 +0200261NXS_K8S_DOCKER_IMG_LIST="${LISTS_DIR}/k8s_docker_images.list"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100262
263# Setup Nexus image used for build and install infra
Tomáš Levora55b43662019-07-17 13:42:47 +0200264NEXUS_IMAGE="$(grep sonatype/nexus3 ${NXS_INFRA_LIST})"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100265NEXUS_IMAGE_TAR="${DATA_DIR}/offline_data/docker_images_infra/$(sed 's/\//\_/ ; s/$/\.tar/ ; s/\:/\_/' <<< ${NEXUS_IMAGE})"
266
Tomáš Levora55b43662019-07-17 13:42:47 +0200267# Set default lists if nothing specific defined by user
Tomáš Levorabe748842019-09-04 13:56:53 +0200268if [ ${#NXS_DOCKER_IMG_LISTS[@]} -eq 0 ]; then
Tomáš Levora39505562019-10-03 13:31:54 +0200269 NXS_DOCKER_IMG_LISTS=("${NXS_DOCKER_IMG_LIST}" "${NXS_RKE_DOCKER_IMG_LIST}" "${NXS_K8S_DOCKER_IMG_LIST}")
Tomáš Levora55b43662019-07-17 13:42:47 +0200270fi
271
Tomáš Levora80594072019-07-11 10:38:23 +0200272# Backup the current docker registry settings
273if [ -f ~/.docker/config.json ]; then
274 DOCKER_CONF_BACKUP="$(eval ${TIMESTAMP}_config.json.bk)"
275 mv ~/.docker/config.json ~/.docker/${DOCKER_CONF_BACKUP}
276fi
277
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100278# Setup default ports published to host as docker registry
279PUBLISHED_PORTS="-p ${NEXUS_PORT}:${NEXUS_PORT} -p ${NEXUS_DOCKER_PORT}:${NEXUS_DOCKER_PORT}"
280
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200281# Nexus repository configuration setup
282NEXUS_CONFIG_GROOVY='import org.sonatype.nexus.security.realm.RealmManager
283import org.sonatype.nexus.repository.attributes.AttributesFacet
284import org.sonatype.nexus.security.user.UserManager
285import org.sonatype.nexus.repository.manager.RepositoryManager
286import org.sonatype.nexus.security.user.UserNotFoundException
287/* Use the container to look up some services. */
288realmManager = container.lookup(RealmManager.class)
289userManager = container.lookup(UserManager.class, "default") //default user manager
290repositoryManager = container.lookup(RepositoryManager.class)
291/* Managers are used when scripting api cannot. Note that scripting api can only create mostly, and that creation methods return objects of created entities. */
292/* Perform cleanup by removing all repos and users. Realms do not need to be re-disabled, admin and anonymous user will not be removed. */
293userManager.listUserIds().each({ id ->
294 if (id != "anonymous" && id != "admin")
295 userManager.deleteUser(id)
296})
297repositoryManager.browse().each {
298 repositoryManager.delete(it.getName())
299}
300/* Add bearer token realms at the end of realm lists... */
301realmManager.enableRealm("NpmToken")
302realmManager.enableRealm("DockerToken")
Tomáš Levora1d902342019-02-05 10:01:43 +0100303realmManager.enableRealm("PypiToken")
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200304/* Create the docker user. */
305security.addUser("docker", "docker", "docker", "docker@example.com", true, "docker", ["nx-anonymous"])
Tomáš Levora1d902342019-02-05 10:01:43 +0100306/* Create docker, npm and pypi repositories. Their default configuration should be compliant with our requirements, except the docker registry creation. */
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200307repository.createNpmHosted("npm-private")
Tomáš Levora1d902342019-02-05 10:01:43 +0100308repository.createPyPiHosted("pypi-private")
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200309def r = repository.createDockerHosted("onap", 8082, 0)
310/* force basic authentication true by default, must set to false for docker repo. */
311conf=r.getConfiguration()
312conf.attributes("docker").set("forceBasicAuth", false)
313repositoryManager.update(conf)'
314
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100315# Prepare the Nexus configuration
316NEXUS_CONFIG=$(echo "${NEXUS_CONFIG_GROOVY}" | jq -Rsc '{"name":"configure", "type":"groovy", "content":.}')
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200317
318#################################
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200319# Docker repository preparation #
320#################################
321
Tomáš Levorae878f032019-06-13 13:31:01 +0200322if [ "${DOCKER_LOAD}" == "true" ]; then
323 # Load predefined Nexus image
324 docker load -i ${NEXUS_IMAGE_TAR}
325 # Load all necessary images
Tomáš Levora55b43662019-07-17 13:42:47 +0200326 for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
327 load_docker_images "${DOCKER_IMG_LIST}"
328 done
Tomáš Levorae878f032019-06-13 13:31:01 +0200329fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200330
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200331################################
332# Nexus repository preparation #
333################################
334
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200335# Prepare nexus-data directory
336if [ -d ${NEXUS_DATA_DIR} ]; then
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100337 if [ "$(docker ps -q -f name="${NEXUS_DOMAIN}")" ]; then
338 echo "Removing container ${NEXUS_DOMAIN}"
339 docker rm -f $(docker ps -aq -f name="${NEXUS_DOMAIN}")
340 fi
341 pushd ${NEXUS_DATA_DIR}/..
342 NXS_BACKUP="$(eval ${TIMESTAMP})_$(basename ${NEXUS_DATA_DIR})_bk"
343 mv ${NEXUS_DATA_DIR} "${NXS_BACKUP}"
344 echo "${NEXUS_DATA_DIR} already exists - backing up to ${NXS_BACKUP}"
345 popd
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200346fi
347
348mkdir -p ${NEXUS_DATA_DIR}
349chown 200:200 ${NEXUS_DATA_DIR}
350chmod 777 ${NEXUS_DATA_DIR}
351
352# Save Nexus version to prevent/catch data incompatibility
Tomáš Levora70ec9f42019-07-09 15:33:48 +0200353# Adding commit informations to have link to data from which the blob was built
354cat >> ${NEXUS_DATA_DIR}/nexus.ver << INFO
355nexus_image=$(docker image ls ${NEXUS_IMAGE} --no-trunc --format "{{.Repository}}:{{.Tag}}\nnexus_image_digest={{.ID}}")
356$(for INDEX in ${!NXS_DOCKER_IMG_LISTS[@]}; do printf 'used_image_list%s=%s\n' "$INDEX" "$(sed 's/^.*\/\(.*\)$/\1/' <<< ${NXS_DOCKER_IMG_LISTS[$INDEX]})"; done)
357$(sed -n 's/^.*OOM\ commit\ /oom_repo_commit=/p' ${NXS_DOCKER_IMG_LISTS[@]})
358installer_repo_commit=$(git --git-dir="${LOCAL_PATH}/../.git" rev-parse HEAD)
359INFO
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200360
361# Start the Nexus
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100362NEXUS_CONT_ID=$(docker run -d --rm -v ${NEXUS_DATA_DIR}:/nexus-data:rw --name ${NEXUS_DOMAIN} ${PUBLISHED_PORTS} ${NEXUS_IMAGE})
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200363echo "Waiting for Nexus to fully start"
Bartek Grzybowski65b93842020-10-22 12:46:17 +0200364until curl -su ${NEXUS_USERNAME}:${NEXUS_PASSWORD} http://${NEXUS_HOST}:${NEXUS_PORT}/service/metrics/healthcheck | grep '"healthy":true' > /dev/null ; do
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200365 printf "."
366 sleep 3
367done
368echo -e "\nNexus started"
369
370# Configure the nexus repository
Bartek Grzybowski65b93842020-10-22 12:46:17 +0200371curl -sX POST --header 'Content-Type: application/json' --data-binary "${NEXUS_CONFIG}" http://${NEXUS_USERNAME}:${NEXUS_PASSWORD}@${NEXUS_HOST}:${NEXUS_PORT}/service/rest/v1/script
372curl -sX POST --header "Content-Type: text/plain" http://${NEXUS_USERNAME}:${NEXUS_PASSWORD}@${NEXUS_HOST}:${NEXUS_PORT}/service/rest/v1/script/configure/run > /dev/null
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200373
374###########################
375# Populate NPM repository #
376###########################
Tomáš Levorabe748842019-09-04 13:56:53 +0200377if [ $NPM_PUSH == "true" ]; then
378 prepare_npm
379 pushd ${NXS_SRC_NPM_DIR}
380 for NPM_LIST in "${NXS_NPM_LISTS[@]}"; do
381 patch_npm "${NPM_LIST}"
382 push_npm "${NPM_LIST}"
383 done
384 popd
385 # Return default settings
386 npm logout
387 npm config set registry "https://registry.npmjs.org"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100388fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200389
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100390###############################
391## Populate PyPi repository #
392###############################
Tomáš Levorabe748842019-09-04 13:56:53 +0200393if [ $PYPI_PUSH == "true" ]; then
394 pushd ${NXS_SRC_PYPI_DIR}
395 for PYPI_LIST in "${NXS_PYPI_LISTS[@]}"; do
396 push_pip "${PYPI_LIST}"
397 done
398 popd
399fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200400
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100401###############################
402## Populate Docker repository #
403###############################
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200404
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200405# Login to docker registry simulated by Nexus container
Tomáš Levorabe748842019-09-04 13:56:53 +0200406# Push images to private nexus based on the lists
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200407# All images need to be tagged to simulated registry
408# and those without defined repository in tag use default repository 'library'
409docker_login
Tomáš Levora55b43662019-07-17 13:42:47 +0200410for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
Tomáš Levora55b43662019-07-17 13:42:47 +0200411 push_docker "${DOCKER_IMG_LIST}"
412done
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200413
414##############################
415# Stop the Nexus and cleanup #
416##############################
417
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100418echo "Stopping Nexus and returning backups"
419
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200420# Stop the Nexus
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100421docker stop ${NEXUS_CONT_ID} > /dev/null
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200422
Tomáš Levora20d3b8a2019-07-09 14:07:08 +0200423if [ -f ~/.docker/${DOCKER_CONF_BACKUP} ]; then
424 mv -f ~/.docker/${DOCKER_CONF_BACKUP} ~/.docker/config.json
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100425fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200426
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100427echo "Nexus blob is built"
Tomáš Levora479673b2019-11-06 11:49:52 +0100428exit 0