*** FIRST VERSION OF CI BUILD SCRIPT *** 44/144/5
authorJonas Bjurel <jonas.bjurel@ericsson.com>
Thu, 12 Mar 2015 14:18:06 +0000 (15:18 +0100)
committerJonas Bjurel <jonas.bjurel@ericsson.com>
Tue, 17 Mar 2015 18:17:20 +0000 (19:17 +0100)
- 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 <jonas.bjurel@ericsson.com>
12 files changed:
fuel/build/DOC/BUILD/README.build
fuel/build/Makefile
fuel/build/Makefile~ [deleted file]
fuel/build/cache.mk [new file with mode: 0644]
fuel/build/docker/runcontext
fuel/build/f_isoroot/f_kscfg/ks.cfg
fuel/build/f_isoroot/f_kscfg/ks.cfg.orig
fuel/build/opendaylight/Makefile
fuel/build/opendaylight/f_odl/Makefile
fuel/build/opendaylight/make-odl-deb.sh
fuel/ci/README [new file with mode: 0644]
fuel/ci/build.sh [changed mode: 0644->0755]

index 519ee6a..b8ce799 100644 (file)
@@ -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
 ----------------------------------------
index 8e90fcc..e7cb6e7 100644 (file)
 #
 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 (file)
index 7f16a28..0000000
+++ /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 (file)
index 0000000..a3f3516
--- /dev/null
@@ -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}/$*
index a22fb29..cf116fc 100755 (executable)
@@ -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
index 932e9ac..508f044 100755 (executable)
@@ -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
index 44f9f42..bddf99c 100644 (file)
@@ -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
index 9c3d22d..c112ff6 100644 (file)
@@ -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
index 8ac5108..6983f0c 100644 (file)
@@ -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
index 24974dc..5222087 100755 (executable)
@@ -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 (file)
index 0000000..3525d4d
--- /dev/null
@@ -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.
+
old mode 100644 (file)
new mode 100755 (executable)
index e69de29..bb0d124
@@ -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