blob: ddc3145b2a1b6f09b30f4a0bdf3acd508d193db0 [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"
Bartek Grzybowski579bdb22020-10-22 15:35:10 +020041NEXUS_EXPOSED_PORT="8081"
42NEXUS_PORT=${NEXUS_EXPOSED_PORT}
43NEXUS_DOCKER_EXPOSED_PORT="8082"
44NEXUS_DOCKER_PORT=${NEXUS_DOCKER_EXPOSED_PORT}
Tomáš Levora8d272bd2019-03-12 15:06:35 +010045DEFAULT_REGISTRY="docker.io"
Samuli Silvius9e9afd72018-12-21 14:23:51 +020046
47# Nexus repository credentials
48NEXUS_USERNAME=admin
49NEXUS_PASSWORD=admin123
50NEXUS_EMAIL=admin@example.org
51
Tomáš Levora8d272bd2019-03-12 15:06:35 +010052# Setting paths
53LOCAL_PATH="$(readlink -f $(dirname ${0}))"
Mateusz Pilatb12b4402019-05-23 15:55:56 +020054
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020055# Defaults
Tomáš Levorae878f032019-06-13 13:31:01 +020056DOCKER_LOAD="false"
Tomáš Levorabe748842019-09-04 13:56:53 +020057NPM_PUSH="false"
58PYPI_PUSH="false"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010059DATA_DIR="$(realpath ${LOCAL_PATH}/../../resources)"
Mateusz Pilatb12b4402019-05-23 15:55:56 +020060NEXUS_DATA_DIR="${DATA_DIR}/nexus_data"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010061LISTS_DIR="${LOCAL_PATH}/data_lists"
62
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020063# Required dependencies
Tomáš Levorabe748842019-09-04 13:56:53 +020064COMMANDS=(jq docker)
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020065
Mateusz Pilatb12b4402019-05-23 15:55:56 +020066usage () {
Tomáš Levora55b43662019-07-17 13:42:47 +020067 echo "
68 Usage: $(basename $0) [OPTION...] [FILE]...
Mateusz Pilatb12b4402019-05-23 15:55:56 +020069
Tomáš Levora55b43662019-07-17 13:42:47 +020070 This script prepares Nexus repositories data blobs for ONAP
71
72 Following dependencies are required: nodejs, jq, docker, twine, expect
73 By default, without any lists or dirs provided, the resources are expected as downloaded
74 during download process and default lists will be used to build the Nexus blob in the same
75 resources dir
76
77 Examples:
78 $(basename $0) --input-directory </path/to/downloaded/files/dir> -ld --output-directory
79 </path/to/output/dir> --resource-list-directory </path/to/dir/with/resource/list>
80 # Docker images, npms and pypi packages will be loaded from specified directory
81 # and the blob is created
82 $(basename $0) -d </path/to/docker/images/list> -d </path/to/another/docker/images/list>
83 -n </path/to/npm/list> -p </path/to/pip/list>
84 # Docker images, npms and pypi packages will be pushed to Nexus based and provided data
85 # lists (multiple lists can be provided)
86
87 -d | --docker use specific list of docker images to be pushed into Nexus
88 (in case of -ld used, this list will be used for loading of
89 the images)
90 -h | --help print this usage
91 -i | --input-directory use specific directory containing resources needed to
92 create nexus blob
93 The structure of this directory must organized as described
94 in build guide
95 -ld | --load-docker-images load docker images from resource directory
96 -n | --npm list of npm packages to be pushed into Nexus
97 -o | --output-directory use specific directory for the target blob
98 -p | --pypi use specific list of pypi packages to be pushed into Nexus
99 -rl | --resource-list-directory use specific directory with docker, pypi and npm lists
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200100 -c | --container-name use specific Nexus docker container name
Bartek Grzybowski579bdb22020-10-22 15:35:10 +0200101 -NP | --nexus-port use specific port for published Nexus service
102 -DP | --docker-port use specific port for published Nexus docker registry port
Mateusz Pilatb12b4402019-05-23 15:55:56 +0200103 "
104 exit 1
105}
106
Tomáš Levorae878f032019-06-13 13:31:01 +0200107load_docker_images () {
108 for ARCHIVE in $(sed $'s/\r// ; /^#/d ; s/\:/\_/g ; s/\//\_/g ; s/$/\.tar/g' ${1} | awk '{ print $1 }'); do
109 docker load -i ${NXS_SRC_DOCKER_IMG_DIR}/${ARCHIVE}
110 done
111}
112
Tomáš Levorabe748842019-09-04 13:56:53 +0200113prepare_npm () {
114 # Configure NPM registry to our Nexus repository
115 echo "Configure NPM registry to ${NPM_REGISTRY}"
116 npm config set registry "${NPM_REGISTRY}"
117
118 # Login to NPM registry
119 /usr/bin/expect <<- EOF
120 spawn npm login
121 expect "Username:"
122 send "${NEXUS_USERNAME}\n"
123 expect "Password:"
124 send "${NEXUS_PASSWORD}\n"
125 expect Email:
126 send "${NEXUS_EMAIL}\n"
127 expect eof
128 EOF
129}
130
131patch_npm () {
132 # Patch problematic package
133 PATCHED_NPM="$(grep tsscmp ${1} | sed $'s/\r// ; s/\\@/\-/ ; s/$/\.tgz/')"
134 if [[ ! -z "${PATCHED_NPM}" ]] && ! zgrep -aq "${NPM_REGISTRY}" "${PATCHED_NPM}" 2>/dev/null
135 then
136 tar xzf "${PATCHED_NPM}"
137 rm -f "${PATCHED_NPM}"
138 sed -i 's|\"registry\":\ \".*\"|\"registry\":\ \"'"${NPM_REGISTRY}"'\"|g' package/package.json
139 tar -zcf "${PATCHED_NPM}" package
140 rm -rf package
141 fi
142}
143
Tomáš Levora80594072019-07-11 10:38:23 +0200144push_npm () {
145 for ARCHIVE in $(sed $'s/\r// ; s/\\@/\-/g ; s/$/\.tgz/g' ${1}); do
146 npm publish --access public ${ARCHIVE} > /dev/null
147 echo "NPM ${ARCHIVE} pushed to Nexus"
148 done
149}
150
151push_pip () {
Tomáš Levorabe748842019-09-04 13:56:53 +0200152 for PACKAGE in $(sed $'s/\r//; s/==/-/' ${1}); do
153 twine upload -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" --repository-url ${PYPI_REGISTRY} ${PACKAGE}* > /dev/null
Tomáš Levora80594072019-07-11 10:38:23 +0200154 echo "PYPI ${PACKAGE} pushed to Nexus"
Tomáš Levora55b43662019-07-17 13:42:47 +0200155 done
Tomáš Levora80594072019-07-11 10:38:23 +0200156}
157
158docker_login () {
Bartek Grzybowski54286a32020-10-23 11:35:44 +0200159 echo "Docker login to ${DOCKER_REGISTRY}"
160 echo -n "${NEXUS_PASSWORD}" | docker --config "${DOCKER_CONFIG_DIR}" login -u "${NEXUS_USERNAME}" --password-stdin ${DOCKER_REGISTRY} > /dev/null
Tomáš Levora80594072019-07-11 10:38:23 +0200161}
162
163push_docker () {
164 for IMAGE in $(sed $'s/\r// ; /^#/d' ${1} | awk '{ print $1 }'); do
165 PUSH=""
166 if [[ ${IMAGE} != *"/"* ]]; then
167 PUSH="${DOCKER_REGISTRY}/library/${IMAGE}"
168 elif [[ ${IMAGE} == *"${DEFAULT_REGISTRY}"* ]]; then
169 if [[ ${IMAGE} == *"/"*"/"* ]]; then
170 PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})"
171 else
172 PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'\/library/' <<< ${IMAGE})"
173 fi
174 elif [[ -z $(sed -n '/\.[^/].*\//p' <<< ${IMAGE}) ]]; then
175 PUSH="${DOCKER_REGISTRY}/${IMAGE}"
Tomáš Levora80594072019-07-11 10:38:23 +0200176 else
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200177 # substitute all host names with $DOCKER_REGISTRY
178 repo_host=$(sed -e 's/\/.*$//' <<< ${IMAGE})
179 PUSH="$(sed -e 's/'"${repo_host}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})"
Tomáš Levora80594072019-07-11 10:38:23 +0200180 fi
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200181 docker tag ${IMAGE} ${PUSH}
Bartek Grzybowski54286a32020-10-23 11:35:44 +0200182 docker --config "${DOCKER_CONFIG_DIR}" push ${PUSH}
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200183 # Remove created tag
184 docker rmi ${PUSH}
Tomáš Levora80594072019-07-11 10:38:23 +0200185 echo "${IMAGE} pushed as ${PUSH} to Nexus"
186 done
187}
188
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200189validate_container_name () {
190 # Verify $1 is a valid hostname
191 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])$";
192 then
193 echo "ERROR: ${1} is not a valid name!"
194 exit 1;
195 fi
196}
197
Tomáš Levorabe748842019-09-04 13:56:53 +0200198while [ "${1}" != "" ]; do
199 case ${1} in
200 -d | --docker ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100201 NXS_DOCKER_IMG_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200202 ;;
203 -i | --input-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100204 DATA_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200205 ;;
206 -ld | --load-docker-images ) DOCKER_LOAD="true"
207 ;;
208 -n | --npm ) NPM_PUSH="true"
209 COMMANDS+=(expect npm)
210 shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100211 NXS_NPM_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200212 ;;
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200213 -c | --container-name ) shift
214 validate_container_name "${1}"
215 NEXUS_DOMAIN="${1}"
216 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200217 -o | --output-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100218 NEXUS_DATA_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200219 ;;
220 -p | --pypi ) PYPI_PUSH="true"
221 COMMANDS+=(twine)
222 shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100223 NXS_PYPI_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200224 ;;
225 -rl | --resource-list-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100226 LISTS_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200227 ;;
Bartek Grzybowski579bdb22020-10-22 15:35:10 +0200228 -NP | --nexus-port ) shift
229 NEXUS_PORT="${1}"
230 ;;
231 -DP | --docker-port ) shift
232 NEXUS_DOCKER_PORT="${1}"
233 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200234 -h | --help ) usage
235 ;;
236 *) usage
Tomáš Levora479673b2019-11-06 11:49:52 +0100237 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200238 esac
239 shift
240done
241
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200242# Verify all dependencies are available in PATH
243FAILED_COMMANDS=()
Tomáš Levora55b43662019-07-17 13:42:47 +0200244for cmd in ${COMMANDS[*]}; do
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200245 command -v $cmd >/dev/null 2>&1 || FAILED_COMMANDS+=($cmd)
246done
Tomáš Levora55b43662019-07-17 13:42:47 +0200247
248if [ ${#FAILED_COMMANDS[*]} -gt 0 ]; then
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200249 echo "Following commands where not found in PATH and are required:"
250 echo ${FAILED_COMMANDS[*]}
251 echo "Aborting."
252 exit 1
253fi
254
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200255# Nexus repository locations
Bartek Grzybowski65b93842020-10-22 12:46:17 +0200256NPM_REGISTRY="http://${NEXUS_HOST}:${NEXUS_PORT}/repository/npm-private/"
257PYPI_REGISTRY="http://${NEXUS_HOST}:${NEXUS_PORT}/repository/pypi-private/"
258DOCKER_REGISTRY="${NEXUS_HOST}:${NEXUS_DOCKER_PORT}"
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200259
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100260# Setup directories with resources for docker, npm and pypi
261NXS_SRC_DOCKER_IMG_DIR="${DATA_DIR}/offline_data/docker_images_for_nexus"
262NXS_SRC_NPM_DIR="${DATA_DIR}/offline_data/npm_tar"
263NXS_SRC_PYPI_DIR="${DATA_DIR}/offline_data/pypi"
264
Tomáš Levorafeaa6b42019-05-29 09:45:29 +0200265# Setup specific resources lists
Tomáš Levora55b43662019-07-17 13:42:47 +0200266NXS_INFRA_LIST="${LISTS_DIR}/infra_docker_images.list"
Tomáš Levorafeaa6b42019-05-29 09:45:29 +0200267NXS_DOCKER_IMG_LIST="${LISTS_DIR}/onap_docker_images.list"
Tomáš Levora55b43662019-07-17 13:42:47 +0200268NXS_RKE_DOCKER_IMG_LIST="${LISTS_DIR}/rke_docker_images.list"
Tomáš Levora39505562019-10-03 13:31:54 +0200269NXS_K8S_DOCKER_IMG_LIST="${LISTS_DIR}/k8s_docker_images.list"
Bartek Grzybowskic8cd4702021-06-21 13:32:20 +0200270NXS_PROMETHEUS_DOCKER_IMG_LIST="${LISTS_DIR}/kube_prometheus_stack_docker_images.list"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100271
272# Setup Nexus image used for build and install infra
Tomáš Levora55b43662019-07-17 13:42:47 +0200273NEXUS_IMAGE="$(grep sonatype/nexus3 ${NXS_INFRA_LIST})"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100274NEXUS_IMAGE_TAR="${DATA_DIR}/offline_data/docker_images_infra/$(sed 's/\//\_/ ; s/$/\.tar/ ; s/\:/\_/' <<< ${NEXUS_IMAGE})"
275
Tomáš Levora55b43662019-07-17 13:42:47 +0200276# Set default lists if nothing specific defined by user
Tomáš Levorabe748842019-09-04 13:56:53 +0200277if [ ${#NXS_DOCKER_IMG_LISTS[@]} -eq 0 ]; then
Bartek Grzybowskic8cd4702021-06-21 13:32:20 +0200278 NXS_DOCKER_IMG_LISTS=("${NXS_DOCKER_IMG_LIST}" "${NXS_RKE_DOCKER_IMG_LIST}" "${NXS_K8S_DOCKER_IMG_LIST}" "${NXS_PROMETHEUS_DOCKER_IMG_LIST}")
Tomáš Levora55b43662019-07-17 13:42:47 +0200279fi
280
Bartek Grzybowski54286a32020-10-23 11:35:44 +0200281# Create Docker client config dir
282DOCKER_CONFIG_DIR=$(mktemp -p /tmp -d .docker.XXXXXXXX)
Tomáš Levora80594072019-07-11 10:38:23 +0200283
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100284# Setup default ports published to host as docker registry
Bartek Grzybowski579bdb22020-10-22 15:35:10 +0200285PUBLISHED_PORTS="-p ${NEXUS_PORT}:${NEXUS_EXPOSED_PORT} -p ${NEXUS_DOCKER_PORT}:${NEXUS_DOCKER_EXPOSED_PORT}"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100286
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200287# Nexus repository configuration setup
288NEXUS_CONFIG_GROOVY='import org.sonatype.nexus.security.realm.RealmManager
289import org.sonatype.nexus.repository.attributes.AttributesFacet
290import org.sonatype.nexus.security.user.UserManager
291import org.sonatype.nexus.repository.manager.RepositoryManager
292import org.sonatype.nexus.security.user.UserNotFoundException
293/* Use the container to look up some services. */
294realmManager = container.lookup(RealmManager.class)
295userManager = container.lookup(UserManager.class, "default") //default user manager
296repositoryManager = container.lookup(RepositoryManager.class)
297/* Managers are used when scripting api cannot. Note that scripting api can only create mostly, and that creation methods return objects of created entities. */
298/* Perform cleanup by removing all repos and users. Realms do not need to be re-disabled, admin and anonymous user will not be removed. */
299userManager.listUserIds().each({ id ->
300 if (id != "anonymous" && id != "admin")
301 userManager.deleteUser(id)
302})
303repositoryManager.browse().each {
304 repositoryManager.delete(it.getName())
305}
306/* Add bearer token realms at the end of realm lists... */
307realmManager.enableRealm("NpmToken")
308realmManager.enableRealm("DockerToken")
Tomáš Levora1d902342019-02-05 10:01:43 +0100309realmManager.enableRealm("PypiToken")
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200310/* Create the docker user. */
311security.addUser("docker", "docker", "docker", "docker@example.com", true, "docker", ["nx-anonymous"])
Tomáš Levora1d902342019-02-05 10:01:43 +0100312/* 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 +0200313repository.createNpmHosted("npm-private")
Tomáš Levora1d902342019-02-05 10:01:43 +0100314repository.createPyPiHosted("pypi-private")
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200315def r = repository.createDockerHosted("onap", 8082, 0)
316/* force basic authentication true by default, must set to false for docker repo. */
317conf=r.getConfiguration()
318conf.attributes("docker").set("forceBasicAuth", false)
319repositoryManager.update(conf)'
320
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100321# Prepare the Nexus configuration
322NEXUS_CONFIG=$(echo "${NEXUS_CONFIG_GROOVY}" | jq -Rsc '{"name":"configure", "type":"groovy", "content":.}')
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200323
324#################################
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200325# Docker repository preparation #
326#################################
327
Tomáš Levorae878f032019-06-13 13:31:01 +0200328if [ "${DOCKER_LOAD}" == "true" ]; then
329 # Load predefined Nexus image
330 docker load -i ${NEXUS_IMAGE_TAR}
331 # Load all necessary images
Tomáš Levora55b43662019-07-17 13:42:47 +0200332 for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
333 load_docker_images "${DOCKER_IMG_LIST}"
334 done
Tomáš Levorae878f032019-06-13 13:31:01 +0200335fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200336
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200337################################
338# Nexus repository preparation #
339################################
340
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200341# Prepare nexus-data directory
342if [ -d ${NEXUS_DATA_DIR} ]; then
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100343 if [ "$(docker ps -q -f name="${NEXUS_DOMAIN}")" ]; then
344 echo "Removing container ${NEXUS_DOMAIN}"
345 docker rm -f $(docker ps -aq -f name="${NEXUS_DOMAIN}")
346 fi
347 pushd ${NEXUS_DATA_DIR}/..
348 NXS_BACKUP="$(eval ${TIMESTAMP})_$(basename ${NEXUS_DATA_DIR})_bk"
349 mv ${NEXUS_DATA_DIR} "${NXS_BACKUP}"
350 echo "${NEXUS_DATA_DIR} already exists - backing up to ${NXS_BACKUP}"
351 popd
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200352fi
353
354mkdir -p ${NEXUS_DATA_DIR}
355chown 200:200 ${NEXUS_DATA_DIR}
356chmod 777 ${NEXUS_DATA_DIR}
357
358# Save Nexus version to prevent/catch data incompatibility
Tomáš Levora70ec9f42019-07-09 15:33:48 +0200359# Adding commit informations to have link to data from which the blob was built
360cat >> ${NEXUS_DATA_DIR}/nexus.ver << INFO
361nexus_image=$(docker image ls ${NEXUS_IMAGE} --no-trunc --format "{{.Repository}}:{{.Tag}}\nnexus_image_digest={{.ID}}")
362$(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)
363$(sed -n 's/^.*OOM\ commit\ /oom_repo_commit=/p' ${NXS_DOCKER_IMG_LISTS[@]})
364installer_repo_commit=$(git --git-dir="${LOCAL_PATH}/../.git" rev-parse HEAD)
365INFO
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200366
367# Start the Nexus
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100368NEXUS_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 +0200369echo "Waiting for Nexus to fully start"
Bartek Grzybowski65b93842020-10-22 12:46:17 +0200370until 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 +0200371 printf "."
372 sleep 3
373done
374echo -e "\nNexus started"
375
376# Configure the nexus repository
Bartek Grzybowski65b93842020-10-22 12:46:17 +0200377curl -sX POST --header 'Content-Type: application/json' --data-binary "${NEXUS_CONFIG}" http://${NEXUS_USERNAME}:${NEXUS_PASSWORD}@${NEXUS_HOST}:${NEXUS_PORT}/service/rest/v1/script
378curl -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 +0200379
380###########################
381# Populate NPM repository #
382###########################
Tomáš Levorabe748842019-09-04 13:56:53 +0200383if [ $NPM_PUSH == "true" ]; then
384 prepare_npm
385 pushd ${NXS_SRC_NPM_DIR}
386 for NPM_LIST in "${NXS_NPM_LISTS[@]}"; do
387 patch_npm "${NPM_LIST}"
388 push_npm "${NPM_LIST}"
389 done
390 popd
391 # Return default settings
392 npm logout
393 npm config set registry "https://registry.npmjs.org"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100394fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200395
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100396###############################
397## Populate PyPi repository #
398###############################
Tomáš Levorabe748842019-09-04 13:56:53 +0200399if [ $PYPI_PUSH == "true" ]; then
400 pushd ${NXS_SRC_PYPI_DIR}
401 for PYPI_LIST in "${NXS_PYPI_LISTS[@]}"; do
402 push_pip "${PYPI_LIST}"
403 done
404 popd
405fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200406
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100407###############################
408## Populate Docker repository #
409###############################
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200410
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200411# Login to docker registry simulated by Nexus container
Tomáš Levorabe748842019-09-04 13:56:53 +0200412# Push images to private nexus based on the lists
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200413# All images need to be tagged to simulated registry
414# and those without defined repository in tag use default repository 'library'
415docker_login
Tomáš Levora55b43662019-07-17 13:42:47 +0200416for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
Tomáš Levora55b43662019-07-17 13:42:47 +0200417 push_docker "${DOCKER_IMG_LIST}"
418done
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200419
420##############################
421# Stop the Nexus and cleanup #
422##############################
423
Bartek Grzybowski54286a32020-10-23 11:35:44 +0200424echo "Stopping Nexus"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100425
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200426# Stop the Nexus
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100427docker stop ${NEXUS_CONT_ID} > /dev/null
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200428
Bartek Grzybowski54286a32020-10-23 11:35:44 +0200429# Drop temporary Docker client config dir
430rm -rf ${DOCKER_CONFIG_DIR}
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200431
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100432echo "Nexus blob is built"
Tomáš Levora479673b2019-11-06 11:49:52 +0100433exit 0