From d045ba89b0b044a159dc8bff805d856d73724012 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Wed, 20 Apr 2016 22:12:57 +0100 Subject: [PATCH] Split scripts by ## (and remove comments / whitespace) to facilitate caching, add option for multicore to make --- .gitignore | 3 ++- build/Makefile | 12 ++++++++++-- build/parts.py | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 build/parts.py diff --git a/.gitignore b/.gitignore index 5bc6a0a..4a04960 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /build/Dockerfile -/build/tmp.* \ No newline at end of file +/build/tmp.* +/build/parts/* \ No newline at end of file diff --git a/build/Makefile b/build/Makefile index 2efbf1f..2c744fa 100644 --- a/build/Makefile +++ b/build/Makefile @@ -3,6 +3,7 @@ FROM = debian:jessie MODE = minimal ARGS = --rm=false --no-cache=false PROXY = $(shell ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | cut -d' ' -f1) +JOBS = 2 include $(wildcard $(DOCKER_HOME)/build/make/*.mk) define add @@ -28,7 +29,7 @@ define runit endef define script - $(call execute,scripts/$(1).sh,$(TMP)/$(1).sh) + @python3 $(DOCKER_HOME)/build/parts.py $(1) $(FILE) $(TMP) endef all: build bin service clean @@ -40,19 +41,26 @@ build: prepare base ifneq ($(PROXY),) @$(eval ARGS += --build-arg HTTP_PROXY=http://$(PROXY):3142) endif - @docker build -t $(NAME):$(VERSION) $(ARGS) -f $(FILE) $(DOCKER_HOME)/build +ifneq ($(JOBS),) + @$(eval ARGS += --build-arg JOBS="-j $(JOBS)") +endif + docker build -t $(NAME):$(VERSION) $(ARGS) -f $(FILE) $(DOCKER_HOME)/build @rm ${FILE} prepare: @$(eval FILE = $(shell mktemp -p $(DOCKER_HOME)/build)) + @rm $(DOCKER_HOME)/build/tmp.* @echo FROM $(FROM) > ${FILE} + @echo 'ARG JOBS="-j $(JOBS)"' >> ${FILE} @echo ENV MODE $(MODE) >> ${FILE} $(call add,config,/build/config) $(call add,init,/opt/init) @echo 'RUN chmod +x /opt/init' >> ${FILE} + @mkdir -p $(DOCKER_HOME)/build/parts $(call script,prepare) clean: + @rm -rf $(DOCKER_HOME)/build/parts @rm -f ${FILE} @rm -rf build @rm -rf id_rsa diff --git a/build/parts.py b/build/parts.py new file mode 100644 index 0000000..7e95029 --- /dev/null +++ b/build/parts.py @@ -0,0 +1,38 @@ +import sys +import os +import re + +file = sys.argv[1] +docker = open(sys.argv[2], 'a') +tmp = sys.argv[3] + +# Remove all normal comments +path = '{}/build/scripts/{}.sh'.format(os.environ['DOCKER_HOME'], file) +contents = '' +for line in open(path): + line = line.strip() + if len(line) > 0 and not line.startswith('# '): + contents += line + '\n' + +# Split on comments starting with ## +parts = re.split('## .*', contents) +first = parts.pop(0).strip() + +# Iterate over parts, except header +i = 0 +for part in parts: + i += 1 + + # Add reading environment variables + extra = '' if file == 'prepare' else 'export_container_environment\n' + + # Write parts file + contents = '{}\n{}{}'.format(first, extra, part) + partfile = '{}_{}.sh'.format(file, i) + path = '{}/build/parts/{}'.format(os.environ['DOCKER_HOME'], partfile) + open(path, 'w').write(contents) + os.chmod(path, 0o100) + + # Append to Dockerfile + docker.write('ADD parts/{} {}/{}\n'.format(partfile, tmp, partfile)) + docker.write('RUN {}/{}\n'.format(tmp, partfile)) \ No newline at end of file