blob: fe69181d97e89823a691eafa20c07311d987adf2 [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"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010040NEXUS_PORT="8081"
41NEXUS_DOCKER_PORT="8082"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010042DEFAULT_REGISTRY="docker.io"
Samuli Silvius9e9afd72018-12-21 14:23:51 +020043
44# Nexus repository credentials
45NEXUS_USERNAME=admin
46NEXUS_PASSWORD=admin123
47NEXUS_EMAIL=admin@example.org
48
Tomáš Levora8d272bd2019-03-12 15:06:35 +010049# Setting paths
50LOCAL_PATH="$(readlink -f $(dirname ${0}))"
Mateusz Pilatb12b4402019-05-23 15:55:56 +020051
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020052# Defaults
Tomáš Levorae878f032019-06-13 13:31:01 +020053DOCKER_LOAD="false"
Tomáš Levorabe748842019-09-04 13:56:53 +020054NPM_PUSH="false"
55PYPI_PUSH="false"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010056DATA_DIR="$(realpath ${LOCAL_PATH}/../../resources)"
Mateusz Pilatb12b4402019-05-23 15:55:56 +020057NEXUS_DATA_DIR="${DATA_DIR}/nexus_data"
Tomáš Levora8d272bd2019-03-12 15:06:35 +010058LISTS_DIR="${LOCAL_PATH}/data_lists"
59
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020060# Required dependencies
Tomáš Levorabe748842019-09-04 13:56:53 +020061COMMANDS=(jq docker)
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +020062
Mateusz Pilatb12b4402019-05-23 15:55:56 +020063usage () {
Tomáš Levora55b43662019-07-17 13:42:47 +020064 echo "
65 Usage: $(basename $0) [OPTION...] [FILE]...
Mateusz Pilatb12b4402019-05-23 15:55:56 +020066
Tomáš Levora55b43662019-07-17 13:42:47 +020067 This script prepares Nexus repositories data blobs for ONAP
68
69 Following dependencies are required: nodejs, jq, docker, twine, expect
70 By default, without any lists or dirs provided, the resources are expected as downloaded
71 during download process and default lists will be used to build the Nexus blob in the same
72 resources dir
73
74 Examples:
75 $(basename $0) --input-directory </path/to/downloaded/files/dir> -ld --output-directory
76 </path/to/output/dir> --resource-list-directory </path/to/dir/with/resource/list>
77 # Docker images, npms and pypi packages will be loaded from specified directory
78 # and the blob is created
79 $(basename $0) -d </path/to/docker/images/list> -d </path/to/another/docker/images/list>
80 -n </path/to/npm/list> -p </path/to/pip/list>
81 # Docker images, npms and pypi packages will be pushed to Nexus based and provided data
82 # lists (multiple lists can be provided)
83
84 -d | --docker use specific list of docker images to be pushed into Nexus
85 (in case of -ld used, this list will be used for loading of
86 the images)
87 -h | --help print this usage
88 -i | --input-directory use specific directory containing resources needed to
89 create nexus blob
90 The structure of this directory must organized as described
91 in build guide
92 -ld | --load-docker-images load docker images from resource directory
93 -n | --npm list of npm packages to be pushed into Nexus
94 -o | --output-directory use specific directory for the target blob
95 -p | --pypi use specific list of pypi packages to be pushed into Nexus
96 -rl | --resource-list-directory use specific directory with docker, pypi and npm lists
Bartek Grzybowski8583bf92020-10-21 13:58:05 +020097 -c | --container-name use specific Nexus docker container name
Mateusz Pilatb12b4402019-05-23 15:55:56 +020098 "
99 exit 1
100}
101
Tomáš Levora80594072019-07-11 10:38:23 +0200102publish_ports () {
103 for REGISTRY in $(sed -n '/\.[^/].*\//p' ${1} | sed -e 's/\/.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY} || true) ${NEXUS_PORT}; do
104 if [[ ${REGISTRY} != *":"* ]]; then
105 if [[ ${PUBLISHED_PORTS} != *"80:${NEXUS_DOCKER_PORT}"* ]]; then
106 PUBLISHED_PORTS="${PUBLISHED_PORTS} -p 80:${NEXUS_DOCKER_PORT}"
107 fi
108 else
109 REGISTRY_PORT="$(sed 's/^.*\:\([[:digit:]]*\)$/\1/' <<< ${REGISTRY})"
110 if [[ ${PUBLISHED_PORTS} != *"${REGISTRY_PORT}:${NEXUS_DOCKER_PORT}"* ]]; then
111 PUBLISHED_PORTS="${PUBLISHED_PORTS} -p ${REGISTRY_PORT}:${NEXUS_DOCKER_PORT}"
112 fi
113 fi
114 done
115}
116
117simulated_hosts () {
118 SIMUL_HOSTS=($(sed -n '/\.[^/].*\//p' ${1} | sed -e 's/\/.*$// ; s/:.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY} || true ) ${NEXUS_DOMAIN})
119 for HOST in "${SIMUL_HOSTS[@]}"; do
120 if ! grep -wq ${HOST} /etc/hosts; then
121 echo "127.0.0.1 ${HOST}" >> /etc/hosts
122 fi
123 done
124}
125
Tomáš Levorae878f032019-06-13 13:31:01 +0200126load_docker_images () {
127 for ARCHIVE in $(sed $'s/\r// ; /^#/d ; s/\:/\_/g ; s/\//\_/g ; s/$/\.tar/g' ${1} | awk '{ print $1 }'); do
128 docker load -i ${NXS_SRC_DOCKER_IMG_DIR}/${ARCHIVE}
129 done
130}
131
Tomáš Levorabe748842019-09-04 13:56:53 +0200132prepare_npm () {
133 # Configure NPM registry to our Nexus repository
134 echo "Configure NPM registry to ${NPM_REGISTRY}"
135 npm config set registry "${NPM_REGISTRY}"
136
137 # Login to NPM registry
138 /usr/bin/expect <<- EOF
139 spawn npm login
140 expect "Username:"
141 send "${NEXUS_USERNAME}\n"
142 expect "Password:"
143 send "${NEXUS_PASSWORD}\n"
144 expect Email:
145 send "${NEXUS_EMAIL}\n"
146 expect eof
147 EOF
148}
149
150patch_npm () {
151 # Patch problematic package
152 PATCHED_NPM="$(grep tsscmp ${1} | sed $'s/\r// ; s/\\@/\-/ ; s/$/\.tgz/')"
153 if [[ ! -z "${PATCHED_NPM}" ]] && ! zgrep -aq "${NPM_REGISTRY}" "${PATCHED_NPM}" 2>/dev/null
154 then
155 tar xzf "${PATCHED_NPM}"
156 rm -f "${PATCHED_NPM}"
157 sed -i 's|\"registry\":\ \".*\"|\"registry\":\ \"'"${NPM_REGISTRY}"'\"|g' package/package.json
158 tar -zcf "${PATCHED_NPM}" package
159 rm -rf package
160 fi
161}
162
Tomáš Levora80594072019-07-11 10:38:23 +0200163push_npm () {
164 for ARCHIVE in $(sed $'s/\r// ; s/\\@/\-/g ; s/$/\.tgz/g' ${1}); do
165 npm publish --access public ${ARCHIVE} > /dev/null
166 echo "NPM ${ARCHIVE} pushed to Nexus"
167 done
168}
169
170push_pip () {
Tomáš Levorabe748842019-09-04 13:56:53 +0200171 for PACKAGE in $(sed $'s/\r//; s/==/-/' ${1}); do
172 twine upload -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" --repository-url ${PYPI_REGISTRY} ${PACKAGE}* > /dev/null
Tomáš Levora80594072019-07-11 10:38:23 +0200173 echo "PYPI ${PACKAGE} pushed to Nexus"
Tomáš Levora55b43662019-07-17 13:42:47 +0200174 done
Tomáš Levora80594072019-07-11 10:38:23 +0200175}
176
177docker_login () {
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200178 if ! grep -wqs ${DOCKER_REGISTRY} ~/.docker/config.json; then
179 echo "Docker login to ${DOCKER_REGISTRY}"
180 echo -n "${NEXUS_PASSWORD}" | docker login -u "${NEXUS_USERNAME}" --password-stdin ${DOCKER_REGISTRY} > /dev/null
181 fi
Tomáš Levora80594072019-07-11 10:38:23 +0200182}
183
184push_docker () {
185 for IMAGE in $(sed $'s/\r// ; /^#/d' ${1} | awk '{ print $1 }'); do
186 PUSH=""
187 if [[ ${IMAGE} != *"/"* ]]; then
188 PUSH="${DOCKER_REGISTRY}/library/${IMAGE}"
189 elif [[ ${IMAGE} == *"${DEFAULT_REGISTRY}"* ]]; then
190 if [[ ${IMAGE} == *"/"*"/"* ]]; then
191 PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})"
192 else
193 PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'\/library/' <<< ${IMAGE})"
194 fi
195 elif [[ -z $(sed -n '/\.[^/].*\//p' <<< ${IMAGE}) ]]; then
196 PUSH="${DOCKER_REGISTRY}/${IMAGE}"
Tomáš Levora80594072019-07-11 10:38:23 +0200197 else
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200198 # substitute all host names with $DOCKER_REGISTRY
199 repo_host=$(sed -e 's/\/.*$//' <<< ${IMAGE})
200 PUSH="$(sed -e 's/'"${repo_host}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})"
Tomáš Levora80594072019-07-11 10:38:23 +0200201 fi
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200202 docker tag ${IMAGE} ${PUSH}
203 docker push ${PUSH}
204 # Remove created tag
205 docker rmi ${PUSH}
Tomáš Levora80594072019-07-11 10:38:23 +0200206 echo "${IMAGE} pushed as ${PUSH} to Nexus"
207 done
208}
209
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200210validate_container_name () {
211 # Verify $1 is a valid hostname
212 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])$";
213 then
214 echo "ERROR: ${1} is not a valid name!"
215 exit 1;
216 fi
217}
218
Tomáš Levorabe748842019-09-04 13:56:53 +0200219while [ "${1}" != "" ]; do
220 case ${1} in
221 -d | --docker ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100222 NXS_DOCKER_IMG_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200223 ;;
224 -i | --input-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100225 DATA_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200226 ;;
227 -ld | --load-docker-images ) DOCKER_LOAD="true"
228 ;;
229 -n | --npm ) NPM_PUSH="true"
230 COMMANDS+=(expect npm)
231 shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100232 NXS_NPM_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200233 ;;
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200234 -c | --container-name ) shift
235 validate_container_name "${1}"
236 NEXUS_DOMAIN="${1}"
237 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200238 -o | --output-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100239 NEXUS_DATA_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200240 ;;
241 -p | --pypi ) PYPI_PUSH="true"
242 COMMANDS+=(twine)
243 shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100244 NXS_PYPI_LISTS+=("$(realpath ${1})")
Tomáš Levorabe748842019-09-04 13:56:53 +0200245 ;;
246 -rl | --resource-list-directory ) shift
Tomáš Levora479673b2019-11-06 11:49:52 +0100247 LISTS_DIR="$(realpath ${1})"
Tomáš Levorabe748842019-09-04 13:56:53 +0200248 ;;
249 -h | --help ) usage
250 ;;
251 *) usage
Tomáš Levora479673b2019-11-06 11:49:52 +0100252 ;;
Tomáš Levorabe748842019-09-04 13:56:53 +0200253 esac
254 shift
255done
256
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200257# Verify all dependencies are available in PATH
258FAILED_COMMANDS=()
Tomáš Levora55b43662019-07-17 13:42:47 +0200259for cmd in ${COMMANDS[*]}; do
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200260 command -v $cmd >/dev/null 2>&1 || FAILED_COMMANDS+=($cmd)
261done
Tomáš Levora55b43662019-07-17 13:42:47 +0200262
263if [ ${#FAILED_COMMANDS[*]} -gt 0 ]; then
Bartek Grzybowski60e2e9a2019-07-02 10:15:36 +0200264 echo "Following commands where not found in PATH and are required:"
265 echo ${FAILED_COMMANDS[*]}
266 echo "Aborting."
267 exit 1
268fi
269
Bartek Grzybowski8583bf92020-10-21 13:58:05 +0200270# Nexus repository locations
271NPM_REGISTRY="http://${NEXUS_DOMAIN}:${NEXUS_PORT}/repository/npm-private/"
272PYPI_REGISTRY="http://${NEXUS_DOMAIN}:${NEXUS_PORT}/repository/pypi-private/"
273DOCKER_REGISTRY="${NEXUS_DOMAIN}:${NEXUS_DOCKER_PORT}"
274
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100275# Setup directories with resources for docker, npm and pypi
276NXS_SRC_DOCKER_IMG_DIR="${DATA_DIR}/offline_data/docker_images_for_nexus"
277NXS_SRC_NPM_DIR="${DATA_DIR}/offline_data/npm_tar"
278NXS_SRC_PYPI_DIR="${DATA_DIR}/offline_data/pypi"
279
Tomáš Levorafeaa6b42019-05-29 09:45:29 +0200280# Setup specific resources lists
Tomáš Levora55b43662019-07-17 13:42:47 +0200281NXS_INFRA_LIST="${LISTS_DIR}/infra_docker_images.list"
Tomáš Levorafeaa6b42019-05-29 09:45:29 +0200282NXS_DOCKER_IMG_LIST="${LISTS_DIR}/onap_docker_images.list"
Tomáš Levora55b43662019-07-17 13:42:47 +0200283NXS_RKE_DOCKER_IMG_LIST="${LISTS_DIR}/rke_docker_images.list"
Tomáš Levora39505562019-10-03 13:31:54 +0200284NXS_K8S_DOCKER_IMG_LIST="${LISTS_DIR}/k8s_docker_images.list"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100285
286# Setup Nexus image used for build and install infra
Tomáš Levora55b43662019-07-17 13:42:47 +0200287NEXUS_IMAGE="$(grep sonatype/nexus3 ${NXS_INFRA_LIST})"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100288NEXUS_IMAGE_TAR="${DATA_DIR}/offline_data/docker_images_infra/$(sed 's/\//\_/ ; s/$/\.tar/ ; s/\:/\_/' <<< ${NEXUS_IMAGE})"
289
Tomáš Levora55b43662019-07-17 13:42:47 +0200290# Set default lists if nothing specific defined by user
Tomáš Levorabe748842019-09-04 13:56:53 +0200291if [ ${#NXS_DOCKER_IMG_LISTS[@]} -eq 0 ]; then
Tomáš Levora39505562019-10-03 13:31:54 +0200292 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 +0200293fi
294
Tomáš Levora80594072019-07-11 10:38:23 +0200295# Backup /etc/hosts
296HOSTS_BACKUP="$(eval ${TIMESTAMP}_hosts.bk)"
297cp /etc/hosts /etc/${HOSTS_BACKUP}
298
299# Backup the current docker registry settings
300if [ -f ~/.docker/config.json ]; then
301 DOCKER_CONF_BACKUP="$(eval ${TIMESTAMP}_config.json.bk)"
302 mv ~/.docker/config.json ~/.docker/${DOCKER_CONF_BACKUP}
303fi
304
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100305# Setup default ports published to host as docker registry
306PUBLISHED_PORTS="-p ${NEXUS_PORT}:${NEXUS_PORT} -p ${NEXUS_DOCKER_PORT}:${NEXUS_DOCKER_PORT}"
307
308# Setup additional ports published to host based on simulated docker registries
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100309# Setup simulated domain names to be able to push all to private Nexus repository
Tomáš Levora55b43662019-07-17 13:42:47 +0200310for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
311 publish_ports "${DOCKER_IMG_LIST}"
312 simulated_hosts "${DOCKER_IMG_LIST}"
313done
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200314
315# Nexus repository configuration setup
316NEXUS_CONFIG_GROOVY='import org.sonatype.nexus.security.realm.RealmManager
317import org.sonatype.nexus.repository.attributes.AttributesFacet
318import org.sonatype.nexus.security.user.UserManager
319import org.sonatype.nexus.repository.manager.RepositoryManager
320import org.sonatype.nexus.security.user.UserNotFoundException
321/* Use the container to look up some services. */
322realmManager = container.lookup(RealmManager.class)
323userManager = container.lookup(UserManager.class, "default") //default user manager
324repositoryManager = container.lookup(RepositoryManager.class)
325/* Managers are used when scripting api cannot. Note that scripting api can only create mostly, and that creation methods return objects of created entities. */
326/* Perform cleanup by removing all repos and users. Realms do not need to be re-disabled, admin and anonymous user will not be removed. */
327userManager.listUserIds().each({ id ->
328 if (id != "anonymous" && id != "admin")
329 userManager.deleteUser(id)
330})
331repositoryManager.browse().each {
332 repositoryManager.delete(it.getName())
333}
334/* Add bearer token realms at the end of realm lists... */
335realmManager.enableRealm("NpmToken")
336realmManager.enableRealm("DockerToken")
Tomáš Levora1d902342019-02-05 10:01:43 +0100337realmManager.enableRealm("PypiToken")
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200338/* Create the docker user. */
339security.addUser("docker", "docker", "docker", "docker@example.com", true, "docker", ["nx-anonymous"])
Tomáš Levora1d902342019-02-05 10:01:43 +0100340/* 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 +0200341repository.createNpmHosted("npm-private")
Tomáš Levora1d902342019-02-05 10:01:43 +0100342repository.createPyPiHosted("pypi-private")
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200343def r = repository.createDockerHosted("onap", 8082, 0)
344/* force basic authentication true by default, must set to false for docker repo. */
345conf=r.getConfiguration()
346conf.attributes("docker").set("forceBasicAuth", false)
347repositoryManager.update(conf)'
348
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100349# Prepare the Nexus configuration
350NEXUS_CONFIG=$(echo "${NEXUS_CONFIG_GROOVY}" | jq -Rsc '{"name":"configure", "type":"groovy", "content":.}')
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200351
352#################################
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200353# Docker repository preparation #
354#################################
355
Tomáš Levorae878f032019-06-13 13:31:01 +0200356if [ "${DOCKER_LOAD}" == "true" ]; then
357 # Load predefined Nexus image
358 docker load -i ${NEXUS_IMAGE_TAR}
359 # Load all necessary images
Tomáš Levora55b43662019-07-17 13:42:47 +0200360 for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
361 load_docker_images "${DOCKER_IMG_LIST}"
362 done
Tomáš Levorae878f032019-06-13 13:31:01 +0200363fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200364
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200365################################
366# Nexus repository preparation #
367################################
368
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200369# Prepare nexus-data directory
370if [ -d ${NEXUS_DATA_DIR} ]; then
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100371 if [ "$(docker ps -q -f name="${NEXUS_DOMAIN}")" ]; then
372 echo "Removing container ${NEXUS_DOMAIN}"
373 docker rm -f $(docker ps -aq -f name="${NEXUS_DOMAIN}")
374 fi
375 pushd ${NEXUS_DATA_DIR}/..
376 NXS_BACKUP="$(eval ${TIMESTAMP})_$(basename ${NEXUS_DATA_DIR})_bk"
377 mv ${NEXUS_DATA_DIR} "${NXS_BACKUP}"
378 echo "${NEXUS_DATA_DIR} already exists - backing up to ${NXS_BACKUP}"
379 popd
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200380fi
381
382mkdir -p ${NEXUS_DATA_DIR}
383chown 200:200 ${NEXUS_DATA_DIR}
384chmod 777 ${NEXUS_DATA_DIR}
385
386# Save Nexus version to prevent/catch data incompatibility
Tomáš Levora70ec9f42019-07-09 15:33:48 +0200387# Adding commit informations to have link to data from which the blob was built
388cat >> ${NEXUS_DATA_DIR}/nexus.ver << INFO
389nexus_image=$(docker image ls ${NEXUS_IMAGE} --no-trunc --format "{{.Repository}}:{{.Tag}}\nnexus_image_digest={{.ID}}")
390$(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)
391$(sed -n 's/^.*OOM\ commit\ /oom_repo_commit=/p' ${NXS_DOCKER_IMG_LISTS[@]})
392installer_repo_commit=$(git --git-dir="${LOCAL_PATH}/../.git" rev-parse HEAD)
393INFO
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200394
395# Start the Nexus
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100396NEXUS_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 +0200397echo "Waiting for Nexus to fully start"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100398until curl -su ${NEXUS_USERNAME}:${NEXUS_PASSWORD} http://${NEXUS_DOMAIN}:${NEXUS_PORT}/service/metrics/healthcheck | grep '"healthy":true' > /dev/null ; do
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200399 printf "."
400 sleep 3
401done
402echo -e "\nNexus started"
403
404# Configure the nexus repository
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100405curl -sX POST --header 'Content-Type: application/json' --data-binary "${NEXUS_CONFIG}" http://${NEXUS_USERNAME}:${NEXUS_PASSWORD}@${NEXUS_DOMAIN}:${NEXUS_PORT}/service/rest/v1/script
406curl -sX POST --header "Content-Type: text/plain" http://${NEXUS_USERNAME}:${NEXUS_PASSWORD}@${NEXUS_DOMAIN}:${NEXUS_PORT}/service/rest/v1/script/configure/run > /dev/null
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200407
408###########################
409# Populate NPM repository #
410###########################
Tomáš Levorabe748842019-09-04 13:56:53 +0200411if [ $NPM_PUSH == "true" ]; then
412 prepare_npm
413 pushd ${NXS_SRC_NPM_DIR}
414 for NPM_LIST in "${NXS_NPM_LISTS[@]}"; do
415 patch_npm "${NPM_LIST}"
416 push_npm "${NPM_LIST}"
417 done
418 popd
419 # Return default settings
420 npm logout
421 npm config set registry "https://registry.npmjs.org"
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100422fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200423
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100424###############################
425## Populate PyPi repository #
426###############################
Tomáš Levorabe748842019-09-04 13:56:53 +0200427if [ $PYPI_PUSH == "true" ]; then
428 pushd ${NXS_SRC_PYPI_DIR}
429 for PYPI_LIST in "${NXS_PYPI_LISTS[@]}"; do
430 push_pip "${PYPI_LIST}"
431 done
432 popd
433fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200434
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100435###############################
436## Populate Docker repository #
437###############################
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200438
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200439# Login to docker registry simulated by Nexus container
Tomáš Levorabe748842019-09-04 13:56:53 +0200440# Push images to private nexus based on the lists
Bartek Grzybowski15d5ffb2020-10-22 11:40:20 +0200441# All images need to be tagged to simulated registry
442# and those without defined repository in tag use default repository 'library'
443docker_login
Tomáš Levora55b43662019-07-17 13:42:47 +0200444for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do
Tomáš Levora55b43662019-07-17 13:42:47 +0200445 push_docker "${DOCKER_IMG_LIST}"
446done
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200447
448##############################
449# Stop the Nexus and cleanup #
450##############################
451
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100452echo "Stopping Nexus and returning backups"
453
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200454# Stop the Nexus
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100455docker stop ${NEXUS_CONT_ID} > /dev/null
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200456
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100457# Return backed up configuration files
Tomáš Levora80594072019-07-11 10:38:23 +0200458mv -f "/etc/${HOSTS_BACKUP}" /etc/hosts
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200459
Tomáš Levora20d3b8a2019-07-09 14:07:08 +0200460if [ -f ~/.docker/${DOCKER_CONF_BACKUP} ]; then
461 mv -f ~/.docker/${DOCKER_CONF_BACKUP} ~/.docker/config.json
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100462fi
Samuli Silvius9e9afd72018-12-21 14:23:51 +0200463
Tomáš Levora8d272bd2019-03-12 15:06:35 +0100464echo "Nexus blob is built"
Tomáš Levora479673b2019-11-06 11:49:52 +0100465exit 0