X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=ci%2Fbuild.sh;h=b24ac5b4e5fc7e6ae4b7609af4c33e739c985db9;hb=a3d31a425e0bcfd040746ee21063e108e4487e07;hp=82049cdcd2d9a5875292d5a9519f5897b176ebf0;hpb=7cff3184b3cefae5894eeef78bb3490818bc8141;p=fuel.git diff --git a/ci/build.sh b/ci/build.sh index 82049cdcd..b24ac5b4e 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -1,269 +1,102 @@ -#!/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 -# -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: - .blob - .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 -} +############################################################################## +# BEGIN of Exit handlers # -# END of usage description -############################################################################ - -############################################################################ -# BEGIN of function error_exit - -error_exit() { - echo "$@" >&2 - exit 1 +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 function error_exit -############################################################################ - +# End of Exit handlers +############################################################################## -############################################################################ -# BEGIN of shorthand variables for internal use +############################################################################## +# BEGIN of variables to customize # -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}" +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" + +[ ! "${TERM:-unknown}" = 'unknown' ] || export TERM=vt220 +[ "${CACHE_INVALIDATE}" = 0 ] || CACHE_INVALIDATE=$(date +%s) # # END of variables to customize -############################################################################ - -############################################################################ -# 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 -} +############################################################################## -############################################################################ +############################################################################## # 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}" \ + ${DOCKER_PUSH} + +popd > /dev/null # # END of main -############################################################################ +##############################################################################