aboutsummaryrefslogtreecommitdiffstats
path: root/build/Makefile
blob: 1d1b7402222761bf1edbccf28c2d726e711b1279 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
##############################################################################
# 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

# This file will be created if needed by runcontext to contain proxy
# settings.
-include environment.mk

############################################################################
# BEGIN of variables to customize
#
#Input args
export MOSVERSION = 9.0
export ISOSRC = file:$(shell pwd)/fuel-$(MOSVERSION).iso
export ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC))
export PRODNO ?= "OPNFV_FUEL"
export REVSTATE = "P0000"
export USER ?= $(shell whoami)
export BUILD_DATE = $(shell date --utc +%Y-%m-%d:%H:%M)
export OPNFV_GIT_SHA ?= $(shell git rev-parse HEAD)
# Store in /etc/fuel_build_id on fuel master
export BUILD_ID := $(PRODNO)_$(BUILD_DATE)_$(OPNFV_GIT_SHA)

ifdef BUILD_FUEL_PLUGINS
$(warning Overriding plugin build selection to $(BUILD_FUEL_PLUGINS))
export NEWISO = $(shell pwd)/release/unofficial-opnfv-${REVSTATE}.iso
else
export NEWISO = $(shell pwd)/release/opnfv-${REVSTATE}.iso
endif

# 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 DEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/main
export UDEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/debian-installer
export PUPPET_DEST := $(BUILD_BASE)/release/puppet/modules
export VERSION_FILE := $(BUILD_BASE)/.versions
export DOCKERIMG = opnfv.org/ubuntu-builder:14.04
export TOPDIR := $(shell pwd)
export REPOINFO  := $(BUILD_BASE)/repo_info.sh

# Use snapshots
# Use nearby repositories
export MIRROR_UBUNTU_URL := $(shell ./f_isoroot/f_repobuild/select_ubuntu_repo.sh --url)
export MIRROR_UBUNTU := $(shell echo "$(MIRROR_UBUNTU_URL)" | cut -d'/' -f3 )
export MIRROR_UBUNTU_ROOT := $(shell echo -n '/' ; echo "$(MIRROR_UBUNTU_URL)" | cut -d'/' -f4-)

export LATEST_MIRROR_ID_URL := http://$(shell ./select_closest_fuel_mirror.py)

export MIRROR_MOS_UBUNTU ?= $(shell echo "$(LATEST_MIRROR_ID_URL)" | cut -d'/' -f3)
#export LATEST_TARGET_UBUNTU := $(shell curl -sSf "$(MIRROR_MOS_UBUNTU)/mos-repos/ubuntu/$(MOSVERSION).target.txt" | head -1)
# Fuel 9.0
export LATEST_TARGET_UBUNTU := snapshots/9.0-2016-06-23-164100-copy
export MIRROR_MOS_UBUNTU_ROOT := /mos-repos/ubuntu/$(LATEST_TARGET_UBUNTU)

export LATEST_TARGET_CENTOS := $(shell curl -sSf "$(LATEST_MIRROR_ID_URL)/mos-repos/centos/mos$(MOSVERSION)-centos7/os.target.txt" | head -1)
export MIRROR_FUEL := "$(LATEST_MIRROR_ID_URL)/mos-repos/centos/mos$(MOSVERSION)-centos7/$(LATEST_TARGET_CENTOS)/x86_64"

# uncomment and use: make print-VARIABLE
#print-%  : ; @echo $* = $($*)

#Build subclasses

SUBDIRS := f_isoroot

# f_example is only an example of how to generate a .deb package and
# should not be enabled in official builds.
#SUBDIRS += f_example

ORIGDIR := $(TOPDIR)/origiso
#
# END of variables to customize
#############################################################################

# Fuel-main destination path and fuel-* submodule patching, for full list check:
# https://github.com/openstack/fuel-main/blob/stable/mitaka/repos.mk#L32-L44
FUEL_MAIN_DIR := /tmp/fuel-main
FUEL_PATCHES  := $(shell find $(BUILD_BASE)/patch-repos -name '*.patch' | sort)

SUBCLEAN = $(addsuffix .clean,$(SUBDIRS))

.PHONY: all
all:
	@docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1)
	@make -C docker
	@lsb_release -a | grep Ubuntu > /dev/null 2>&1 || (echo 'Ubuntu is the only supported Linux distribution for this build system'; exit 1)
	@KERNEL_VER=$$(uname -r); \
	KERNEL_ARRAY=($${KERNEL_VER//./ }); \
	if [ $${KERNEL_ARRAY[0]} -lt 3  ] || [[ $${KERNEL_ARRAY[0]} -eq 3 && $${KERNEL_ARRAY[1]} -lt 19  ]] ; then (echo 'Kernel version must be 3.19 or newer'; exit 1) ; fi
	@docker/runcontext $(DOCKERIMG) wget -q www.google.com -O /dev/null || (echo 'No docker network connectivity or name server - check your network- and docker settings'; exit 1)
	@docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso


############################################################################
# BEGIN of Include definitions
#
include config.mk
include cache.mk
#
# END Include definitions
#############################################################################

$(ISOCACHE):
	# Clone Fuel to non-persistent location and build
	sudo rm -rf $(FUEL_MAIN_DIR)
	git clone $(FUEL_MAIN_REPO) $(FUEL_MAIN_DIR)
	git -C $(FUEL_MAIN_DIR) checkout $(FUEL_MAIN_TAG)
	@echo "fuel" `git -C $(FUEL_MAIN_DIR) rev-parse HEAD` >> $(VERSION_FILE)
	# Remove Docker optimizations, otherwise multistrap will fail during
	# Fuel build.
	sudo rm -f /etc/apt/apt.conf.d/docker*
	#
	# Need to replace the old Docker v. 1.5.0 with a later version to be
	# able to access the Docker remote repository!
	sudo apt-get install apt-transport-https ca-certificates -y
	sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
	echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
	sudo apt-get update -y
	sudo apt-get install docker-engine -y
	sudo sh -c 'echo DOCKER_OPTS=\"--bip 172.45.0.1/24\" > /etc/default/docker'
	sudo service docker stop || exit 0
	sudo service docker start

	cd $(FUEL_MAIN_DIR) && ./prepare-build-env.sh
	# Verify that Docker is alive
	sudo docker info
	# fuel-main Makefiles do not like `make -C`
	cd $(FUEL_MAIN_DIR) && make repos
	$(REPOINFO) -r $(FUEL_MAIN_DIR) > gitinfo_fuel.txt
	# OPNFV patches at Fuel build time
	# Need to be commited in order for them to be considered by the Fuel
	# build system
	$(foreach patch,$(FUEL_PATCHES),git \
		-C $(subst $(BUILD_BASE)/patch-repos,$(FUEL_MAIN_DIR),$(dir $(patch))) \
		am --whitespace=nowarn --committer-date-is-author-date $(patch) || \
		(echo 'Error: Failed patching Fuel repos!' ; exit 1);)

	# Repeat build up to three times
	sudo -E ./fuel_build_loop
	cp $(FUEL_MAIN_DIR)/build/artifacts/fuel*.iso .
	# Store artifact in cache straight away if caching is enabled
	# (no .cacheid will be present unless this is a cached build)
	test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0

.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/packages/ubuntu/pool/debian-installer 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: clean $(SUBCLEAN)
clean:  $(SUBCLEAN)
	$(MAKE) -C patch-packages -f Makefile clean
	@rm -f *.iso
	@rm -Rf release
	@rm -Rf newiso
	@rm -Rf .versions
	@rm -f $(NEWISO)
	@rm -f $(BUILD_BASE)/gitinfo_*.txt

.PHONY: deepclean
deepclean: clean clean-cache
	make -C docker clean
	docker rmi opnfv.org/ubuntu-builder:14.04 &>/dev/null || exit 0
	docker rmi opnfv.org/ubuntu-builder:latest &>/dev/null || exit 0
	docker rmi ubuntu:14.04 &>/dev/null || exit 0
	@if docker images | grep -q "^ubuntu *14.04"; then \
		echo "Error: ubuntu:14.04 still present!"; \
		exit 1; \
	fi
	@if docker images | grep -q "opnfv.org/ubuntu-builder"; then \
		echo "Error: opnfv.org/ubuntu-builder still present!"; \
		exit 1; \
	fi

$(SUBCLEAN): %.clean:
	$(MAKE) -C $* -f Makefile clean

.PHONY: setup-env
setup-env:
	@if [ -f environment.mk ]; then \
		sudo bash -c "cat environment.mk >> /etc/environment"; \
	fi

# Todo: Make things smarter - we shouldn't need to clean everything
# betwen make invocations.
.PHONY: iso
iso:	setup-env $(ISOCACHE) $(SUBDIRS) patch-packages
	$(REPOINFO) . > gitinfo_main.txt
	install/install.sh iso $(ISOCACHE) $(NEWISO) $(PRODNO) $(REVSTATE)
	@printf "\n\nProduct ISO is $(NEWISO)\n\n"

# Start a bash shell in docker for Makefile debugging
.PHONY: debug
debug:
	@docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1)
	@make -C docker
	docker/runcontext $(DOCKERIMG) debug

#############################################################################
# Cache operations - only used when building through ci/build.sh
#############################################################################

# Create a unique hash to be used for getting and putting cache, based on:
#   - The commit ID of the full Fuel repo structre
#   - The contents of all local Fuel patches
.cacheid:
	git clone $(FUEL_MAIN_REPO) $(FUEL_MAIN_DIR)
	git -C $(FUEL_MAIN_DIR) checkout $(FUEL_MAIN_TAG)
	make -C $(FUEL_MAIN_DIR) repos
	$(REPOINFO) -r $(FUEL_MAIN_DIR) > .cachedata
	$(foreach patch,$(FUEL_PATCHES),sha1sum $(patch) >> .cachedata;)
	sha1sum fuel_build_loop >> .cachedata
	sha1sum config.mk >> .cachedata
	sha1sum Makefile >> .cachedata
	$(CACHETOOL) getbiweek >> .cachedata
	cat .cachedata | $(CACHETOOL) getid > .cacheid
	# Not removing fuel-main as it is re-used in build

# Clean local data related to caching - called prior to ordinary build
.PHONY: clean-cache
clean-cache: $(SUBCLEANCACHE)
	rm -f .cachedata .cacheid

# Try to download cache - called prior to ordinary build
.PHONY: get-cache
get-cache: .cacheid
	@if $(CACHETOOL) check $(shell cat .cacheid); then \
		 $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\
	else \
		exit 0;\
	fi

# Store cache if not already stored - called after ordinary build
.PHONY: put-cache
put-cache: .cacheid
	@tar cf - fuel*.iso gitinfo_fuel.txt | $(CACHETOOL) put $(shell cat .cacheid)