diff options
Diffstat (limited to 'ci/kolla-build-vm.sh')
-rwxr-xr-x | ci/kolla-build-vm.sh | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/ci/kolla-build-vm.sh b/ci/kolla-build-vm.sh new file mode 100755 index 00000000..4880978c --- /dev/null +++ b/ci/kolla-build-vm.sh @@ -0,0 +1,334 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2016 ZTE Coreporation and others. +# hu.zhijiang@zte.com.cn +# lu.yao135@zte.com.cn +# 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 +############################################################################## + +set -o errexit +set -o nounset +set -o pipefail + +KOLLA_GIT="https://github.com/huzhijiang/kolla.git" +KOLLA_BRANCH="stable/ocata" +OPNFV_JOB_NAME= +KOLLA_TAG= +EXT_TAG= +KOLLA_GIT_VERSION= +KOLLA_IMAGE_VERSION= +WORK_DIR=/tmp +REGISTRY_SERVER_NAME=daisy-registry + +function usage +{ +cat << EOF +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +`basename $0`: Build Daisy4NFV's Kolla image package + +usage: `basename $0` [options] + +OPTIONS: + -l Kolla git repo location + -b Kolla git repo branch + -j OPNFV job name + -t Kolla git repo code tag(base version of image) + -e user defined tag extension(extended version) + -w working directroy + +Examples: +sudo `basename $0` -l https://git.openstack.org/openstack/kolla + -b stable/ocata + -j daisy-docker-build-euphrates + -t 4.0.2 + -e .1 + -w /tmp +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +EOF +} + +while getopts "l:b:j:t:e:w:h" OPTION +do + case $OPTION in + l) + KOLLA_GIT=${OPTARG} + ;; + b) + KOLLA_BRANCH=${OPTARG} + ;; + j) + OPNFV_JOB_NAME=${OPTARG} + ;; + t) + KOLLA_TAG=${OPTARG} + ;; + e) + EXT_TAG=${OPTARG} + ;; + w) + WORK_DIR=${OPTARG} + ;; + h) + usage + exit 0 + ;; + *) + echo "${OPTION} is not a valid argument" + usage + exit 1 + ;; + esac +done + +KOLLA_GIT_DIR=$WORK_DIR/kolla-git +REGISTRY_VOLUME_DIR=$WORK_DIR/registry +BUILD_OUTPUT_DIR=$WORK_DIR/kolla-build-output + +# OPNFV_JOB_NAME overwrites KOLLA_BRANCH +if [[ ! -z "$OPNFV_JOB_NAME" ]]; then + if [[ "$OPNFV_JOB_NAME" =~ "euphrates" ]]; then + KOLLA_BRANCH="stable/ocata" + elif [[ "$OPNFV_JOB_NAME" =~ "fraser" ]]; then + KOLLA_BRANCH="stable/pike" + else + # For master branch + KOLLA_BRANCH="stable/pike" + fi +fi + +function pre_check { + echo "Pre setup" + if [ $KOLLA_BRANCH == "stable/mitaka" ] ; then + yum install -y epel-release centos-release-openstack-mitaka + RPM_REQUIRES="python-docker-py:1.6 python-pbr:1.6 python-jinja2:2.8 \ + python-gitdb:0.6.4 GitPython:1.0.1 python-six:1.9.0 \ + python2-oslo-config:3.7.0 python-beautifulsoup4:4.4.1 \ + python2-setuptools:16.0.0 python2-crypto:2.6 docker-engine:1.12" + elif [ $KOLLA_BRANCH == "stable/newton" ] ; then + yum install -y epel-release centos-release-openstack-newton + RPM_REQUIRES="python-docker-py:1.6 python-pbr:1.6 python-jinja2:2.8 \ + python-gitdb:0.6.4 GitPython:1.0.1 python-six:1.9.0 \ + python2-oslo-config:3.14.0 python-netaddr:0.7.13 \ + python2-setuptools:16.0.0 python2-crypto:2.6 docker-engine:1.12 \ + centos-release-openstack-newton:1 epel-release:7" + elif [ $KOLLA_BRANCH == "stable/ocata" ] ; then + yum install -y epel-release centos-release-openstack-ocata + yum update -y + yum install -y python-docker-py python2-pbr python-jinja2 \ + python-gitdb GitPython python-six \ + python2-oslo-config python-netaddr \ + python2-setuptools python2-crypto docker + RPM_REQUIRES="python-docker-py:1.10 python2-pbr:1.10 python-jinja2:2.8 \ + python-gitdb:0.6.4 GitPython:1.0.1 python-six:1.10.0 \ + python2-oslo-config:3.22.0 python-netaddr:0.7.18 \ + python2-setuptools:22.0.0 python2-crypto:2.6 docker:1.12 \ + centos-release-openstack-ocata:1 epel-release:7" + elif [ $KOLLA_BRANCH == "stable/pike" ] ; then + yum install -y epel-release centos-release-openstack-pike + yum update -y + yum install -y python2-docker python2-pbr python2-jinja2 \ + python-gitdb GitPython python2-six \ + python2-oslo-config python-netaddr \ + python2-setuptools python2-crypto docker + RPM_REQUIRES="python2-docker:2.4.2 python2-pbr:3.1.1 python2-jinja2:2.8 \ + python-gitdb:0.6.4 GitPython:1.0.1 python2-six:1.10.0 \ + python2-oslo-config:3.22.0 python-netaddr:0.7.18 \ + python2-setuptools:22.0.0 python2-crypto:2.6 docker:1.12 \ + centos-release-openstack-pike:1 epel-release:7" + else + exit 1 + fi + + for package_version in $RPM_REQUIRES + do + package=`echo $package_version | awk -F: '{print $1}'` + expversion=`echo $package_version | awk -F: '{print $2}'` + + echo "Step:1 Check if $package existed" + rpm -q $package &> /dev/null + if [ "$?" != "0" ] ; then + echo "$package not installed" + exit 1 + fi + + echo "Step:2 Check if $package version meets the requirement" + realversion=$(rpm -q --queryformat '%{VERSION}' $package) + smallestversion=`printf "$realversion\n$expversion\n" | sort -V | head -1` + if [ "$smallestversion" != "$expversion" ] ; then + echo "$package version $realversion DOES NOT meet the \ + requirement version $expversion" + exit 1 + fi + done + + yum install -y gcc + yum install -y python-devel + + # Some packages must be installed by pip. + # TODO: Check version of packages installed by pip just like what we do for RPM above. + rpm -e python-tox || true + rpm -e python-virtualenv || true + rpm -e python-py || true + yum install -y python2-pip + pip install tox + + # Just make sure docker is working. + service docker restart +} + +function cleanup_registry_server { + echo "Cleaning registry server" + containers_to_kill=$(sudo docker ps --filter "name=$REGISTRY_SERVER_NAME" \ + --format "{{.Names}}" -a) + + if [[ ! -z "$containers_to_kill" ]]; then + volumes_to_remove=$(sudo docker inspect -f \ + '{{range .Mounts}} {{printf "%s\n" .Name }}{{end}}' \ + ${containers_to_kill} | egrep -v '(^\s*$)' | sort | uniq) + + echo "Stopping containers... $containers_to_kill" + (sudo docker stop -t 2 ${containers_to_kill} 2>&1) > /dev/null + echo "Removing containers... $containers_to_kill" + (sudo docker rm -v -f ${containers_to_kill} 2>&1) > /dev/null + + if [[ ! -z "$volumes_to_remove" ]]; then + echo "Removing volumes... $volumes_to_remove" + (sudo docker volume rm ${volumes_to_remove} 2>&1) || true > /dev/null + fi + fi +} + +function cleanup_registry_data { + echo "Cleaning registry data dir" + rm -rf $REGISTRY_VOLUME_DIR + mkdir -p $REGISTRY_VOLUME_DIR +} + +function cleanup_kolla_image { + echo "Cleaning Kolla images" + if [ -d $KOLLA_GIT_DIR/kolla ] ; then + pushd $KOLLA_GIT_DIR/kolla + (./tools/cleanup-images 2>&1) || true > /dev/null; + popd + fi +} + +function start_registry_server { + echo "Starting registry server" + sudo docker run -d -p 5000:5000 --restart=always \ + -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/tmp/registry \ + -v $REGISTRY_VOLUME_DIR:/tmp/registry \ + --name $REGISTRY_SERVER_NAME registry:2 +} + +function pack_registry_data { + echo "Packaging registry data" + datetag=$(date +%y%m%d%H%M%S) + + #TODO: not compatible with "master" branch + version=$(echo $KOLLA_BRANCH | awk -F'/' '{print $2}') + + if [ ! -d $BUILD_OUTPUT_DIR ] ; then + mkdir -p $BUILD_OUTPUT_DIR + fi + + pushd $BUILD_OUTPUT_DIR + echo $KOLLA_GIT_VERSION > registry-$version-$datetag.version + echo "branch = $KOLLA_BRANCH" >> registry-$version-$datetag.version + echo "tag = $KOLLA_IMAGE_VERSION" >> registry-$version-$datetag.version + echo "date = $datetag" >> registry-$version-$datetag.version + tar czf kolla-image-$version-$datetag.tgz $REGISTRY_VOLUME_DIR \ + registry-$version-$datetag.version + rm -rf registry-$version-$datetag.version + popd +} + +function update_kolla_code { + echo "Updating Kolla code" + + rm -rf $KOLLA_GIT_DIR + mkdir -p $KOLLA_GIT_DIR + + pushd $KOLLA_GIT_DIR + git clone $KOLLA_GIT + pushd $KOLLA_GIT_DIR/kolla + git checkout $KOLLA_BRANCH + + if [[ ! -z "$KOLLA_TAG" ]]; then + git checkout $KOLLA_TAG + fi + + KOLLA_GIT_VERSION=$(git log -1 --pretty="%H") + tox -e genconfig + KOLLA_IMAGE_VERSION=$(cat $KOLLA_GIT_DIR/kolla/etc/kolla/kolla-build.conf \ + | grep "#tag" | gawk -F' = ' '{print $2}') + + if [[ ! -z "$KOLLA_TAG" ]]; then + if ["$KOLLA_TAG" != $KOLLA_IMAGE_VERSION] ; then + echo "tag in git: $KOLLA_TAG, while tag in code: $KOLLA_IMAGE_VERSION" + exit 1 + fi + fi + + popd + popd +} + +function config_kolla { + rm -rf /etc/kolla/kolla-build.conf + KOLLA_IMAGE_VERSION="${KOLLA_IMAGE_VERSION}${EXT_TAG}" +} + +function start_build { + echo "Start to build Kolla image" + REGISTRY_PARAM="--registry 127.0.0.1:5000 --push --tag $KOLLA_IMAGE_VERSION" + pushd $KOLLA_GIT_DIR/kolla + + # Some of the images may be failed to built out but is OK + # so we use "|| true" here. + # TODO: We can impl. some checks to see if the images that + # we really care are built successfully. + tools/build.py $REGISTRY_PARAM || true; + popd +} + +exitcode="" +error_trap() +{ + local rc=$? + + set +e + + if [ -z "$exitcode" ]; then + exitcode=$rc + fi + + echo "Image build failed with $exitcode" + + exit $exitcode +} + +trap "error_trap" EXIT SIGTERM + +pre_check + +# Try to cleanup images of the last failed run, if any. +cleanup_kolla_image +update_kolla_code +config_kolla +cleanup_kolla_image + +# Make sure there is no garbage in the registry server. +cleanup_registry_server +cleanup_registry_data +start_registry_server + +start_build +cleanup_kolla_image +pack_registry_data + +# TODO: Upload to OPNFV artifacts repo. + |