diff options
-rw-r--r-- | foreman/build/Makefile | 111 | ||||
-rw-r--r-- | foreman/build/c7-opnfv-x86_64-comps.xml | 277 | ||||
-rw-r--r-- | foreman/build/cache.mk | 78 | ||||
-rw-r--r-- | foreman/build/config.mk | 0 | ||||
-rw-r--r-- | foreman/build/isolinux.cfg | 120 | ||||
-rwxr-xr-x[-rw-r--r--] | foreman/ci/build.sh | 398 | ||||
-rw-r--r-- | foreman/include/build.sh.debug | 1 |
7 files changed, 985 insertions, 0 deletions
diff --git a/foreman/build/Makefile b/foreman/build/Makefile new file mode 100644 index 0000000..c08844f --- /dev/null +++ b/foreman/build/Makefile @@ -0,0 +1,111 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# dradez@redhat.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 +############################################################################## + +SHELL = /bin/bash +############################################################################ +# BEGIN of variables to customize +# +#Input args +export UNIT_TEST = FALSE +export INTERACTIVE = TRUE +export ISOSRC = file:$(shell pwd)/CentOS-7.0-1406-x86_64-Minimal.iso +export ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC)) +export PRODNO = "OPNFV_BGS" +export REVSTATE = "P0000" +export NEWISO = $(shell pwd)/release/OPNFV-CentOS-7-x86_64-${REVSTATE}.iso +export VBOXRPM = $(shell pwd)/VirtualBox-4.3-4.3.26_98988_fedora18-1.x86_64.rpm +export VAGRANTRPM = $(shell pwd)/vagrant_1.7.2_x86_64.rpm + +# 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. + +#Build variables +export BUILD_BASE := $(shell pwd) +export CACHE_DIR := $(BUILD_BASE)/cache +export VERSION_FILE := $(BUILD_BASE)/.versions +export TOPDIR := $(shell pwd) + +CENTDIR := $(TOPDIR)/centiso +# +# END of variables to customize +############################################################################# + +SUBCLEAN = $(addsuffix .clean,$(SUBDIRS)) + + +.PHONY: all +all: iso + @echo "Versions of cached build results built by" $(shell hostname) "at" $(shell date -u) > $(VERSION_FILE) + @echo "cache.mk" $(shell md5sum $(BUILD_BASE)/cache.mk | cut -f1 -d " ") >> $(VERSION_FILE) + @echo "config.mk" $(shell md5sum $(BUILD_BASE)/config.mk | cut -f1 -d " ") >> $(VERSION_FILE) + +############################################################################ +# BEGIN of Include definitions +# +include config.mk +include cache.mk +# +# END Include definitions +############################################################################# + +$(ISOCACHE): + #cp ~/Downloads/opnfv_iso/CentOS-7.0-1406-x86_64-Minimal.iso $(ISOCACHE) + +.PHONY: mount-centiso umount-centiso +mount-centiso: $(ISOCACHE) + @echo "Mounting CentOS ISO in $(CENTDIR)" + @mkdir -p $(CENTDIR) + @fuseiso $(ISOCACHE) $(CENTDIR) + +umount-centiso: + @set +e + @echo "Unmounting CentOS ISO from $(CENTDIR)" + @fusermount -u $(CENTDIR) + @rmdir $(CENTDIR) + @set -e + +.PHONY: build-clean $(SUBCLEAN) +build-clean: $(SUBCLEAN) + @rm -Rf centos + @rm -Rf release + @rm -Rf newiso + @rm -f $(NEWISO) + +.PHONY: clean $(SUBCLEAN) +clean: clean-cache $(SUBCLEAN) + @rm -f *.iso + @rm -Rf release + @rm -Rf newiso + @rm -f $(NEWISO) + @rm -f $(BUILD_BASE)/.versions + +$(SUBCLEAN): %.clean: + $(MAKE) -C $* -f Makefile clean + +# Todo: Make things smarter - we shouldn't need to clean everything +# betwen make invocations. +.PHONY: iso +iso: build-clean mount-centiso $(ISOCACHE) $(VBOXRPM) $(VAGRANTRPM) + @mkdir centos release + cp -r $(CENTDIR)/* centos + @make umount-centiso + # modify the installer iso's contents + @rm -rf centos/repodata + @cp -f isolinux.cfg centos/isolinux/isolinux.cfg + @cp $(VBOXRPM) centos/Packages + @cp $(VAGRANTRPM) centos/Packages + # regenerate yum repo data + @echo "Generating new yum metadata" + createrepo centos/Packages -g ../../c7-opnfv-x86_64-comps.xml -o centos + # build the iso + @echo "Building OPNFV iso" + mkisofs -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -V "OPNFV CentOS 7 x86_64" -R -J -v -T -o $(NEWISO) centos + @printf "\n\nISO is built at $(NEWISO)\n\n" diff --git a/foreman/build/c7-opnfv-x86_64-comps.xml b/foreman/build/c7-opnfv-x86_64-comps.xml new file mode 100644 index 0000000..3d0266e --- /dev/null +++ b/foreman/build/c7-opnfv-x86_64-comps.xml @@ -0,0 +1,277 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!DOCTYPE comps PUBLIC "-//CentOS//DTD Comps info//EN" "comps.dtd"> +<comps> + + <group> + <id>core</id> + <name>Core</name> + <name xml:lang='af'>Kern</name> + <name xml:lang='am'>ማዕከላዊ ቦታ</name> + <name xml:lang='ar'>اللبّ</name> + <name xml:lang='as'>ভিত্তি</name> + <name xml:lang='bal'>هستگ</name> + <name xml:lang='be'>Падмурак</name> + <name xml:lang='bg'>Основа</name> + <name xml:lang='bn'>কোর</name> + <name xml:lang='bn_IN'>কোর</name> + <name xml:lang='bs'>Jezgra</name> + <name xml:lang='ca'>Nucli</name> + <name xml:lang='cs'>Úplný základ</name> + <name xml:lang='cy'>Craidd</name> + <name xml:lang='da'>Grundlæggende</name> + <name xml:lang='de'>Kern</name> + <name xml:lang='el'>Πυρήνας</name> + <name xml:lang='en_GB'>Core</name> + <name xml:lang='es'>Núcleo</name> + <name xml:lang='et'>Tuum</name> + <name xml:lang='fa'>اصل</name> + <name xml:lang='fi'>Keskeiset</name> + <name xml:lang='fr'>Core</name> + <name xml:lang='gl'>Núcleo</name> + <name xml:lang='gu'>મૂળ</name> + <name xml:lang='he'>ליבה</name> + <name xml:lang='hi'>कोर</name> + <name xml:lang='hr'>Jezgra</name> + <name xml:lang='hu'>Mag</name> + <name xml:lang='hy'>Հիմք</name> + <name xml:lang='ia'>Nucleo</name> + <name xml:lang='id'>Inti</name> + <name xml:lang='ilo'>Bugas</name> + <name xml:lang='is'>Lágmarkskerfi</name> + <name xml:lang='it'>Principale</name> + <name xml:lang='ja'>コア</name> + <name xml:lang='ka'>ბირთვი</name> + <name xml:lang='kn'>ಅಂತಸ್ಸಾರ</name> + <name xml:lang='ko'>핵심</name> + <name xml:lang='lv'>Pamatsistēma</name> + <name xml:lang='mai'>कोर</name> + <name xml:lang='mk'>Основни</name> + <name xml:lang='ml'>കോറ്</name> + <name xml:lang='mr'>कोर</name> + <name xml:lang='ms'>Teras</name> + <name xml:lang='nb'>Kjerne</name> + <name xml:lang='ne'>कोर</name> + <name xml:lang='nl'>Kern</name> + <name xml:lang='no'>Kjerne</name> + <name xml:lang='nso'>Bogare</name> + <name xml:lang='or'>ପ୍ରମୂଖ</name> + <name xml:lang='pa'>ਮੂਲ</name> + <name xml:lang='pl'>Rdzeń</name> + <name xml:lang='pt'>Núcleo</name> + <name xml:lang='pt_BR'>Núcleo</name> + <name xml:lang='ro'>Nucleu</name> + <name xml:lang='ru'>Основа</name> + <name xml:lang='si'>න්යෂ්ඨිය</name> + <name xml:lang='sk'>Jadro</name> + <name xml:lang='sl'>Jedro</name> + <name xml:lang='sq'>Bërthama</name> + <name xml:lang='sr'>Срж</name> + <name xml:lang='sr@latin'>Srž</name> + <name xml:lang='sr@Latn'>Srž</name> + <name xml:lang='sv'>Grund</name> + <name xml:lang='ta'>கோர்</name> + <name xml:lang='te'>అంతర్భాగం</name> + <name xml:lang='tg'>Система</name> + <name xml:lang='th'>แกนหลัก</name> + <name xml:lang='tr'>Çekirdek</name> + <name xml:lang='uk'>Основа</name> + <name xml:lang='ur'>مرکز</name> + <name xml:lang='vi'>Lõi</name> + <name xml:lang='zh_CN'>核心</name> + <name xml:lang='zh_TW'>核心</name> + <name xml:lang='zu'>Okuyikhona</name> + <description>Smallest possible installation.</description> + <description xml:lang='as'>ন্যূনতম ইনস্টল।</description> + <description xml:lang='bn'>ন্যূনতম ইনস্টলেশন।</description> + <description xml:lang='bn_IN'>ন্যূনতম ইনস্টলেশন।</description> + <description xml:lang='cs'>Nejmenší možná instalace.</description> + <description xml:lang='de'>Kleinstmögliche Installation.</description> + <description xml:lang='es'>La instalación más pequeña posible.</description> + <description xml:lang='fr'>Plus petite installation possible.</description> + <description xml:lang='gu'>નાનામાં નાના શક્ય સ્થાપન.</description> + <description xml:lang='hi'>लघुतम संभावित संस्थापन.</description> + <description xml:lang='ia'>Le minime possibile installation.</description> + <description xml:lang='it'>Minima installazione possibile.</description> + <description xml:lang='ja'>最小限のインストール</description> + <description xml:lang='kn'>ಅತ್ಯಲ್ಪಸಾಧ್ಯ ಅನುಸ್ಥಾಪನೆ.</description> + <description xml:lang='ko'>가능한 최소 설치</description> + <description xml:lang='ml'>സാധ്യമായ ഏറ്റവും ചെറിയ ഇന്സ്റ്റലേഷന്.</description> + <description xml:lang='mr'>शक्यतया सर्वात लहान प्रतिष्ठापन.</description> + <description xml:lang='or'>କ୍ଷୁଦ୍ରତମ ସମ୍ଭାବ୍ଯ ସ୍ଥାପନା।</description> + <description xml:lang='pa'>ਘੱਟੋ-ਘੱਟ ਸੰਭਵ ਇੰਸਟਾਲੇਸ਼ਨ।</description> + <description xml:lang='pl'>Najmniejsza możliwa instalacja.</description> + <description xml:lang='pt_BR'>Menor instalação possível</description> + <description xml:lang='ru'>Минимально возможная установка</description> + <description xml:lang='sv'>Minsta möjliga installation</description> + <description xml:lang='ta'>மிகச் சிறிய செயல்படுத்தக்கூடிய நிறுவல்.</description> + <description xml:lang='te'>సాధ్యమగు అతిచిన్న సంస్థాపన.</description> + <description xml:lang='uk'>Мінімально можливе встановлення.</description> + <description xml:lang='zh_CN'>最小可能安装。</description> + <description xml:lang='zh_TW'>最小型安裝。</description> + <default>false</default> + <uservisible>false</uservisible> + <packagelist> + <packagereq type="default">aic94xx-firmware</packagereq> + <packagereq type="default">alsa-firmware</packagereq> + <packagereq type="default">bfa-firmware</packagereq> + <packagereq type="default">dracut-config-rescue</packagereq> + <packagereq type="default">ivtv-firmware</packagereq> + <packagereq type="default">iwl1000-firmware</packagereq> + <packagereq type="default">iwl100-firmware</packagereq> + <packagereq type="default">iwl105-firmware</packagereq> + <packagereq type="default">iwl135-firmware</packagereq> + <packagereq type="default">iwl2000-firmware</packagereq> + <packagereq type="default">iwl2030-firmware</packagereq> + <packagereq type="default">iwl3160-firmware</packagereq> + <packagereq type="default">iwl3945-firmware</packagereq> + <packagereq type="default">iwl4965-firmware</packagereq> + <packagereq type="default">iwl5000-firmware</packagereq> + <packagereq type="default">iwl5150-firmware</packagereq> + <packagereq type="default">iwl6000-firmware</packagereq> + <packagereq type="default">iwl6000g2a-firmware</packagereq> + <packagereq type="default">iwl6000g2b-firmware</packagereq> + <packagereq type="default">iwl6050-firmware</packagereq> + <packagereq type="default">iwl7260-firmware</packagereq> + <packagereq type="default">kernel-tools</packagereq> + <packagereq type="default">libertas-sd8686-firmware</packagereq> + <packagereq type="default">libertas-sd8787-firmware</packagereq> + <packagereq type="default">libertas-usb8388-firmware</packagereq> + <packagereq type="default">linux-firmware</packagereq> + <packagereq type="default">microcode_ctl</packagereq> + <packagereq type="default">NetworkManager</packagereq> + <packagereq type="default">NetworkManager-tui</packagereq> + <packagereq type="default">postfix</packagereq> + <packagereq type="default">ql2100-firmware</packagereq> + <packagereq type="default">ql2200-firmware</packagereq> + <packagereq type="default">ql23xx-firmware</packagereq> + <packagereq type="mandatory">audit</packagereq> + <packagereq type="mandatory">basesystem</packagereq> + <packagereq type="mandatory">bash</packagereq> + <packagereq type="mandatory">biosdevname</packagereq> + <packagereq type="mandatory">btrfs-progs</packagereq> + <packagereq type="mandatory">coreutils</packagereq> + <packagereq type="mandatory">cronie</packagereq> + <packagereq type="mandatory">curl</packagereq> + <packagereq type="mandatory">dhclient</packagereq> + <packagereq type="mandatory">e2fsprogs</packagereq> + <packagereq type="mandatory">filesystem</packagereq> + <packagereq type="mandatory">glibc</packagereq> + <packagereq type="mandatory">hostname</packagereq> + <packagereq type="mandatory">initscripts</packagereq> + <packagereq type="mandatory">iproute</packagereq> + <packagereq type="mandatory">iprutils</packagereq> + <packagereq type="mandatory">iptables</packagereq> + <packagereq type="mandatory">iputils</packagereq> + <packagereq type="mandatory">irqbalance</packagereq> + <packagereq type="mandatory">kbd</packagereq> + <packagereq type="mandatory">kexec-tools</packagereq> + <packagereq type="mandatory">less</packagereq> + <packagereq type="mandatory">man-db</packagereq> + <packagereq type="mandatory">ncurses</packagereq> + <packagereq type="mandatory">openssh-clients</packagereq> + <packagereq type="mandatory">openssh-server</packagereq> + <packagereq type="mandatory">parted</packagereq> + <packagereq type="mandatory">passwd</packagereq> + <packagereq type="mandatory">plymouth</packagereq> + <packagereq type="mandatory">policycoreutils</packagereq> + <packagereq type="mandatory">procps-ng</packagereq> + <packagereq type="mandatory">rootfiles</packagereq> + <packagereq type="mandatory">rpm</packagereq> + <packagereq type="mandatory">rsyslog</packagereq> + <packagereq type="mandatory">selinux-policy-targeted</packagereq> + <packagereq type="mandatory">setup</packagereq> + <packagereq type="mandatory">shadow-utils</packagereq> + <packagereq type="mandatory">sudo</packagereq> + <packagereq type="mandatory">systemd</packagereq> + <packagereq type="mandatory">tar</packagereq> + <packagereq type="mandatory">tuned</packagereq> + <packagereq type="mandatory">util-linux</packagereq> + <packagereq type="mandatory">vagrant</packagereq> + <packagereq type="mandatory">vim-minimal</packagereq> + <packagereq type="mandatory">VirtualBox</packagereq> + <packagereq type="mandatory">xfsprogs</packagereq> + <packagereq type="mandatory">yum</packagereq> + <packagereq type="optional">dracut-config-generic</packagereq> + <packagereq type="optional">dracut-fips-aesni</packagereq> + <packagereq type="optional">dracut-fips</packagereq> + <packagereq type="optional">dracut-network</packagereq> + <packagereq type="optional">openssh-keycat</packagereq> + <packagereq type="optional">selinux-policy-mls</packagereq> + <packagereq type="optional">tboot</packagereq> + </packagelist> + </group> + + <environment> + <id>opnfv_provisioning</id> + <name>OPNVF Provisioning Server Install</name> + <name xml:lang='as'>নূন্যতম ইনস্টল</name> + <name xml:lang='bn_IN'>ন্যূনতম ইনস্টল</name> + <name xml:lang='cs'>Minimální instalace</name> + <name xml:lang='de'>Minimale Installation</name> + <name xml:lang='es'>Instalación mínima</name> + <name xml:lang='fr'>Installation minimale</name> + <name xml:lang='gu'>ન્યૂનતમ સ્થાપન</name> + <name xml:lang='hi'>न्यूनतम संस्थापन</name> + <name xml:lang='it'>Installazione minima</name> + <name xml:lang='ja'>最小限のインストール</name> + <name xml:lang='kn'>ಕನಿಷ್ಟ ಅನುಸ್ಥಾಪನೆ</name> + <name xml:lang='ko'>최소 설치</name> + <name xml:lang='ml'>ഏറ്റവും കുറഞ്ഞ ഇന്സ്റ്റോള്</name> + <name xml:lang='mr'>किमान इंस्टॉल</name> + <name xml:lang='or'>ସର୍ବନିମ୍ନ ସ୍ଥାପନ</name> + <name xml:lang='pa'>ਘੱਟ ਤੋਂ ਘੱਟ ਇੰਸਟਾਲ</name> + <name xml:lang='pl'>Minimalna instalacja</name> + <name xml:lang='pt_BR'>Instalações Mínimas</name> + <name xml:lang='ru'>Минимальная установка</name> + <name xml:lang='ta'>குறைந்தபட்ச நிறுவல்</name> + <name xml:lang='te'>కనీసపు సంస్థాపన</name> + <name xml:lang='uk'>Мінімальна система</name> + <name xml:lang='zh_CN'>最小安装</name> + <name xml:lang='zh_TW'>最小型安裝</name> + <description>Basic functionality.</description> + <description xml:lang='as'>মৌলি কাৰ্য্যকৰীতা।</description> + <description xml:lang='bn_IN'>প্রাথমিক বৈশিষ্ট্য।</description> + <description xml:lang='cs'>Základní funkcionalita.</description> + <description xml:lang='de'>Grundlegende Funktionalität.</description> + <description xml:lang='es'>Funcionalidad básica.</description> + <description xml:lang='fr'>Fonctionnalité de base.</description> + <description xml:lang='gu'>મૂળભૂત વિધેય.</description> + <description xml:lang='hi'>मौलिक प्रकार्यात्मकता.</description> + <description xml:lang='it'>Funzione di base.</description> + <description xml:lang='ja'>基本的な機能です。</description> + <description xml:lang='kn'>ಮೂಲಭೂತ ಕ್ರಿಯಾಶೀಲತೆ.</description> + <description xml:lang='ko'>기본적인 기능입니다.</description> + <description xml:lang='ml'>അടിസ്ഥാന പ്രവൃത്തിവിശേഷണം.</description> + <description xml:lang='mr'>मूळ कार्यक्षमता.</description> + <description xml:lang='or'>ସାଧାରଣ କାର୍ଯ୍ୟକାରିତା।</description> + <description xml:lang='pa'>ਮੁੱਢਲੀ ਕਾਰਜਸ਼ੀਲਤਾ।</description> + <description xml:lang='pl'>Podstawowa funkcjonalność.</description> + <description xml:lang='pt_BR'>Função básica</description> + <description xml:lang='ru'>Базовая функциональность.</description> + <description xml:lang='ta'>அடிப்படை செயலம்சம்.</description> + <description xml:lang='te'>ప్రాథమిక ఫంక్షనాలిటి.</description> + <description xml:lang='uk'>Основні можливості.</description> + <description xml:lang='zh_CN'>基本功能。</description> + <description xml:lang='zh_TW'>基本功能。</description> + <display_order>5</display_order> + <grouplist> + <groupid>core</groupid> + </grouplist> + <optionlist> + + </optionlist> + </environment> + <langpacks> + <match install="autocorr-%s" name="autocorr-en"/> + <match install="firefox-langpack-%s" name="firefox"/> + <match install="gimp-help-%s" name="gimp-help"/> + <match install="gnome-getting-started-docs-%s" name="gnome-getting-started-docs"/> + <match install="hunspell-%s" name="hunspell"/> + <match install="hyphen-%s" name="hyphen"/> + <match install="kde-l10n-%s" name="kdelibs"/> + <match install="libreoffice-langpack-%s" name="libreoffice-core"/> + <match install="man-pages-%s" name="man-pages"/> + <match install="mythes-%s" name="mythes"/> + </langpacks> + +</comps> diff --git a/foreman/build/cache.mk b/foreman/build/cache.mk new file mode 100644 index 0000000..9ae3a7c --- /dev/null +++ b/foreman/build/cache.mk @@ -0,0 +1,78 @@ +############################################################################## +# 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 +############################################################################## + +SHELL = /bin/bash +CACHEVALIDATE := $(addsuffix .validate,$(SUBDIRS)) +CACHECLEAN := $(addsuffix .clean,$(CACHEFILES) $(CACHEDIRS)) + +############################################################################ +# BEGIN of variables to customize +# +CACHEFILES += .versions +CACHEFILES += $(shell basename $(ISOSRC)) +# +# END of variables to customize +############################################################################ + +.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 $(BUILD_BASE)/$@;\ + fi + @ln -s $(BUILD_BASE)/$@ $(CACHE_DIR)/$@ + +.PHONY: $(CACHEFILES) +$(CACHEFILES): + @mkdir -p $(dir $(CACHE_DIR)/$@) + @if [ ! -d $(dir $(BUILD_BASE)/$@) ]; then\ + mkdir -p $(dir $(BUILD_BASE)/$@);\ + fi + + @if [ ! -f $(BUILD_BASE)/$@ ]; then\ + 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: prepare $(CACHEVALIDATE) + @if [[ $(shell md5sum $(BUILD_BASE)/config.mk | cut -f1 -d " ") != $(shell cat $(VERSION_FILE) | 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 | cut -f1 -d " ") != $(shell cat $(VERSION_FILE) | grep cache.mk | awk '{print $$NF}') ]]; then\ + echo "Cache does not match current cache.mk definition, cache must be rebuilt";\ + exit 1;\ + fi; + +.PHONY: $(CACHEVALIDATE) +$(CACHEVALIDATE): %.validate: + @echo VALIDATE $(CACHEVALIDATE) + $(MAKE) -C $* -f Makefile validate-cache + +.PHONY: $(CACHECLEAN) +$(CACHECLEAN): %.clean: + rm -rf ${CACHE_DIR}/$* diff --git a/foreman/build/config.mk b/foreman/build/config.mk new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/foreman/build/config.mk diff --git a/foreman/build/isolinux.cfg b/foreman/build/isolinux.cfg new file mode 100644 index 0000000..12848de --- /dev/null +++ b/foreman/build/isolinux.cfg @@ -0,0 +1,120 @@ +default vesamenu.c32 +timeout 600 + +display boot.msg + +# Clear the screen when exiting the menu, instead of leaving the menu displayed. +# For vesamenu, this means the graphical background is still displayed without +# the menu itself for as long as the screen remains in graphics mode. +menu clear +menu background splash.png +menu title CentOS 7 +menu vshift 8 +menu rows 18 +menu margin 8 +#menu hidden +menu helpmsgrow 15 +menu tabmsgrow 13 + +# Border Area +menu color border * #00000000 #00000000 none + +# Selected item +menu color sel 0 #ffffffff #00000000 none + +# Title bar +menu color title 0 #ff7ba3d0 #00000000 none + +# Press [Tab] message +menu color tabmsg 0 #ff3a6496 #00000000 none + +# Unselected menu item +menu color unsel 0 #84b8ffff #00000000 none + +# Selected hotkey +menu color hotsel 0 #84b8ffff #00000000 none + +# Unselected hotkey +menu color hotkey 0 #ffffffff #00000000 none + +# Help text +menu color help 0 #ffffffff #00000000 none + +# A scrollbar of some type? Not sure. +menu color scrollbar 0 #ffffffff #ff355594 none + +# Timeout msg +menu color timeout 0 #ffffffff #00000000 none +menu color timeout_msg 0 #ffffffff #00000000 none + +# Command prompt text +menu color cmdmark 0 #84b8ffff #00000000 none +menu color cmdline 0 #ffffffff #00000000 none + +# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message. + +menu tabmsg Press Tab for full configuration options on menu items. + +menu separator # insert an empty line +menu separator # insert an empty line + +label linux + menu label ^Install OPNFV CentOS 7 + menu default + kernel vmlinuz + append initrd=initrd.img inst.stage2=hd:LABEL=OPNFV\x20CentOS\x207\x20x86_64 + +#label check +# menu label Test this ^media & install CentOS 7 +# kernel vmlinuz +# append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet + +menu separator # insert an empty line + +# utilities submenu +menu begin ^Troubleshooting + menu title Troubleshooting + +label vesa + menu indent count 5 + menu label Install CentOS 7 in ^basic graphics mode + text help + Try this option out if you're having trouble installing + CentOS 7. + endtext + kernel vmlinuz + append initrd=initrd.img inst.stage2=hd:LABEL=OPNFV\x20CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet + +label rescue + menu indent count 5 + menu label ^Rescue a CentOS system + text help + If the system will not boot, this lets you access files + and edit config files to try to get it booting again. + endtext + kernel vmlinuz + append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet + +label memtest + menu label Run a ^memory test + text help + If your system is having issues, a problem with your + system's memory may be the cause. Use this utility to + see if the memory is working correctly. + endtext + kernel memtest + +menu separator # insert an empty line + +label local + menu label Boot from ^local drive + localboot 0xffff + +menu separator # insert an empty line +menu separator # insert an empty line + +label returntomain + menu label Return to ^main menu + menu exit + +menu end diff --git a/foreman/ci/build.sh b/foreman/ci/build.sh index e69de29..f3d5cf0 100644..100755 --- a/foreman/ci/build.sh +++ b/foreman/ci/build.sh @@ -0,0 +1,398 @@ +#!/bin/bash +set -e +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# stefan.k.berg@ericsson.com +# jonas.bjurel@ericsson.com +# dradez@redhat.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 + +############################################################################ +# BEGIN of usage description +# +usage () +{ +cat << EOF +$0 Builds the Foreman OPNFV Deployment ISO + +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. + -t run small build-script unit test. + -T run large build-script unit test. + -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 foreman_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/foreman/cache -d ~/jenkins/genesis/foreman/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 +} +# +# END of usage description +############################################################################ + +############################################################################ +# BEGIN of variables to customize +# +BUILD_BASE=$(readlink -e ../build/) +RESULT_DIR="${BUILD_BASE}/release" +BUILD_SPEC="${BUILD_BASE}/config.mk" +CACHE_DIR="cache" +LOCAL_CACHE_ARCH_NAME="foreman-cache" +REMOTE_CACHE_ARCH_NAME="foreman_cache-$(md5sum ${BUILD_SPEC}| cut -f1 -d " ")" +REMOTE_ACCESS_METHD=curl +INCLUDE_DIR=../include +# +# END of variables to customize +############################################################################ + +############################################################################ +# BEGIN of 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 +FULL_INTEGRATION_TEST=0 +INTERACTIVE=0 +BUILD_CACHE_URI= +BUILD_SPEC= +BUILD_DIR= +BUILD_LOG= +BUILD_VERSION= +MAKE_ARGS= +# +# END of script assigned variables +############################################################################ + +############################################################################ +# BEGIN of include pragmas +# +source ${INCLUDE_DIR}/build.sh.debug +# +# END of include +############################################################################ + +############################################################################ +# BEGIN of main +# +while getopts "s:c:d:v:f:l:r:RtTh" OPTION +do + case $OPTION in + h) + usage + rc=0 + exit $rc + ;; + + s) + BUILD_SPEC=${OPTARG} + ;; + + c) + BUILD_CACHE_URI=${OPTARG} + ;; + + d) + BUILD_DIR=${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 + ;; + + T) + INTEGRATION_TEST=1 + FULL_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 - exiting ...." + rc=100 + exit $rc + ;; + esac +done + +shift $((OPTIND-1)) + +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 - exiting ...." + rc=100 + exit $rc +fi + +if [ -z ${BUILD_DIR} ]; then + echo "Missing build directory - exiting ...." + 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}.tgz + tar -tzf ${BUILD_CACHE_URI}/${REMOTE_CACHE_ARCH_NAME}.tgz >/dev/null + 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}/. + set +e + make -C ${BUILD_BASE} validate-cache; + rc=$? + set -e + + 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 -p ${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}.tgz + rm ${BUILD_BASE}/${LOCAL_CACHE_ARCH_NAME}.tgz + fi +fi +echo "Success!!!" +exit 0 +# +# END of main +############################################################################ diff --git a/foreman/include/build.sh.debug b/foreman/include/build.sh.debug new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/foreman/include/build.sh.debug @@ -0,0 +1 @@ + |