diff options
-rw-r--r-- | .gitreview | 4 | ||||
-rw-r--r-- | INFO.yaml | 72 | ||||
-rw-r--r-- | ansible/roles/rke/molecule/default/prepare.yml | 3 | ||||
-rw-r--r-- | ansible/test/roles/prepare-rke/tasks/infra.yml | 6 | ||||
-rwxr-xr-x | build/build_nexus_blob.sh | 228 | ||||
-rw-r--r-- | build/download/requirements.txt | 2 | ||||
-rwxr-xr-x | build/fetch_and_patch_charts.sh | 70 | ||||
-rwxr-xr-x | build/package.py | 2 | ||||
-rw-r--r-- | build/requirements.txt | 2 |
9 files changed, 233 insertions, 156 deletions
diff --git a/.gitreview b/.gitreview new file mode 100644 index 00000000..7c81745f --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=gerrit.onap.org +port=29418 +project=oom/offline-installer.git diff --git a/INFO.yaml b/INFO.yaml new file mode 100644 index 00000000..e2ddfecf --- /dev/null +++ b/INFO.yaml @@ -0,0 +1,72 @@ +--- +project: 'oom-offline-installer' +project_creation_date: '2018-12-14' +lifecycle_state: 'Incubation' +project_category: '' +project_lead: &onap_releng_ptl + name: 'Mike Elliott' + email: 'mike.elliott@amdocs.com' + id: 'melliott' + company: 'Amdocs' + timezone: 'Canada/Ontario' +primary_contact: *onap_releng_ptl +issue_tracking: + type: 'jira' + url: 'https://jira.onap.org/projects/OOM' + key: 'OOM' +mailing_list: + type: 'groups.io' + url: 'lists.onap.org' + tag: '<[sub-project_name]>' +realtime_discussion: '' +meetings: + - type: 'zoom' + agenda: 'https://wiki.onap.org/pages/viewpage.action?pageId=8228913' + url: 'https://wiki.onap.org/pages/viewpage.action?pageId=8228913' + server: 'n/a' + channel: 'n/a' + repeats: 'weekly' + time: '14:00 UTC' +repositories: + - 'oom' + - 'oom-offline-installer' + - 'oom-registrator' +committers: + - <<: *onap_releng_ptl + - name: 'Michal Ptacek' + email: 'm.ptacek@partner.samsung.com' + company: 'Samsung' + id: 'Michal.Ptacek' + timezone: 'Europe/Prague' + - name: 'Samuli Silvius' + email: 's.silvius@partner.samsung.com' + company: 'Samsung' + id: 'silvius' + timezone: 'Europe/Helsinky' + - name: 'Petr Ospaly' + email: 'p.ospaly@partner.samsung.com' + company: 'Samsung' + id: 'p.ospaly' + timezone: 'Europe/Prague' + - name: 'Tomas Levora' + email: 't.levora@partner.samsung.com' + company: 'Samsung' + id: 't.levora' + timezone: 'Europe/Prague' + - name: 'Milan Verespej' + email: 'm.verespej@partner.samsung.com' + company: 'Samsung' + id: 'milan.verespej' + timezone: 'Europe/Prague' + - name: 'Bartlomiej Grzybowski' + email: 'b.grzybowski@partner.samsung.com' + company: 'Samsung' + id: 'bgrzybowski' + timezone: 'Europe/Warsaw' + - name: 'Michal Zegan' + email: 'm.zegan@samsung.com' + company: 'Samsung' + id: 'm.zegan' + timezone: 'Europe/Warsaw' +tsc: + approval: 'https://lists.onap.org/pipermail/onap-tsc' diff --git a/ansible/roles/rke/molecule/default/prepare.yml b/ansible/roles/rke/molecule/default/prepare.yml index 6bad2b80..b012790a 100644 --- a/ansible/roles/rke/molecule/default/prepare.yml +++ b/ansible/roles/rke/molecule/default/prepare.yml @@ -13,3 +13,6 @@ - role: prepare-rke vars: mode: infra + - role: prepare-kubectl + vars: + kubectl_install: true diff --git a/ansible/test/roles/prepare-rke/tasks/infra.yml b/ansible/test/roles/prepare-rke/tasks/infra.yml index e9971f77..6e7bcb96 100644 --- a/ansible/test/roles/prepare-rke/tasks/infra.yml +++ b/ansible/test/roles/prepare-rke/tasks/infra.yml @@ -8,9 +8,3 @@ get_url: url: "https://github.com/rancher/rke/releases/download/v{{ rke_version }}/rke_linux-amd64" dest: "{{ app_data_path }}/downloads/rke_linux-amd64" - -- name: "Install kubectl-{{ kubectl_version }}" - get_url: - url: "https://storage.googleapis.com/kubernetes-release/release/v{{ kubectl_version }}/bin/linux/amd64/kubectl" - dest: "/usr/local/bin/kubectl" - mode: 0755 diff --git a/build/build_nexus_blob.sh b/build/build_nexus_blob.sh index 6ecab695..58f0f83f 100755 --- a/build/build_nexus_blob.sh +++ b/build/build_nexus_blob.sh @@ -62,31 +62,127 @@ LISTS_DIR="${LOCAL_PATH}/data_lists" COMMANDS=(jq docker expect npm twine) usage () { - echo " Example usage: build_nexus_blob.sh --input-directory </path/to/downloaded/files/dir> --output-directory - </path/to/output/dir> --resource-list-directory </path/to/dir/with/resource/list> [--load-docker-images] - - -i | --input-directory directory containing file needed to create nexus blob. The structure of this directory must organized as described in build guide - -ld | --load-docker-images load docker images from stored files in the input directory - -o | --output-directory - -rl | --resource-list-directory directory with files containing docker, pypi and npm lists + echo " + Usage: $(basename $0) [OPTION...] [FILE]... + + This script prepares Nexus repositories data blobs for ONAP + + Following dependencies are required: nodejs, jq, docker, twine, expect + By default, without any lists or dirs provided, the resources are expected as downloaded + during download process and default lists will be used to build the Nexus blob in the same + resources dir + + Examples: + $(basename $0) --input-directory </path/to/downloaded/files/dir> -ld --output-directory + </path/to/output/dir> --resource-list-directory </path/to/dir/with/resource/list> + # Docker images, npms and pypi packages will be loaded from specified directory + # and the blob is created + $(basename $0) -d </path/to/docker/images/list> -d </path/to/another/docker/images/list> + -n </path/to/npm/list> -p </path/to/pip/list> + # Docker images, npms and pypi packages will be pushed to Nexus based and provided data + # lists (multiple lists can be provided) + + -d | --docker use specific list of docker images to be pushed into Nexus + (in case of -ld used, this list will be used for loading of + the images) + -h | --help print this usage + -i | --input-directory use specific directory containing resources needed to + create nexus blob + The structure of this directory must organized as described + in build guide + -ld | --load-docker-images load docker images from resource directory + -n | --npm list of npm packages to be pushed into Nexus + -o | --output-directory use specific directory for the target blob + -p | --pypi use specific list of pypi packages to be pushed into Nexus + -rl | --resource-list-directory use specific directory with docker, pypi and npm lists " exit 1 } +publish_ports () { + for REGISTRY in $(sed -n '/\.[^/].*\//p' ${1} | sed -e 's/\/.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY} || true) ${NEXUS_PORT}; do + if [[ ${REGISTRY} != *":"* ]]; then + if [[ ${PUBLISHED_PORTS} != *"80:${NEXUS_DOCKER_PORT}"* ]]; then + PUBLISHED_PORTS="${PUBLISHED_PORTS} -p 80:${NEXUS_DOCKER_PORT}" + fi + else + REGISTRY_PORT="$(sed 's/^.*\:\([[:digit:]]*\)$/\1/' <<< ${REGISTRY})" + if [[ ${PUBLISHED_PORTS} != *"${REGISTRY_PORT}:${NEXUS_DOCKER_PORT}"* ]]; then + PUBLISHED_PORTS="${PUBLISHED_PORTS} -p ${REGISTRY_PORT}:${NEXUS_DOCKER_PORT}" + fi + fi + done +} + +simulated_hosts () { + SIMUL_HOSTS=($(sed -n '/\.[^/].*\//p' ${1} | sed -e 's/\/.*$// ; s/:.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY} || true ) ${NEXUS_DOMAIN}) + for HOST in "${SIMUL_HOSTS[@]}"; do + if ! grep -wq ${HOST} /etc/hosts; then + echo "127.0.0.1 ${HOST}" >> /etc/hosts + fi + done +} + load_docker_images () { for ARCHIVE in $(sed $'s/\r// ; /^#/d ; s/\:/\_/g ; s/\//\_/g ; s/$/\.tar/g' ${1} | awk '{ print $1 }'); do docker load -i ${NXS_SRC_DOCKER_IMG_DIR}/${ARCHIVE} done } +push_npm () { + for ARCHIVE in $(sed $'s/\r// ; s/\\@/\-/g ; s/$/\.tgz/g' ${1}); do + npm publish --access public ${ARCHIVE} > /dev/null + echo "NPM ${ARCHIVE} pushed to Nexus" + done +} + +push_pip () { + for PACKAGE in $(sed $'s/\r//; s/==/-/' ${NXS_PYPI_LIST}); do + twine upload -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" --repository-url ${PYPI_REGISTRY} ${PACKAGE}* + echo "PYPI ${PACKAGE} pushed to Nexus" + done +} + +docker_login () { + for REGISTRY in $(sed -n '/\.[^/].*\//p' ${1} | sed -e 's/\/.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY}) ${DOCKER_REGISTRY}; do + if ! grep -wq ${REGISTRY} ~/.docker/config.json; then + echo "Docker login to ${REGISTRY}" + docker login -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" ${REGISTRY} > /dev/null + fi + done +} + +push_docker () { + for IMAGE in $(sed $'s/\r// ; /^#/d' ${1} | awk '{ print $1 }'); do + PUSH="" + if [[ ${IMAGE} != *"/"* ]]; then + PUSH="${DOCKER_REGISTRY}/library/${IMAGE}" + elif [[ ${IMAGE} == *"${DEFAULT_REGISTRY}"* ]]; then + if [[ ${IMAGE} == *"/"*"/"* ]]; then + PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})" + else + PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'\/library/' <<< ${IMAGE})" + fi + elif [[ -z $(sed -n '/\.[^/].*\//p' <<< ${IMAGE}) ]]; then + PUSH="${DOCKER_REGISTRY}/${IMAGE}" + fi + if [[ ! -z ${PUSH} ]]; then + docker tag ${IMAGE} ${PUSH} + else + PUSH="${IMAGE}" + fi + docker push ${PUSH} + echo "${IMAGE} pushed as ${PUSH} to Nexus" + done +} + # Verify all dependencies are available in PATH FAILED_COMMANDS=() -for cmd in ${COMMANDS[*]}; -do +for cmd in ${COMMANDS[*]}; do command -v $cmd >/dev/null 2>&1 || FAILED_COMMANDS+=($cmd) done -if [ ${#FAILED_COMMANDS[*]} -gt 0 ]; -then + +if [ ${#FAILED_COMMANDS[*]} -gt 0 ]; then echo "Following commands where not found in PATH and are required:" echo ${FAILED_COMMANDS[*]} echo "Aborting." @@ -95,14 +191,23 @@ fi while [ "${1}" != "" ]; do case ${1} in + -d | --docker ) shift + NXS_DOCKER_IMG_LISTS+=("${1}") + ;; -i | --input-directory ) shift DATA_DIR="${1}" ;; -ld | --load-docker-images ) DOCKER_LOAD="true" ;; + -n | --npm ) shift + NXS_NPM_LISTS+=("${1}") + ;; -o | --output-directory ) shift NEXUS_DATA_DIR="${1}" ;; + -p | --pypi ) shift + NXS_PYPI_LISTS+=("${1}") + ;; -rl | --resource-list-directory ) shift LISTS_DIR="${1}" ;; @@ -119,34 +224,42 @@ NXS_SRC_NPM_DIR="${DATA_DIR}/offline_data/npm_tar" NXS_SRC_PYPI_DIR="${DATA_DIR}/offline_data/pypi" # Setup specific resources lists +NXS_INFRA_LIST="${LISTS_DIR}/infra_docker_images.list" NXS_DOCKER_IMG_LIST="${LISTS_DIR}/onap_docker_images.list" +NXS_RKE_DOCKER_IMG_LIST="${LISTS_DIR}/rke_docker_images.list" NXS_NPM_LIST="${LISTS_DIR}/onap_npm.list" NXS_PYPI_LIST="${LISTS_DIR}/onap_pip_packages.list" # Setup Nexus image used for build and install infra -INFRA_LIST="${LISTS_DIR}/infra_docker_images.list" -NEXUS_IMAGE="$(grep sonatype/nexus3 ${INFRA_LIST})" +NEXUS_IMAGE="$(grep sonatype/nexus3 ${NXS_INFRA_LIST})" NEXUS_IMAGE_TAR="${DATA_DIR}/offline_data/docker_images_infra/$(sed 's/\//\_/ ; s/$/\.tar/ ; s/\:/\_/' <<< ${NEXUS_IMAGE})" +# Set default lists if nothing specific defined by user +if [ $((${#NXS_DOCKER_IMG_LISTS[@]} + ${#NXS_NPM_LISTS[@]} + ${#NXS_PYPI_LISTS[@]})) -eq 0 ]; then + NXS_DOCKER_IMG_LISTS=("${NXS_DOCKER_IMG_LIST}" "${NXS_RKE_DOCKER_IMG_LIST}") + NXS_NPM_LISTS[0]="${NXS_NPM_LIST}" + NXS_PYPI_LISTS[0]="${NXS_PYPI_LIST}" +fi + +# Backup /etc/hosts +HOSTS_BACKUP="$(eval ${TIMESTAMP}_hosts.bk)" +cp /etc/hosts /etc/${HOSTS_BACKUP} + +# Backup the current docker registry settings +if [ -f ~/.docker/config.json ]; then + DOCKER_CONF_BACKUP="$(eval ${TIMESTAMP}_config.json.bk)" + mv ~/.docker/config.json ~/.docker/${DOCKER_CONF_BACKUP} +fi + # Setup default ports published to host as docker registry PUBLISHED_PORTS="-p ${NEXUS_PORT}:${NEXUS_PORT} -p ${NEXUS_DOCKER_PORT}:${NEXUS_DOCKER_PORT}" # Setup additional ports published to host based on simulated docker registries -for REGISTRY in $(sed -n '/\.[^/].*\//p' ${NXS_DOCKER_IMG_LIST} | sed -e 's/\/.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY} || true); do - if [[ ${REGISTRY} != *":"* ]]; then - if [[ ${PUBLISHED_PORTS} != *"80:${NEXUS_DOCKER_PORT}"* ]]; then - PUBLISHED_PORTS="${PUBLISHED_PORTS} -p 80:${NEXUS_DOCKER_PORT}" - fi - else - REGISTRY_PORT="$(sed 's/^.*\:\([[:digit:]]*\)$/\1/' <<< ${REGISTRY})" - if [[ ${PUBLISHED_PORTS} != *"${REGISTRY_PORT}:${NEXUS_DOCKER_PORT}"* ]]; then - PUBLISHED_PORTS="${PUBLISHED_PORTS} -p ${REGISTRY_PORT}:${NEXUS_DOCKER_PORT}" - fi - fi -done - # Setup simulated domain names to be able to push all to private Nexus repository -SIMUL_HOSTS="$(sed -n '/\.[^/].*\//p' ${NXS_DOCKER_IMG_LIST} | sed -e 's/\/.*$// ; s/:.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY} || true) ${NEXUS_DOMAIN}" +for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do + publish_ports "${DOCKER_IMG_LIST}" + simulated_hosts "${DOCKER_IMG_LIST}" +done # Nexus repository configuration setup NEXUS_CONFIG_GROOVY='import org.sonatype.nexus.security.realm.RealmManager @@ -186,23 +299,6 @@ repositoryManager.update(conf)' NEXUS_CONFIG=$(echo "${NEXUS_CONFIG_GROOVY}" | jq -Rsc '{"name":"configure", "type":"groovy", "content":.}') ################################# -# Prepare the local environment # -################################# - -# Add simulated domain names to /etc/hosts -HOSTS_BACKUP="$(eval ${TIMESTAMP}_hosts.bk)" -cp /etc/hosts /etc/${HOSTS_BACKUP} -for DNS in ${SIMUL_HOSTS}; do - echo "127.0.0.1 ${DNS}" >> /etc/hosts -done - -# Backup the current docker registry settings -if [ -f ~/.docker/config.json ]; then - DOCKER_CONF_BACKUP="$(eval ${TIMESTAMP}_config.json.bk)" - mv ~/.docker/config.json ~/.docker/${DOCKER_CONF_BACKUP} -fi - -################################# # Docker repository preparation # ################################# @@ -210,7 +306,9 @@ if [ "${DOCKER_LOAD}" == "true" ]; then # Load predefined Nexus image docker load -i ${NEXUS_IMAGE_TAR} # Load all necessary images - load_docker_images ${NXS_DOCKER_IMG_LIST} + for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do + load_docker_images "${DOCKER_IMG_LIST}" + done fi ################################ @@ -282,9 +380,8 @@ if [[ ! -z "${PATCHED_NPM}" ]] && ! zgrep -aq "${NPM_REGISTRY}" "${PATCHED_NPM}" fi # Push NPM packages to Nexus repository -for ARCHIVE in $(sed $'s/\r// ; s/\\@/\-/g ; s/$/\.tgz/g' ${NXS_NPM_LIST});do - npm publish --access public ${ARCHIVE} > /dev/null - echo "NPM ${ARCHIVE} pushed to Nexus" +for NPM_LIST in "${NXS_NPM_LISTS[@]}"; do + push_npm "${NPM_LIST}" done popd @@ -293,9 +390,8 @@ popd ############################### pushd ${NXS_SRC_PYPI_DIR} -for PACKAGE in $(sed $'s/\r//; s/==/-/' ${NXS_PYPI_LIST}); do - twine upload -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" --repository-url ${PYPI_REGISTRY} ${PACKAGE}* - echo "PYPI ${PACKAGE} pushed to Nexus" +for PYPI_LIST in "${NXS_PYPI_LISTS[@]}"; do + push_pip "${PYPI_LIST}" done popd @@ -304,34 +400,12 @@ popd ############################### # Login to simulated docker registries -for REGISTRY in $(sed -n '/\.[^/].*\//p' ${NXS_DOCKER_IMG_LIST} | sed -e 's/\/.*$//' | sort -u | grep -v ${DEFAULT_REGISTRY}) ${DOCKER_REGISTRY}; do - echo "Docker login to ${REGISTRY}" - docker login -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}" ${REGISTRY} > /dev/null -done - # Push images to private nexus based on the list # Images from default registry need to be tagged to private registry # and those without defined repository in tag uses default repository 'library' -for IMAGE in $(sed $'s/\r// ; /^#/d' ${NXS_DOCKER_IMG_LIST} | awk '{ print $1 }'); do - PUSH="" - if [[ ${IMAGE} != *"/"* ]]; then - PUSH="${DOCKER_REGISTRY}/library/${IMAGE}" - elif [[ ${IMAGE} == *"${DEFAULT_REGISTRY}"* ]]; then - if [[ ${IMAGE} == *"/"*"/"* ]]; then - PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'/' <<< ${IMAGE})" - else - PUSH="$(sed 's/'"${DEFAULT_REGISTRY}"'/'"${DOCKER_REGISTRY}"'\/library/' <<< ${IMAGE})" - fi - elif [[ -z $(sed -n '/\.[^/].*\//p' <<< ${IMAGE}) ]]; then - PUSH="${DOCKER_REGISTRY}/${IMAGE}" - fi - if [[ ! -z ${PUSH} ]]; then - docker tag ${IMAGE} ${PUSH} - else - PUSH="${IMAGE}" - fi - docker push ${PUSH} - echo "${IMAGE} pushed as ${PUSH} to Nexus" +for DOCKER_IMG_LIST in "${NXS_DOCKER_IMG_LISTS[@]}"; do + docker_login "${DOCKER_IMG_LIST}" + push_docker "${DOCKER_IMG_LIST}" done ############################## @@ -344,7 +418,7 @@ echo "Stopping Nexus and returning backups" docker stop ${NEXUS_CONT_ID} > /dev/null # Return backed up configuration files -mv -f /etc/${HOSTS_BACKUP} /etc/hosts +mv -f "/etc/${HOSTS_BACKUP}" /etc/hosts if [ -f ~/.docker/${DOCKER_CONF_BACKUP} ]; then mv -f ~/.docker/${DOCKER_CONF_BACKUP} ~/.docker/config.json diff --git a/build/download/requirements.txt b/build/download/requirements.txt index 3eee2a2f..681c0dd5 100644 --- a/build/download/requirements.txt +++ b/build/download/requirements.txt @@ -1,3 +1,3 @@ -docker==3.7.2 +docker>=3.7.2 prettytable==0.7.2 retrying==1.3.3 diff --git a/build/fetch_and_patch_charts.sh b/build/fetch_and_patch_charts.sh deleted file mode 100755 index 22d45e66..00000000 --- a/build/fetch_and_patch_charts.sh +++ /dev/null @@ -1,70 +0,0 @@ -#! /usr/bin/env bash - -# COPYRIGHT NOTICE STARTS HERE -# -# Copyright 2018 © Samsung Electronics Co., Ltd. -# -# 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. -# -# COPYRIGHT NOTICE ENDS HERE - -# This simple script should be used during build / packaging process -# and it should be referenced in BuildGuide. -# Patching of helm charts is the only way for OOM charts to be compatible -# with this offline installer. This will become obsolete once native -# solution is implemented in charts themselves and which is tracked -# in OOM-1610 - -# fail fast -set -e - -# colours -_R='\033[0;31;1m' #Red -_G='\033[0;32;1m' #Green -_Y='\033[0;33;1m' #Yellow -C_='\033[0m' #Color off - -usage () { - echo "Usage:" - echo -e "./$(basename $0) <helm charts repo> <commit/tag/branch> <patchfile> <target_dir>\n" - echo "Example: ./$(basename $0) https://gerrit.onap.org/r/oom master /root/offline-installer/patches/onap.patch /root/offline-installer/ansible/application/helm_charts" -} - -if [ "$#" -ne 4 ]; then - echo "This script should get exactly 4 arguments!" - echo -e "Wrong number of parameters provided\n" - usage - exit 1 -fi - -# main -# git and patch tools are preconditions for this to work -CURR=1 -TOTAL=5 -PATCH_FILE=$(realpath "${3}") - -echo -e "${_G}[Step $((CURR++))/${TOTAL} cloning repo with charts to be patched]${C_}" -git clone --recurse-submodules "${1}" "${4}" - -echo -e "${_G}[Step $((CURR++))/${TOTAL} setting working dir to ${4}]${C_}" -pushd "${4}" - -echo -e "${_G}[Step $((CURR++))/${TOTAL} git-checkout to correct base]${C_}" -git checkout "${2}" - -echo -e "${_G}[Step $((CURR++))/${TOTAL} patching charts]${C_}" -git apply "${PATCH_FILE}" - -echo -e "${_G}[Step $((CURR++))/${TOTAL} returning to original working directory]${C_}" -popd - diff --git a/build/package.py b/build/package.py index 8a1808b3..6e509a31 100755 --- a/build/package.py +++ b/build/package.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 # -*- coding: utf-8 -*- # COPYRIGHT NOTICE STARTS HERE diff --git a/build/requirements.txt b/build/requirements.txt index 2c404aed..39544458 100644 --- a/build/requirements.txt +++ b/build/requirements.txt @@ -1,2 +1,2 @@ -docker==3.7.2 +docker>=3.7.2 gitpython==2.1.11 |