docker build: Update saltstack repo URL, locale
[fuel.git] / ci / build.sh
index 82049cd..3da6705 100755 (executable)
-#!/bin/bash
+#!/bin/bash -e
+# shellcheck disable=SC1004,SC1090
 ##############################################################################
-# Copyright (c) 2015 Ericsson AB and others.
-# stefan.k.berg@ericsson.com
-# jonas.bjurel@ericsson.com
+# Copyright (c) 2018 Mirantis Inc., Enea AB and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-############################################################################
-# BEGIN of usage description
+##############################################################################
+# BEGIN of Exit handlers
 #
-usage ()
-{
-cat | more << EOF
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-`basename $0`: Builds the Fuel@OPNFV stack
-
-usage: `basename $0` [-s spec-file] [-c cache-URI] [-l log-file] [-f flags]
-       [output-directory]
-
-OPTIONS:
-  -s spec-file (NOTE! DEPRECATED!)
-      define the build-spec file, default ../build/config.mk. The script only
-      verifies that the spec-file exists.
-  -c cache base URI
-       specifies the base URI to a build cache to be used/updated, supported
-       methods are http://, ftp:// and file://
-  -l log-file
-       specifies the output log-file (stdout and stderr), if not specified
-       logs are output to console as normal
-  -v
-       version tag to be applied to the build result
-  -r
-       alternative remote access method script/program. curl is default.
-  -f flag[...]
-       build flags:
-          s: Do nothing, succeed
-          f: Do nothing, fail
-          D: Debug mode
-          P: Clear the local cache before building. This flag is only
-             valid if the "-c cache-URI" options has been specified and
-             and the  method in the cache-URI is file:// (local cache).
-
-  -h help, prints this help text
-
-  output-directory, specifies the directory for the output artifacts
-  (.iso file). If no output-directory is specified, the current path
-  when calling the script is used.
-
-
-Description:
-
-build.sh builds the opnfv .iso artifact.
-To reduce build time it uses build caches on a local or remote location. A
-cache is rebuilt and uploaded if either of the below conditions are met:
-1) The P(opulate) flag is set and the -c cache-base-URI is provided and set
-   to the method file:// , if -c is
-   not provided the cache will stay local.
-2) If a cache is invalidated by the make system - the exact logic is encoded
-   in the cache.mk of the different parts of the build.
-3) A valid cache does not exist on the specified -c cache-base-URI.
-
-A cache has a blob (binary data) and a meta file in the format of:
-   <SHA1>.blob
-   <SHA1>.meta
-
-Logging is by default to console, but can be directed elsewhere with the -l
-option in which case both stdout and stderr is redirected to that destination.
-
-Built in unit testing of components is enabled by adding the t(est) flag.
-
-Return codes:
- - 0 Success!
- - 1-99 Unspecified build error
- - 100-199 Build system internal error (not build it self)
-     - 101 Build system instance busy
- - 200 Build failure
-
-Examples:
-  build -c http://opnfv.org/artifactory/fuel/cache \
-        -d ~/jenkins/genesis/fuel/ci/output -f ti
-
-NOTE: At current the build scope is set to the git root of the repository, -d
-      destination locations outside that scope will not work!
-EOF
+do_exit () {
+    local RC=$?
+    if [ ${RC} -eq 0 ]; then
+        notify_n "[OK] MCP: Docker build finished succesfully!" 2
+    else
+        notify_n "[ERROR] MCP: Docker build threw a fatal error!"
+    fi
 }
 #
-# END of usage description
-############################################################################
-
-############################################################################
-# BEGIN of function error_exit
-
-error_exit() {
-    echo "$@" >&2
-    exit 1
-}
+# End of Exit handlers
+##############################################################################
 
+##############################################################################
+# BEGIN of variables to customize
 #
-# END of function error_exit
-############################################################################
+CI_DEBUG=${CI_DEBUG:-0}; [[ "${CI_DEBUG}" =~ (false|0) ]] || set -x
+MCP_REPO_ROOT_PATH=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")/..")
+DEPLOY_DIR=$(cd "${MCP_REPO_ROOT_PATH}/mcp/scripts"; pwd)
+DOCKER_DIR=$(cd "${MCP_REPO_ROOT_PATH}/docker"; pwd)
+DOCKER_TAG=${1:-latest}
+DOCKER_PUSH=${2---push}  # pass an empty second arg to disable push
+CACHE_INVALIDATE=${CACHE_INVALIDATE:-0}
+SALT_VERSION='stable 2017.7'
 
+source "${DEPLOY_DIR}/globals.sh"
+source "${DEPLOY_DIR}/lib.sh"
+source "${DEPLOY_DIR}/lib_jump_common.sh"
 
-############################################################################
-# BEGIN of shorthand variables for internal use
-#
-SCRIPT_DIR=$(readlink -f $(dirname ${BASH_SOURCE[0]}))
-BUILD_BASE=$(readlink -e ${SCRIPT_DIR}/../build/)
-RESULT_DIR="${BUILD_BASE}/release"
-BUILD_SPEC="${BUILD_BASE}/config.mk"
-LOCAL_CACHE_ARCH_NAME="${LOCAL_CACHE_ARCH_NAME:-fuel-cache}"
+[ ! "${TERM:-unknown}" = 'unknown' ] || export TERM=vt220
+[ "${CACHE_INVALIDATE}" = 0 ] || CACHE_INVALIDATE=$(date +%s)
 
-#
-# END of variables to customize
-############################################################################
+export LC_ALL=en_US.utf-8
+export LANG=en_US.utf-8
 
-############################################################################
-# BEGIN of script assigned default variables
 #
-export CACHEBASE="file://$HOME/cache"
-export CACHETRANSPORT="curl --silent"
-CLEAR_CACHE=0
-MAKE_ARGS=""
-
-#
-# END of script assigned variables
-############################################################################
-
-build() {
-    echo "CI build parameters:"
-    echo "SCRIPT_DIR = $SCRIPT_DIR"
-    echo "BUILD_BASE = $BUILD_BASE"
-    echo "RESULT_DIR = $RESULT_DIR"
-    echo "BUILD_SPEC = $BUILD_SPEC"
-    echo "LOCAL_CACHE_ARCH_NAME = $LOCAL_CACHE_ARCH_NAME"
-    echo "CLEAR_CACHE = $CLEAR_CACHE"
-    echo "DEBUG = $DEBUG"
-    echo "OUTPUT_DIR = $OUTPUT_DIR"
-    echo "BUILD_LOG = $BUILD_LOG"
-    echo "MAKE_ARGS = $MAKE_ARGS"
-    echo "CACHEBASE = $CACHEBASE"
-    echo "CACHETRANSPORT = $CACHETRANSPORT"
-
-
-    if [ "$CLEAR_CACHE" -eq 1 ]; then
-        echo $CACHEBASE | grep -q '^file://' $CACHE_BASE
-        if [ $? -ne 0 ]; then
-            error_exit "Can't clear a non-local cache!"
-        else
-            CACHEDIR=$(echo $CACHEBASE | sed 's;file://;;')
-            echo "Clearing local cache at $CACHEDIR..."
-            rm -rvf $CACHEDIR/*
-        fi
-    fi
-
-    echo make ${MAKE_ARGS} cache
-
-    cd ${BUILD_BASE}
-    if make ${MAKE_ARGS} cache; then
-        echo "Copying build result into $OUTPUT_DIR"
-        sort ${BUILD_BASE}/gitinfo*.txt > ${OUTPUT_DIR}/gitinfo.txt
-        cp ${RESULT_DIR}/*.iso ${OUTPUT_DIR}
-        cp ${RESULT_DIR}/*.iso.txt ${OUTPUT_DIR}
-    else
-        error_exit "Build failed"
-    fi
-}
+# END of variables to customize
+##############################################################################
 
-############################################################################
+##############################################################################
 # BEGIN of main
 #
-while getopts "s:c:l:v:f:r:f:h" OPTION
-do
-    case $OPTION in
-        s)
-            BUILD_SPEC=${OPTARG}
-            if [ ! -f ${BUILD_SPEC} ]; then
-                echo "spec file does not exist: $BUILD_SPEC - exiting ...."
-                exit 100
-            fi
-            ;;
-        c)
-            # This value is used by cache.sh
-            export CACHEBASE=${OPTARG}
-            ;;
-        l)
-            BUILD_LOG=$(readlink -f ${OPTARG})
-            ;;
-        v)
-            MAKE_ARGS+="REVSTATE=${OPTARG}"
-            ;;
-        r)
-            # This value is used by cache.sh
-            export CACHETRANSPORT=${OPTARG}
-            ;;
-        h)
-            usage
-            rc=0
-            exit $rc
-            ;;
-        f)
-            BUILD_FLAGS=${OPTARG}
-            for ((i=0; i<${#BUILD_FLAGS};i++)); do
-                case ${BUILD_FLAGS:$i:1} in
-                    s)
-                        exit 0
-                        ;;
-
-                    f)
-                        exit 1
-                        ;;
-
-                    P)
-                        CLEAR_CACHE=1
-                        ;;
-
-                    D)
-                        DEBUG=1
-                        ;;
-
-                    *)
-                        error_exit "${BUILD_FLAGS:$i:1} is not a valid build flag - exiting ...."
-                        ;;
-                esac
-            done
-            ;;
 
-        *)
-            echo "${OPTION} is not a valid argument"
-            rc=100
-            exit $rc
-            ;;
-    esac
-done
-
-# Get output directory
-shift $[$OPTIND - 1]
-case $# in
-    0)
-        # No directory on command line
-        OUTPUT_DIR=$(pwd)
-        ;;
-    1)
-        # Directory on command line
-        OUTPUT_DIR=$(readlink -f $1)
-        ;;
-    *)
-        error_exit "Too many arguments"
-        ;;
-esac
-mkdir -p $OUTPUT_DIR || error_exit "Could not access output directory $OUTPUT_DIR"
-
-
-if [ -n "${BUILD_LOG}" ]; then
-    touch ${BUILD_LOG} || error_exit "Could not write to log file ${BUILD_LOG}"
-    build 2>&1 | tee ${BUILD_LOG}
-else
-    build
-fi
-
-rc=$?
-exit $rc
+# Enable the automatic exit trap
+trap do_exit SIGINT SIGTERM EXIT
+
+# Set no restrictive umask so that Jenkins can remove any residuals
+umask 0000
+
+pushd "${DEPLOY_DIR}" > /dev/null
+
+# Install distro packages and pip-managed prerequisites
+notify "[NOTE] Installing required build-time distro and pip pkgs" 2
+jumpserver_pkg_install 'build'
+PYTHON_BIN_PATH="$(python3 -m site --user-base)/bin"
+PATH="$PATH:$PYTHON_BIN_PATH"
+# Clone git submodules and apply our patches
+make -C "${MCP_REPO_ROOT_PATH}/mcp/patches" deepclean patches-import
+python3 -m pip install --upgrade pipenv --user
+docker_install
+
+popd > /dev/null
+pushd "${DOCKER_DIR}" > /dev/null
+
+env PIPENV_HIDE_EMOJIS=1 VIRTUALENV_ALWAYS_COPY=1 python3 -m pipenv --three install
+env PIPENV_HIDE_EMOJIS=1 VIRTUALENV_ALWAYS_COPY=1 python3 -m pipenv install invoke
+# shellcheck disable=SC2086
+env PIPENV_HIDE_EMOJIS=1 python3 -m pipenv run \
+  invoke build saltmaster-reclass \
+    --require 'salt salt-formulas opnfv reclass tini-saltmaster' \
+    --dist=ubuntu \
+    --dist-rel=bionic \
+    --formula-rev=nightly \
+    --opnfv-tag="${DOCKER_TAG}" \
+    --salt="${SALT_VERSION}" \
+    --build-arg-extra " \
+        CACHE_INVALIDATE=\"${CACHE_INVALIDATE}\"" \
+    ${DOCKER_PUSH}
+
+env PIPENV_HIDE_EMOJIS=1 python3 -m pipenv run \
+  invoke build saltminion-maas \
+    --require 'maas' \
+    --dist=ubuntu \
+    --dist-rel=bionic \
+    --opnfv-tag="${DOCKER_TAG}" \
+    --salt="${SALT_VERSION}" \
+    --build-arg-extra " \
+        CACHE_INVALIDATE=\"${CACHE_INVALIDATE}\"" \
+    ${DOCKER_PUSH}
+
+popd > /dev/null
 
 #
 # END of main
-############################################################################
+##############################################################################