From df6c1db2695030b1ba68184bac9aab9fb2d41e71 Mon Sep 17 00:00:00 2001 From: Jonas Bjurel Date: Thu, 12 Mar 2015 15:18:06 +0100 Subject: [PATCH] *** FIRST VERSION OF CI BUILD SCRIPT *** - Provides build cache management to a remote location - Provides automatic cashe repopulation - See /fuel/ci/README - Rebased to master - Bug around cache handling fixed - New option -r introduced to invoke external script/program instead of standard http(s)/fttp get and put, eg. scripts or programs to integrate with dropbox, or similar. The script needs to anheaer to curl argument list. - Stefan Berg's comments implemented - Fatih Degirmenci's comments implemented with one exemption: the revision state .iso naming convention still remains the same - we need to discuss this. With the implementation of Fatih's comments the build.sh argument structure is slightly changed, please see ./build.sh -h TODO: - Further testing - Finalize cache invalidation logic - Make refactoring JIRA: Change-Id: I4efdbdd10f726c0a3229849a63040b6d2702db5c Signed-off-by: Jonas Bjurel --- fuel/build/DOC/BUILD/README.build | 1 + fuel/build/Makefile | 64 +++-- fuel/build/Makefile~ | 140 --------- fuel/build/cache.mk | 87 ++++++ fuel/build/docker/runcontext | 11 +- fuel/build/f_isoroot/f_kscfg/ks.cfg | 4 +- fuel/build/f_isoroot/f_kscfg/ks.cfg.orig | 4 +- fuel/build/opendaylight/Makefile | 28 +- fuel/build/opendaylight/f_odl/Makefile | 2 +- fuel/build/opendaylight/make-odl-deb.sh | 32 +-- fuel/ci/README | 23 ++ fuel/ci/build.sh | 478 +++++++++++++++++++++++++++++++ 12 files changed, 688 insertions(+), 186 deletions(-) delete mode 100644 fuel/build/Makefile~ create mode 100644 fuel/build/cache.mk create mode 100644 fuel/ci/README mode change 100644 => 100755 fuel/ci/build.sh diff --git a/fuel/build/DOC/BUILD/README.build b/fuel/build/DOC/BUILD/README.build index 519ee6a..b8ce799 100644 --- a/fuel/build/DOC/BUILD/README.build +++ b/fuel/build/DOC/BUILD/README.build @@ -27,6 +27,7 @@ On the host, the following packages must be installed: for Ubuntu 14.04. Note: only use the Ubuntu stock distro of Docker (docker.io) - git (simply available through apt-get install git) - make (simply available through apt-get install make) +- curl 2 Setting up the Docker build container ---------------------------------------- diff --git a/fuel/build/Makefile b/fuel/build/Makefile index 8e90fcc..e7cb6e7 100644 --- a/fuel/build/Makefile +++ b/fuel/build/Makefile @@ -13,24 +13,36 @@ # SHELL = /bin/bash -include config.mk +#Input args +export UNIT_TEST = FALSE +export INTERACTIVE = TRUE +export ISOSRC = file:$(shell pwd)/fuel-6.0.1.iso +export ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC)) +export PRODNO = "OPNFV_BGS" +export REVSTATE = "P0000" +export NEWISO = $(shell pwd)/release/opnfv-${REVSTATE}.iso + +# Note! Invoke with "make REVSTATE=RXXXX all" to make release build! +# Invoke with ICOCACHE=/full/path/to/iso if cached ISO is in non-standard location. -export BUILD_BASE = $(shell pwd) +#Build variables +export BUILD_BASE := $(shell pwd) export DEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/main export PUPPET_DEST := $(BUILD_BASE)/release/puppet/modules - -ISOSRC = file:$(shell pwd)/fuel-6.0.1.iso -ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC)) -PRODNO = "OPNFV_BGS" -REVSTATE = "P0000" -NEWISO = $(shell pwd)/release/opnfv-${REVSTATE}.iso +export CACHE_DIR := $(BUILD_BASE)/cache +export VERSION_FILE := $(BUILD_BASE)/.versions DOCKERIMG = opnfv.org/ubuntu-builder:14.04 -# Note! Invoke with "make REVSTATE=RXXXX iso" to make release build! -# Invoke with ICOCACHE=/full/path/to/iso if cached ISO is in non-standard location. +export TOPDIR := $(shell pwd) + # # END of variables to customize ############################################################################# -export TOPDIR := $(shell pwd) + +#Include definitions +include config.mk +include cache.mk + + ORIGDIR := $(TOPDIR)/origiso SUBDIRS := f_isoroot @@ -39,17 +51,17 @@ SUBDIRS += f_osnaily SUBDIRS += f_l23network SUBDIRS += f_resolvconf SUBDIRS += f_ntp -#SUBDIRS += f_gif -#SUBDIRS += f_libnss -#SUBDIRS += f_libpcs -#SUBDIRS += f_libxt -#SUBDIRS += f_comm_java -#SUBDIRS += f_ca_cert -#SUBDIRS += f_atk_wrap -#SUBDIRS += f_jre_head -#SUBDIRS += f_jre -#SUBDIRS += f_java -#SUBDIRS += f_odl +SUBDIRS += f_gif +SUBDIRS += f_libnss +SUBDIRS += f_libpcs +SUBDIRS += f_libxt +SUBDIRS += f_comm_java +SUBDIRS += f_ca_cert +SUBDIRS += f_atk_wrap +SUBDIRS += f_jre_head +SUBDIRS += f_jre +SUBDIRS += f_java +SUBDIRS += f_odl @@ -62,6 +74,9 @@ SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) .PHONY: all all: @docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1) + @echo "Versions of cached build results built by" $(shell hostname) "at" $(shell date -u) > $(BUILD_BASE)/.versions + @echo "cache.mk" $(shell md5sum $(BUILD_BASE)/cache.mk | cut -f1 -d " ") >> $(BUILD_BASE)/.versions + @echo "config.mk" $(shell md5sum $(BUILD_BASE)/config.mk | cut -f1 -d " ") >> $(BUILD_BASE)/.versions @make -C docker @docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso @@ -69,6 +84,8 @@ $(ISOCACHE): # Clone Fuel to non-persistent location and build cd /tmp && git clone $(FUEL_MAIN_REPO) cd /tmp/fuel-main && git checkout $(FUEL_MAIN_TAG) + @echo "fuel" `git -C /tmp/fuel-main show | grep commit | rev | cut -f1 -d " "` >> ${BUILD_BASE}/.versions + # Setup cgroups for docker-in-docker sudo /root/enable_dockerx2 # Patch to fix race condition when doing "Docker-in-Docker" build @@ -120,7 +137,7 @@ build-clean: $(SUBCLEAN) @rm -f $(NEWISO) .PHONY: clean $(SUBCLEAN) -clean: prepare $(SUBCLEAN) +clean: prepare $(SUBCLEAN) $(MAKE) -C patch-packages -f Makefile clean $(MAKE) -C opendaylight -f Makefile clean @rm -f *.iso @@ -128,6 +145,7 @@ clean: prepare $(SUBCLEAN) @rm -Rf newiso @rm -f f_odl @rm -f $(NEWISO) + @rm -f $(BUILD_BASE)/.versions $(SUBCLEAN): %.clean: $(MAKE) -C $* -f Makefile clean diff --git a/fuel/build/Makefile~ b/fuel/build/Makefile~ deleted file mode 100644 index 7f16a28..0000000 --- a/fuel/build/Makefile~ +++ /dev/null @@ -1,140 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Ericsson AB and others. -# stefan.k.berg@ericsson.com -# jonas.bjurel@ericsson.com -# 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 variables to customize -# -SHELL = /bin/bash - -include config.mk - -export BUILD_BASE = $(shell pwd) -export DEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/main -export PUPPET_DEST := $(BUILD_BASE)/release/puppet/modules - -ISOSRC = file:$(shell pwd)/fuel-6.0.1.iso -ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC)) -PRODNO = "OPNFV_BGS" -REVSTATE = "P0000" -NEWISO = $(shell pwd)/release/opnfv-${REVSTATE}.iso -DOCKERIMG = opnfv.org/ubuntu-builder:14.04 -# Note! Invoke with "make REVSTATE=RXXXX iso" to make release build! -# Invoke with ICOCACHE=/full/path/to/iso if cached ISO is in non-standard location. -# -# END of variables to customize -############################################################################# -export TOPDIR := $(shell pwd) -ORIGDIR := $(TOPDIR)/origiso - -SUBDIRS := f_isoroot -SUBDIRS += f_opnfv_puppet -SUBDIRS += f_osnaily -SUBDIRS += f_l23network -SUBDIRS += f_resolvconf -SUBDIRS += f_ntp -SUBDIRS += f_gif -SUBDIRS += f_libnss -SUBDIRS += f_libpcs -SUBDIRS += f_libxt -SUBDIRS += f_comm_java -SUBDIRS += f_ca_cert -SUBDIRS += f_atk_wrap -SUBDIRS += f_jre_head -SUBDIRS += f_jre -SUBDIRS += f_java -SUBDIRS += f_odl - - - -# f_example is only an example of how to generate a .deb package and -# should not be enabled in official builds. -#SUBDIRS += f_example - -SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) - -.PHONY: all -all: - @docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1) - @make -C docker - @docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso - -$(ISOCACHE): - # Clone Fuel to non-persistent location and build - cd /tmp && git clone $(FUEL_MAIN_REPO) - cd /tmp/fuel-main && git checkout $(FUEL_MAIN_TAG) - # Setup cgroups for docker-in-docker - sudo /root/enable_dockerx2 - # Patch to fix race condition when doing "Docker-in-Docker" build - cd /tmp/fuel-main && patch -p1 < $(TOPDIR)/fuel-main_1.patch - # Patch to make the sandbox chroot in Fuel succeed with package - # installation in a Docker build - cd /tmp/fuel-main && patch -p1 < $(TOPDIR)/fuel-main_2.patch - # Remove Docker optimizations, otherwise multistrap will fail during - # Fuel build. - sudo rm -f /etc/apt/apt.conf.d/docker* - # - cd /tmp/fuel-main && ./prepare-build-env.sh - cd /tmp/fuel-main && make iso - mv /tmp/fuel-main/build/artifacts/fuel*.iso . - -.PHONY: mount-origiso umount-origiso -mount-origiso: $(ISOCACHE) - @echo "Mounting original ISO in $(ORIGDIR)" - @mkdir -p $(ORIGDIR) - @fuseiso $(ISOCACHE) $(ORIGDIR) - -umount-origiso: - @echo "Unmounting original ISO from $(ORIGDIR)" - @fusermount -u $(ORIGDIR) - @rmdir $(ORIGDIR) - -.PHONY: $(SUBDIRS) -$(SUBDIRS): - @mkdir -p release/packages/ubuntu/pool/main release/puppet/modules release/isoroot - $(MAKE) -C $@ -f Makefile release - -.PHONY: patch-packages -patch-packages: - ORIGISO=$(ISOCACHE) REVSTATE=$(REVSTATE) $(MAKE) -C $@ -f Makefile release - -.PHONY: prepare -prepare: - $(MAKE) -C opendaylight -f Makefile setup - -.PHONY: odl -odl: - $(MAKE) -C opendaylight -f Makefile - -.PHONY: build-clean $(SUBCLEAN) -build-clean: $(SUBCLEAN) - $(MAKE) -C patch-packages -f Makefile clean - @rm -Rf release - @rm -Rf newiso - @rm -f $(NEWISO) - -.PHONY: clean $(SUBCLEAN) -clean: prepare $(SUBCLEAN) - $(MAKE) -C patch-packages -f Makefile clean - $(MAKE) -C opendaylight -f Makefile clean - @rm -f *.iso - @rm -Rf release - @rm -Rf newiso - @rm -f f_odl - @rm -f $(NEWISO) - -$(SUBCLEAN): %.clean: - $(MAKE) -C $* -f Makefile clean - -# Todo: Make things smarter - we shouldn't need to clean everything -# betwen make invocations. -.PHONY: iso -iso: prepare build-clean odl $(ISOCACHE) $(SUBDIRS) patch-packages - install/install.sh iso $(ISOCACHE) $(NEWISO) $(PRODNO) $(REVSTATE) - @printf "\n\nProduct ISO is $(NEWISO)\n\n" diff --git a/fuel/build/cache.mk b/fuel/build/cache.mk new file mode 100644 index 0000000..a3f3516 --- /dev/null +++ b/fuel/build/cache.mk @@ -0,0 +1,87 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# 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 variables to customize +# +SHELL = /bin/bash + +#export BUILD_BASE = $(shell pwd) +#export CACHE_DIR = "$(BUILD_BASE)/cache" + +CACHEDIRS := opendaylight/f_odl/package + +CACHEFILES := opendaylight/.odl-build-history +CACHEFILES += opendaylight/.odl-build.log +CACHEFILES += .versions +CACHEFILES += fuel-6.0.1.iso +#CACHEFILES += $(ISOSRC) + +CACHECLEAN = $(addsuffix .clean,$(CACHEDIRS)) + +.PHONY: prepare-cache +prepare-cache: make-cache-dir $(CACHEDIRS) $(CACHEFILES) + +.PHONY: make-cache-dir +make-cache-dir: + @rm -rf ${CACHE_DIR} + @mkdir ${CACHE_DIR} + + +.PHONY: clean-cache +clean-cache: $(CACHECLEAN) + @rm -rf ${CACHE_DIR} + +.PHONY: $(CACHEDIRS) +$(CACHEDIRS): + @mkdir -p $(dir ${CACHE_DIR}/$@) + @if [ ! -d ${BUILD_BASE}/$@ ]; then\ + mkdir -p $(dir ${BUILD_BASE}/$@);\ + ln -s ${BUILD_BASE}/$@ ${CACHE_DIR}/$@;\ + rm -rf ${BUILD_BASE}/$@;\ + else\ + ln -s ${BUILD_BASE}/$@ ${CACHE_DIR}/$@;\ + fi + +.PHONY: $(CACHEFILES) +$(CACHEFILES): + @mkdir -p $(dir ${CACHE_DIR}/$@) + @if [ ! -f ${BUILD_BASE}/$@ ]; then\ + mkdir $(dir ${BUILD_BASE}/$@);\ + echo " " > ${BUILD_BASE}/$@;\ + ln -s ${BUILD_BASE}/$@ ${CACHE_DIR}/$@;\ + rm -f ${BUILD_BASE}/$@;\ + else\ + ln -s ${BUILD_BASE}/$@ ${CACHE_DIR}/$@;\ + fi + +.PHONY: validate-cache +validate-cache: +# if [ $(shell md5sum ${BUILD_BASE}/config.mk) -ne $(shell cat ${CACHE_DIR}/.versions | grep config.mk awk '{print $NF}') ]; then\ + echo "Cache does not match current config.mk definition, cache must be rebuilt";\ + exit 1;\ + fi; + +# if [ $(shell md5sum ${BUILD_BASE}/cache.mk) -ne $(shell cat ${CACHE_DIR}/.versions | grep config.mk awk '{print $NF}') ]; then\ + echo "Cache does not match current cache.mk definition, cache must be rebuilt";\ + exit 1;\ + fi; + +# $(MAKE) -C opendaylight validate-cache +# if [ $? -ne 0 ]; then\ + echo "Cache does not match current OpenDaylight version, cach must be rebuilt";\ + exit 1;\ + fi; + +# $(SUBDIRS) + +.PHONY: $(CACHECLEAN) +$(CACHECLEAN): %.clean: + rm -f ${CACHE_DIR}/$* diff --git a/fuel/build/docker/runcontext b/fuel/build/docker/runcontext index a22fb29..cf116fc 100755 --- a/fuel/build/docker/runcontext +++ b/fuel/build/docker/runcontext @@ -20,7 +20,16 @@ RUN /root/setcontext $USER $UID $GID $HOME EOF` GITROOT=`git rev-parse --show-toplevel` CID=`echo $res | sed 's/.* //'` -docker run --privileged=true --rm -i -e HOME=$HOME -u $USER -w $PWD -v ${HOME}/.ssh:${HOME}/.ssh -v $GITROOT:$GITROOT $CID "$@" + + RUN_CONTEXT_OPT="--privileged=true --rm -i -e HOME=$HOME -u $USER -w $PWD -v ${HOME}/.ssh:${HOME}/.ssh -v $GITROOT:$GITROOT" + +if [ "${INTERACTIVE}" != "FALSE" ]; then + RUN_CONTEXT_OPT+=" -t" +fi + +echo command: docker run ${RUN_CONTEXT_OPT} $CID "$@" +docker run ${RUN_CONTEXT_OPT} $CID "$@" + rc=$? docker rmi $CID > /dev/null exit $rc diff --git a/fuel/build/f_isoroot/f_kscfg/ks.cfg b/fuel/build/f_isoroot/f_kscfg/ks.cfg index 932e9ac..508f044 100755 --- a/fuel/build/f_isoroot/f_kscfg/ks.cfg +++ b/fuel/build/f_isoroot/f_kscfg/ks.cfg @@ -208,7 +208,9 @@ echo "partition pv.001 --ondisk=${tgtdrive} --size=30000 --grow" >> /tmp/partiti echo "volgroup os pv.001" >> /tmp/partition.ks echo "logvol swap --vgname=os --recommended --name=swap" >> /tmp/partition.ks echo "logvol / --vgname=os --size=10000 --name=root --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var --vgname=os --size=1 --grow --name=var --fstype=xfs" >> /tmp/partition.ks +echo "logvol /var --vgname=os --size=10000 --percent 60 --grow --name=var --fstype=ext4" >> /tmp/partition.ks +echo "logvol /var/log --vgname=os --size=4096 --percent 40 --grow --name=varlog --fstype=ext4" >> /tmp/partition.ks + # bootloader echo "bootloader --location=mbr --driveorder=${tgtdrive} --append=' biosdevname=0 crashkernel=none'" > /tmp/bootloader.ks diff --git a/fuel/build/f_isoroot/f_kscfg/ks.cfg.orig b/fuel/build/f_isoroot/f_kscfg/ks.cfg.orig index 44f9f42..bddf99c 100644 --- a/fuel/build/f_isoroot/f_kscfg/ks.cfg.orig +++ b/fuel/build/f_isoroot/f_kscfg/ks.cfg.orig @@ -208,7 +208,9 @@ echo "partition pv.001 --ondisk=${tgtdrive} --size=30000 --grow" >> /tmp/partiti echo "volgroup os pv.001" >> /tmp/partition.ks echo "logvol swap --vgname=os --recommended --name=swap" >> /tmp/partition.ks echo "logvol / --vgname=os --size=10000 --name=root --fstype=ext4" >> /tmp/partition.ks -echo "logvol /var --vgname=os --size=1 --grow --name=var --fstype=xfs" >> /tmp/partition.ks +echo "logvol /var --vgname=os --size=10000 --percent 60 --grow --name=var --fstype=ext4" >> /tmp/partition.ks +echo "logvol /var/log --vgname=os --size=4096 --percent 40 --grow --name=varlog --fstype=ext4" >> /tmp/partition.ks + # bootloader echo "bootloader --location=mbr --driveorder=${tgtdrive} --append=' biosdevname=0 crashkernel=none'" > /tmp/bootloader.ks diff --git a/fuel/build/opendaylight/Makefile b/fuel/build/opendaylight/Makefile index 9c3d22d..c112ff6 100644 --- a/fuel/build/opendaylight/Makefile +++ b/fuel/build/opendaylight/Makefile @@ -34,20 +34,42 @@ all: odl .PHONY: setup setup: - @if [ ! -d "$(TOPDIR)/f_odl" ]; then ln -s "$(realpath $(BUILD_DIR))/f_odl" "$(realpath $(TOPDIR))/f_odl"; fi + rm -f "$(BUILD_BASE)/f_odl" + ln -s "$(shell readlink -e $(BUILD_DIR))/f_odl" "$(shell readlink -e $(BUILD_BASE))/f_odl" + +.PHONY: check-cache-validity +check-cache-validity: + @if [ $(git ls-remote $(ODL_MAIN_REPO) $(ODL_MAIN_TAG) | awk '{print $(NF-1)}') -ne $(cat $(CACHE_DIR)/.versions | grep odl | awk '{print $NF}') ]; then @echo "Cache is not up to date, stopping!"; exit 1; fi .PHONY: odl odl: + ifeq ($(ODL_MAIN_REPO),) @echo "No config-spec target for ODL, nothing to build" else ifeq ($(shell if [ -e .odl-build.log ];then cat .odl-build.log; fi;),$(ODL_MAIN_TAG)) @cd /tmp && git clone $(ODL_MAIN_REPO) && cd /tmp/controller && git checkout $(ODL_MAIN_TAG) + @echo "ODL is up to date" else - @if [ ! -d "/tmp/controller" ]; then cd /tmp && git clone $(ODL_MAIN_REPO); fi; - @cd /tmp/controller && git checkout $(ODL_MAIN_TAG) && mvn -Dmaven.test.skip=true -gs $(MAVEN_SPEC) clean install; + @if [ ! -d "/tmp/controller" ]; then\ + cd /tmp && git clone $(ODL_MAIN_REPO);\ + fi; + + @if [ "$(UNIT_TEST)" = "FALSE" ]; then\ + echo "Building ODL without unit test";\ + cd /tmp/controller &&\ + git checkout $(ODL_MAIN_TAG) &&\ + mvn -D maven.test.skip=true -gs $(MAVEN_SPEC) clean install;\ + else\ + echo "Building ODL with unit test";\ + cd /tmp/controller &&\ + git checkout $(ODL_MAIN_TAG) &&\ + mvn -gs $(MAVEN_SPEC) clean install;\ + fi; + + @echo "odl" `git -C /tmp/controller show | grep commit | rev | cut -f1 -d " "` >> $(BUILD_BASE)/.versions @./make-odl-deb.sh -N $(ODL_SHORT_NAME)_`cd /tmp/controller; git rev-parse --short HEAD` -n $(ODL_SHORT_NAME) -v "$(ODL_VERSION)" -t "$(ODL_MAIN_TAG)" -m $(MAINTAINER) -d $(DEPEND) -p $(TARGET_BUILD_PATH) @echo $(ODL_MAIN_TAG) > .odl-build.log endif diff --git a/fuel/build/opendaylight/f_odl/Makefile b/fuel/build/opendaylight/f_odl/Makefile index 8ac5108..6983f0c 100644 --- a/fuel/build/opendaylight/f_odl/Makefile +++ b/fuel/build/opendaylight/f_odl/Makefile @@ -23,7 +23,7 @@ ifeq ($(ODL_MAIN_REPO),) else @mkdir -p tmp/src @mkdir -p release/pool/main - @cp -rp $(DEB_NAME) tmp/src + @cp -rp package/$(DEB_NAME) tmp/src @gzip -f9 tmp/src/$(DEB_NAME)/usr/share/doc/$(ODL_NAME_SHORT)/changelog.Debian @fakeroot dpkg-deb --build tmp/src/$(DEB_NAME) @lintian tmp/src/$(DEB_NAME).deb diff --git a/fuel/build/opendaylight/make-odl-deb.sh b/fuel/build/opendaylight/make-odl-deb.sh index 24974dc..5222087 100755 --- a/fuel/build/opendaylight/make-odl-deb.sh +++ b/fuel/build/opendaylight/make-odl-deb.sh @@ -260,11 +260,11 @@ do done # Constructing script variables -DEB_PACK_BASE_PATH="f_${PACKAGE_SHORT_NAME}/${PACKAGE_NAME}_${PACKAGE_VERSION}/" +DEB_PACK_BASE_PATH="f_${PACKAGE_SHORT_NAME}/package/${PACKAGE_NAME}_${PACKAGE_VERSION}" echo ${DEB_PACK_BASE_PATH} >> "$BUILD_HISTORY" TARGET_INSTALL_PATH="/usr/share/java/${PACKAGE_SHORT_NAME}/" -DEB_PACK_CONTENT_PATH="${DEB_PACK_BASE_PATH}usr/share/java/${PACKAGE_SHORT_NAME}/" -DEB_PACK_CONFIG_PATH="${DEB_PACK_BASE_PATH}etc/${PACKAGE_SHORT_NAME}" +DEB_PACK_CONTENT_PATH="${DEB_PACK_BASE_PATH}/usr/share/java/${PACKAGE_SHORT_NAME}/" +DEB_PACK_CONFIG_PATH="${DEB_PACK_BASE_PATH}/etc/${PACKAGE_SHORT_NAME}" TARGET_TAR=$(ls ${TARGET_BUILD_PATH}*.tar.gz) TARGET_TAR="${TARGET_TAR##*/}" TAR_PATH="${TARGET_TAR%.*}" @@ -295,20 +295,20 @@ find ${DEB_PACK_CONFIG_PATH}/etc/ -type f -print -exec chmod 644 {} \; find ${DEB_PACK_CONFIG_PATH}/etc/ -type d -print -exec chmod 755 {} \; # Create package usr/bin odl script -mkdir "${DEB_PACK_BASE_PATH}usr/bin" -chmod 755 "${DEB_PACK_BASE_PATH}usr/bin" -make-DEBIAN_bin > "${DEB_PACK_BASE_PATH}usr/bin/odl" -chmod 755 "${DEB_PACK_BASE_PATH}usr/bin/odl" +mkdir "${DEB_PACK_BASE_PATH}/usr/bin" +chmod 755 "${DEB_PACK_BASE_PATH}/usr/bin" +make-DEBIAN_bin > "${DEB_PACK_BASE_PATH}/usr/bin/odl" +chmod 755 "${DEB_PACK_BASE_PATH}/usr/bin/odl" # Create Deb pack install meta-data -mkdir "${DEB_PACK_BASE_PATH}DEBIAN" -make-DEBIAN_control > "${DEB_PACK_BASE_PATH}DEBIAN/control" -make-DEBIAN_conffiles > "${DEB_PACK_BASE_PATH}DEBIAN/conffiles" -mkdir -p "${DEB_PACK_BASE_PATH}usr/share/doc/${PACKAGE_SHORT_NAME}" -make-DEBIAN_copyright > "${DEB_PACK_BASE_PATH}usr/share/doc/${PACKAGE_SHORT_NAME}/copyright" -make-DEBIAN_changelog > "${DEB_PACK_BASE_PATH}usr/share/doc/${PACKAGE_SHORT_NAME}/changelog.Debian" +mkdir "${DEB_PACK_BASE_PATH}/DEBIAN" +make-DEBIAN_control > "${DEB_PACK_BASE_PATH}/DEBIAN/control" +make-DEBIAN_conffiles > "${DEB_PACK_BASE_PATH}/DEBIAN/conffiles" +mkdir -p "${DEB_PACK_BASE_PATH}/usr/share/doc/${PACKAGE_SHORT_NAME}" +make-DEBIAN_copyright > "${DEB_PACK_BASE_PATH}/usr/share/doc/${PACKAGE_SHORT_NAME}/copyright" +make-DEBIAN_changelog > "${DEB_PACK_BASE_PATH}/usr/share/doc/${PACKAGE_SHORT_NAME}/changelog.Debian" # Create Deb pack post install symlinks and usr/bin scripts -make-DEBIAN_postinst > "${DEB_PACK_BASE_PATH}DEBIAN/postinst" -chmod 755 "${DEB_PACK_BASE_PATH}DEBIAN/postinst" -mkdir -p "${DEB_PACK_BASE_PATH}usr/bin" +make-DEBIAN_postinst > "${DEB_PACK_BASE_PATH}/DEBIAN/postinst" +chmod 755 "${DEB_PACK_BASE_PATH}/DEBIAN/postinst" +mkdir -p "${DEB_PACK_BASE_PATH}/usr/bin" diff --git a/fuel/ci/README b/fuel/ci/README new file mode 100644 index 0000000..3525d4d --- /dev/null +++ b/fuel/ci/README @@ -0,0 +1,23 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# 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 +############################################################################## + +The genesis/fuel/ci directory holds all Fuel@OPNFV abstractions for the OPNFV +community release and continous integration pipeline. +There are two Fuel@OPNF autonomous scripts fo this, complying to the OPNFV CI pipeline guideline: + - build.sh + - deploy.sh + +For more info on usage: +./build.sh -h +./deploy.sh -h + +To be able to deploy on a certain metal environment there needs to be a Deplyment Environment Adaptor" executable with propper added to $PATH such that +deploy.sh can call it by $dea [options] as indicated by ./deploy -h. + diff --git a/fuel/ci/build.sh b/fuel/ci/build.sh old mode 100644 new mode 100755 index e69de29..bb0d124 --- a/fuel/ci/build.sh +++ b/fuel/ci/build.sh @@ -0,0 +1,478 @@ +#!/bin/bash +set -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# 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 +############################################################################## + +trap 'echo "Exiting ..."; \ +if [ -f ${LOCK_FILE} ]; then \ + if [ $(cat ${LOCK_FILE}) -eq $$ ]; then \ + rm -f ${LOCK_FILE}; \ + fi; \ +fi;' EXIT + +usage () +{ +cat << EOF +$0 Builds the Fuel@OPNFV stack + +usage: $0 [-s spec-file] [-c cache-URI] [-l log-file] [-f Flags] build-directory + +OPTIONS: + -s spec-file ($BUILD_SPEC), define the build-spec file, default ../build/config.mk + -c cache base URI ($BUILD_CACHE_URI), specifies the base URI to a build cache to be used/updated - the name is automatically generated from the md5sum of the spec-file, http://, ftp://, file://[absolute path] suported. + + -l log-file ($BUILD_LOG), 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 build flags ($BUILD_FLAGS): + o s: Do nothing, succeed + o f: Do nothing, fail + o t: run build unit tests + o i: run interactive (-t flag to docker run) + o P: Populate a new local cache and push it to the (-c cache-URI) cache artifactory if -c option is present, currently file://, http:// and ftp:// are supported + o d: Detatch - NOT YET SUPPORTED + + build-directory ($BUILD_DIR), specifies the directory for the output artifacts (.iso file). + + -h help, prints this help text + +Description: +build.sh builds opnfv .iso artifact. +To reduce build time it uses build cache on a local or remote location. The 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, if -c is not provided the cache will stay local. +2) If the cache is invalidated by one of the following conditions: + - The config spec md5sum does not compare to the md5sum for the spec which the cache was built. + - The git Commit-Id on the remote repos/HEAD defined in the spec file does not correspont with the Commit-Id for what the cache was built with. +3) A valid cache does not exist on the specified -c cache-base-URI. + +The cache URI object name is fuel_cache-"md5sum(spec file)" + +Logging 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) + o 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 +} + + + +debug_make () { + make -C ${BUILD_BASE} clean + echo "This is a fake debug fuel .iso image" > ${BUILD_BASE}/fuel-6.0.1.iso + echo "This is a fake debug versions file" > ${BUILD_BASE}/.versions + rm -rf ${BUILD_BASE}/release + mkdir ${BUILD_BASE}/release + echo "This is a fake debug OPNFV .iso image" > ${BUILD_BASE}/release/fake-debug.iso + echo "This is a fake debug OPNFV .iso.txt message" > ${BUILD_BASE}/release/fake-debug.iso.txt + echo "This a fake debug odl build history" > ${BUILD_BASE}/opendaylight/.odl-build-history + echo "This a fake debug odl build log" > ${BUILD_BASE}/opendaylight/.odl-build.log +} + +cache_check () { + if [ ! -f ${BUILD_BASE}/fuel-6.0.1.iso ] || \ + [ ! -f ${BUILD_BASE}/.versions ] || \ + [ ! -f ${BUILD_BASE}/opendaylight/.odl-build-history ]; \ + [ ! -f ${BUILD_BASE}/opendaylight/.odl-build.log ]; then + echo "Cache not present in the build system" + echo "TEST FAILED" + exit $rc + fi +} + +integration-test () { + +##### Always succeed integration test #### + make -C ${BUILD_BASE} clean + echo "TEST - $0 - ALWAYS SUCCEED" + set +e + $0 -f s tmp/output + rc=$? + set -e + if [ $rc -ne 0 ]; then + echo "TEST FAILED" + rc=150 + exit $rc + fi + +##### Always fail integration test #### + make -C ${BUILD_BASE} clean + echo "TEST - $0 - ALWAYS FAIL" + set +e + $0 -f f tmp/output + rc=$? + set -e + if [ $rc -eq 0 ]; then + echo "TEST FAILED" + rc=151 + exit $rc + fi + +##### Populate cache integration test #### + make -C ${BUILD_BASE} clean + echo "TEST - $0 - POPULATE CACHE" + rm -rf tmp + mkdir tmp + mkdir tmp/cache + set +e + $0 -c ${BUILD_CACHE_URI} -f PD tmp/output + rc=$? + set -e + if [ $rc -ne 0 ]; then + echo "TEST FAILED" + rc=152 + exit $rc + fi + + if [ ! -f tmp/output/fake-debug.iso ] || [ ! -f tmp/output/fake-debug.iso ]; then + echo "TEST FAILED" + rc=153 + exit $rc + fi + rc=154 + cache_check + +##### Build uinge cache integration test #### + make -C ${BUILD_BASE} clean + echo "TEST - $0 - BUILD USING CACHE" + set +e + $0 -c ${BUILD_CACHE_URI} -f D tmp/output + rc=$? + set -e + if [ $rc -ne 0 ]; then + echo "TEST FAILED" + rc=155 + exit $rc + fi + + if [ ! -f tmp/output/fake-debug.iso ] || [ ! -f tmp/output/fake-debug.iso ]; then + echo "TEST FAILED" + rc=156 + exit $rc + fi + rc=157 + cache_check + +#### Repopulate cache because cache non existant #### + make -C ${BUILD_BASE} clean + echo "TEST - $0 - BUILD USING CACHE" + rm -rf tmp/cache/* + set +e + $0 -c ${BUILD_CACHE_URI} -f D tmp/output + rc=$? + set -e + if [ $rc -ne 0 ]; then + echo "TEST FAILED" + rc=158 + exit $rc + fi + + if [ ! -f tmp/output/fake-debug.iso ] || [ ! -f tmp/output/fake-debug.iso ]; then + echo "TEST FAILED" + rc=160 + exit $rc + fi + rc=161 + cache_check + +# Repopulate cache because cach is ivalidated +#TBD +rm -rf tmp +echo "All tests passed!" +rc=0 +exit $rc +} + +#DEFAULT VALUES +BUILD_BASE=$(readlink -e ../build/) +RESULT_DIR="${BUILD_BASE}/release" +BUILD_SPEC="${BUILD_BASE}/config.mk" +CACHE_DIR="cache" +LOCAL_CACHE_ARCH_NAME="fuel-cache" +REMOTE_CACHE_ARCH_NAME="fuel_cache-$(md5sum ${BUILD_SPEC}| cut -f1 -d " ")" +REMOTE_ACCESS_METHD=curl + +#SCRIPT ASSIGNED VARIABLES +SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +LOCK_FILE="${SCRIPT_DIR}/.build.lck" +TEST_SUCCEED=0 +TEST_FAIL=0 +UNIT_TEST=0 +UPDATE_CACHE=0 +POPULATE_CACHE=0 +RECURSIV=0 +DETACH=0 +DEBUG=0 +INTEGRATION_TEST=0 +INTERACTIVE=0 +BUILD_CACHE_URI= +BUILD_SPEC= +BUILD_DIR= +BUILD_LOG= +BUILD_VERSION= +MAKE_ARGS= + +while getopts "s:c:v:f:l:r:RTh" OPTION +do + case $OPTION in + h) + usage + rc=0 + exit $rc + ;; + + s) + BUILD_SPEC=${OPTARG} + ;; + + c) + BUILD_CACHE_URI=${OPTARG} + ;; + + l) + BUILD_LOG=${OPTARG} + ;; + + v) + BUILD_VERSION=${OPTARG} + ;; + + f) + BUILD_FLAGS=${OPTARG} + ;; + + r) REMOTE_ACCESS_METHD=${OPTARG} + ;; + + R) + RECURSIVE=1 + ;; + + T) + INTEGRATION_TEST=1 + ;; + + *) + echo "${OPTION} is not a valid argument" + rc=100 + exit $rc + ;; + esac +done + +if [ -z $BUILD_DIR ]; then + BUILD_DIR=$(echo $@ | cut -d ' ' -f ${OPTIND}) +fi + +for ((i=0; i<${#BUILD_FLAGS};i++)); do + case ${BUILD_FLAGS:$i:1} in + s) + rc=0 + exit $rc + ;; + + f) + rc=1 + exit $rc + ;; + + t) + UNIT_TEST=1 + ;; + + i) + INTERACTIVE=1 + ;; + + P) + POPULATE_CACHE=1 + ;; + + d) + DETACH=1 + echo "Detach is not yet supported - exiting ...." + rc=100 + exit $rc + ;; + + D) + DEBUG=1 + ;; + + *) + echo "${BUILD_FLAGS:$i:1} is not a valid build flag" + rc=100 + exit $rc + ;; + esac +done + +if [ ${INTEGRATION_TEST} -eq 1 ]; then + integration-test + rc=0 + exit $rc +fi + +if [ ! -f ${BUILD_SPEC} ]; then + echo "spec file does not exist: $BUILD_SPEC" + rc=100 + exit $rc +fi + +if [ -z ${BUILD_DIR} ]; then + echo "Missing build directory" + rc=100 + exit $rc +fi + +if [ ! -z ${BUILD_LOG} ]; then + if [[ ${RECURSIVE} -ne 1 ]]; then + set +e + eval $0 -R $@ > ${BUILD_LOG} 2>&1 + rc=$? + set -e + if [ $rc -ne 0]; then + exit $rc + fi + fi +fi + +if [ ${TEST_SUCCEED} -eq 1 ]; then + sleep 1 + rc=0 + exit $rc +fi + +if [ ${TEST_FAIL} -eq 1 ]; then + sleep 1 + rc=1 + exit $rc +fi + +if [ -e ${LOCK_FILE} ]; then + echo "A build job is already running, exiting....." + rc=101 + exit $rc +fi + +echo $$ > ${LOCK_FILE} + +if [ ! -z ${BUILD_CACHE_URI} ]; then + if [ ${POPULATE_CACHE} -ne 1 ]; then + rm -rf /tmp/cache + mkdir /tmp/cache + echo "Downloading cach file ${BUILD_CACHE_URI}/${REMOTE_CACHE_ARCH_NAME} ..." + set +e + ${REMOTE_ACCESS_METHD} -o /tmp/cache/${LOCAL_CACHE_ARCH_NAME}.tgz ${BUILD_CACHE_URI}/${REMOTE_CACHE_ARCH_NAME} + rc=$? + set -e + if [ $rc -ne 0 ]; then + echo "Remote cache does not exist, or is not accessible - a new cache will be built ..." + POPULATE_CACHE=1 + else + echo "Unpacking cache file ..." + tar -C /tmp/cache -xvf /tmp/cache/${LOCAL_CACHE_ARCH_NAME}.tgz + cp /tmp/cache/cache/.versions ${BUILD_BASE}/. + echo "Validating cache content ..." + set +e + make -C ${BUILD_BASE} validate-cache; + rc=$? + if [ $rc -ne 0 ]; then + echo "Cache invalid - a new cache will be built " + POPULATE_CACHE=1 + else + cp -rf /tmp/cache/cache/. ${BUILD_BASE} + fi + rm -rf /tmp/cache + fi + fi +fi + +if [ ${POPULATE_CACHE} -eq 1 ]; then + if [ ${DEBUG} -eq 0 ]; then + set +e + cd ${BUILD_BASE} && make clean + rc=$? + set -e + if [ $rc -ne 0 ]; then + echo "Build - make clean failed, exiting ..." + rc=100 + exit $rc + fi + fi +fi + +if [ ! -z ${BUILD_VERSION} ]; then + MAKE_ARGS+="REVSTATE=${BUILD_VERSION} " +fi + +if [ ${UNIT_TEST} -eq 1 ]; then + MAKE_ARGS+="UNIT_TEST=TRUE " +else + MAKE_ARGS+="UNIT_TEST=FALSE " +fi + +if [ ${INTERACTIVE} -eq 1 ]; then + MAKE_ARGS+="INTERACTIVE=TRUE " +else + MAKE_ARGS+="INTERACTIVE=FALSE " +fi + +MAKE_ARGS+=all + +if [ ${DEBUG} -eq 0 ]; then + set +e + cd ${BUILD_BASE} && make ${MAKE_ARGS} + rc=$? + set -e + if [ $rc -gt 0 ]; then + echo "Build: make all failed, exiting ..." + rc=200 + exit $rc + fi +else +debug_make +fi +set +e +make -C ${BUILD_BASE} prepare-cache +rc=$? +set -e + +if [ $rc -gt 0 ]; then + echo "Build: make prepare-cache failed, exiting ..." + rc=100 + exit $rc +fi +echo "Copying built OPNFV .iso file to target directory ${BUILD_DIR} ..." +rm -rf ${BUILD_DIR} +mkdir ${BUILD_DIR} +cp ${BUILD_BASE}/.versions ${BUILD_DIR} +cp ${RESULT_DIR}/*.iso* ${BUILD_DIR} + +if [ $POPULATE_CACHE -eq 1 ]; then + if [ ! -z ${BUILD_CACHE_URI} ]; then + echo "Building cache ..." + tar --dereference -C ${BUILD_BASE} -caf ${BUILD_BASE}/${LOCAL_CACHE_ARCH_NAME}.tgz ${CACHE_DIR} + echo "Uploading cache ${BUILD_CACHE_URI}/${REMOTE_CACHE_ARCH_NAME}" + ${REMOTE_ACCESS_METHD} -T ${BUILD_BASE}/${LOCAL_CACHE_ARCH_NAME}.tgz ${BUILD_CACHE_URI}/${REMOTE_CACHE_ARCH_NAME} + rm ${BUILD_BASE}/${LOCAL_CACHE_ARCH_NAME}.tgz + fi +fi +echo "Success!!!" +exit 0 -- 2.16.6