/ util / docker / Makefile
Makefile
  1  ##
  2  ## SPDX-License-Identifier: GPL-2.0-only
  3  
  4  export top=$(abspath $(CURDIR)/../..)
  5  export crossgcc_version=$(shell $(top)/util/crossgcc/buildgcc --version | grep 'cross toolchain' | sed 's/^.*\sv//' | sed 's/\s.*$$//')
  6  export DOCKER:=$(shell $(SHELL) -c "command -v docker")
  7  
  8  # Local port to forward to the jenkins image for the test server
  9  export COREBOOT_JENKINS_PORT?=49151
 10  
 11  # Local cache directory - for storing files shared with the docker image
 12  export COREBOOT_JENKINS_CACHE_DIR?=/srv/docker/coreboot-builder/cache
 13  
 14  # Name of the jenkins container
 15  export COREBOOT_JENKINS_CONTAINER?=coreboot_jenkins
 16  
 17  # Version of the jenkins / sdk container
 18  export COREBOOT_IMAGE_TAG?=$(crossgcc_version)
 19  
 20  # Commit id to build from
 21  export DOCKER_COMMIT?=$(shell git log -n 1 --pretty=%h)
 22  
 23  # .ccache dir to use
 24  export DOCKER_CCACHE?=$(HOME)/.ccache
 25  
 26  # SDK architecture
 27  export COREBOOT_CROSSGCC_PARAM?=all
 28  
 29  UID ?= $(shell id -u)
 30  GID ?= $(shell id -g)
 31  
 32  test-docker:
 33  	$(if $(DOCKER),,\
 34  		$(warning Error: Docker command not found.  Please install docker) \
 35  		$(warning Instructions: https://docs.docker.com/engine/install/ ) \
 36  		$(error halting))
 37  
 38  test-docker-login: test-docker
 39  	$(if $(shell if [ ! -f ~/.docker/config.json ]; then \
 40  		echo "docker authentication file not found"; fi), \
 41  		$(error Docker authentication file not found.  Run 'docker login'))
 42  
 43  coreboot-sdk: test-docker
 44  	@echo "Building coreboot SDK $(crossgcc_version) from commit $(DOCKER_COMMIT)"
 45  	$(DOCKER) build \
 46  		--tag coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG) \
 47  		--build-arg=SDK_VERSION="$(COREBOOT_IMAGE_TAG)" \
 48  		--build-arg=DOCKER_COMMIT="$(DOCKER_COMMIT)" \
 49  		--build-arg=CROSSGCC_PARAM="$(COREBOOT_CROSSGCC_PARAM)" \
 50  		coreboot-sdk
 51  
 52  coreboot-jenkins-test: test-docker
 53  	@echo "Testing coreboot SDK and jenkins node version $(crossgcc_version), built from commit $(DOCKER_COMMIT)"
 54  	$(DOCKER) build \
 55  		--tag coreboot/coreboot-jenkins-test:$(COREBOOT_IMAGE_TAG) \
 56  		--build-arg=SDK_VERSION="$(COREBOOT_IMAGE_TAG)" \
 57  		coreboot-jenkins-test
 58  
 59  upload-coreboot-sdk: test-docker-login
 60  	$(DOCKER) push coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG)
 61  
 62  coreboot-jenkins-node: test-docker
 63  	cat coreboot-jenkins-node/Dockerfile | \
 64  		sed "s/{{SDK_VERSION}}/$(COREBOOT_IMAGE_TAG)/g" | \
 65  		sed "s|{{SSH_KEY}}|$$(cat coreboot-jenkins-node/authorized_keys)|" | \
 66  		$(DOCKER) build -t coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG) -
 67  
 68  upload-coreboot-jenkins-node: test-docker-login
 69  	$(DOCKER) push coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG)
 70  
 71  doc.coreboot.org: test-docker
 72  	$(DOCKER) build --force-rm -t doc.coreboot.org \
 73  	$(top)/util/docker/doc.coreboot.org/
 74  
 75  docker-killall: test-docker
 76  	@if [ -n "$$($(DOCKER) ps | grep 'coreboot')" ]; then \
 77  		$(DOCKER) kill $$($(DOCKER) ps | grep 'coreboot' | cut -f1 -d ' '); \
 78  	fi
 79  
 80  clean-coreboot-containers: docker-killall
 81  	@if [ -n "$$($(DOCKER) ps -a | grep 'coreboot')" ]; then \
 82  		$(DOCKER) rm $$($(DOCKER) ps -a | grep 'coreboot' | sed 's|\s.*$$||'); \
 83  	fi
 84  
 85  clean-coreboot-images: docker-killall
 86  	@if [ -n "$$($(DOCKER) images | grep 'coreboot')" ]; then \
 87  		$(DOCKER) rmi $$($(DOCKER) images | grep coreboot | sed 's|^\S\+\s\+\S\+\s\+||' | sed 's|\s.*$$||'); \
 88  	fi
 89  
 90  docker-clean: clean-coreboot-containers
 91  	@$(MAKE) clean-coreboot-images
 92  
 93  docker-cleanall: test-docker
 94  ifeq ($(Y),1)
 95  	@if [ -n "$$($(DOCKER) ps -a | grep -v "CONTAINER")" ]; then \
 96  		$(DOCKER) kill $$($(DOCKER) ps | grep -v "CONTAINER" | sed 's|\s.*$$||') ; \
 97  		$(DOCKER) rm $$($(DOCKER) ps -a | grep -v "CONTAINER" | sed 's|\s.*$$||'); \
 98  	fi
 99  	@if [ -n "$$($(DOCKER) images | grep -v "REPOSITORY")" ]; then \
100  		$(DOCKER) rmi $$($(DOCKER) images | grep -v "REPOSITORY" | tr -s ' ' | cut -f3 -d ' '); \
101  	fi
102  else
103  	echo "This will remove *ALL* docker containers from your machine."
104  	echo "If this is what you want, run 'make docker-cleanall Y=1'"
105  endif
106  
107  $(DOCKER_CCACHE):
108  	@mkdir -p $@
109  
110  docker-run-local: test-docker $(DOCKER_CCACHE)
111  	$(DOCKER) run -it --rm \
112  		--volume $(DOCKER_CCACHE):/home/coreboot/.ccache \
113  		--volume $(top):/home/coreboot/coreboot \
114  		--env HOME=/home/coreboot \
115  		--user $(UID):$(GID) \
116  		coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG) \
117  		/bin/bash -c 'cd $${HOME}/coreboot && $(DOCKER_RUN_LOCAL)'
118  
119  docker-build-coreboot: docker-run-local
120  docker-build-coreboot: override DOCKER_RUN_LOCAL := \
121  	make clean && make $(BUILD_CMD)
122  
123  docker-abuild: docker-run-local
124  docker-abuild: override DOCKER_RUN_LOCAL := \
125  	make clean && util/abuild/abuild $(ABUILD_ARGS)
126  
127  docker-what-jenkins-does: docker-run-local
128  docker-what-jenkins-does: override DOCKER_RUN_LOCAL := \
129  	make clean && make what-jenkins-does CPUS=$(CPUS)
130  
131  test-docker-cache-dir:
132  	@if [ ! -d "$(COREBOOT_JENKINS_CACHE_DIR)" ]; then \
133  		printf "\nError: %s does not exist.\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
134  		printf "Please run:\nsudo mkdir -p %s\n\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
135  		printf "sudo chown -R $$(whoami):$$(whoami) %s\n\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
136  		false; \
137  	fi
138  	@if ! touch "$(COREBOOT_JENKINS_CACHE_DIR)/testfile" 2>/dev/null; then \
139  		printf "\nError: Cannot create file in %s." "$(COREBOOT_JENKINS_CACHE_DIR)"; \
140  		printf "Please run:\nsudo chown -R $$(whoami):$$(whoami) %s\n\n" "$(COREBOOT_JENKINS_CACHE_DIR)"; \
141  		false; \
142  	else \
143  		 rm -f "$(COREBOOT_JENKINS_CACHE_DIR)/testfile"; \
144  	fi
145  
146  docker-jenkins-server: test-docker-cache-dir test-docker
147  	$(DOCKER) run -d --privileged --restart=always \
148  		-p $(COREBOOT_JENKINS_PORT):49151 \
149  		-v $(COREBOOT_JENKINS_CACHE_DIR):/data/cache \
150  		--name=$(COREBOOT_JENKINS_CONTAINER) \
151  		coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG)
152  
153  docker-jenkins-shell: test-docker-cache-dir test-docker
154  	$(DOCKER) run -u root -it --privileged \
155  		--entrypoint="/bin/bash" \
156  		-p $(COREBOOT_JENKINS_PORT):49151 \
157  		-v $(top):/home/coreboot/coreboot \
158  		-v $(COREBOOT_JENKINS_CACHE_DIR):/data/cache \
159  		--name=$(COREBOOT_JENKINS_CONTAINER) \
160  		--rm coreboot/coreboot-jenkins-node:$(COREBOOT_IMAGE_TAG)
161  
162  docker-shell: USER=coreboot
163  docker-shell: test-docker
164  	$(DOCKER) run -u $(USER) -it \
165  		-e COLUMNS=$(shell tput cols) -e LINES=$(shell tput lines) -e TERM=$(TERM) \
166  		-w /home/coreboot/coreboot \
167  		-v $(top):/home/coreboot/coreboot \
168  		--rm coreboot/coreboot-sdk:$(COREBOOT_IMAGE_TAG) \
169  		/bin/bash -l
170  
171  docker-jenkins-attach: USER=root
172  docker-jenkins-attach: test-docker
173  	$(DOCKER)  exec --user $(USER) \
174  		-e COLUMNS=$(shell tput cols) -e LINES=$(shell tput lines) -e TERM=$(TERM) \
175  		-it "$$(docker ps | grep coreboot-jenkins-node | cut -f1 -d' ')" \
176  		/bin/bash -l
177  
178  docker-build-docs: test-docker
179  docker-build-docs:
180  	mkdir -p $(top)/Documentation/_build
181  	$(DOCKER) run -it --rm \
182  		--user $(UID):$(GID) \
183  		-v "$(top)/:/data-in/:ro" \
184  		-v "$(top)/Documentation/_build/:/data-out/" \
185  		doc.coreboot.org
186  
187  docker-livehtml-docs: test-docker
188  docker-livehtml-docs:
189  	$(DOCKER) run -it --rm \
190  		--net=host -v "$(top)/:/data-in/:ro" \
191  		doc.coreboot.org livehtml
192  
193  help:
194  	@echo "Commands for working with docker images:"
195  	@echo "  coreboot-sdk                 - Build coreboot-sdk container"
196  	@echo "  coreboot-jenkins-test        - Test the coreboot-jenkins-node build functionality"
197  	@echo "  upload-coreboot-sdk          - Upload coreboot-sdk to hub.docker.com"
198  	@echo "  coreboot-jenkins-node        - Build coreboot-jenkins-node container"
199  	@echo "  upload-coreboot-jenkins-node - Upload coreboot-jenkins-node to hub.docker.com"
200  	@echo "  doc.coreboot.org             - Build doc.coreboot.org container"
201  	@echo "  clean-coreboot-containers    - Remove all docker coreboot containers"
202  	@echo "  clean-coreboot-images        - Remove all docker coreboot images"
203  	@echo "  docker-clean                 - Remove docker coreboot containers & images"
204  	@echo
205  	@echo "Commands for using docker images"
206  	@echo "  docker-build-coreboot        - Build coreboot under coreboot-sdk"
207  	@echo "      <BUILD_CMD=target> "
208  	@echo "  docker-abuild                - Run abuild under coreboot-sdk"
209  	@echo "      <ABUILD_ARGS='-a -B'>"
210  	@echo "  docker-what-jenkins-does     - Run 'what-jenkins-does' target"
211  	@echo "  docker-jenkins-shell         - Bash prompt in coreboot-jenkins-node"
212  	@echo "      <USER=root or USER=coreboot>"
213  	@echo "  docker-shell                 - Bash prompt in coreboot-sdk"
214  	@echo "      <USER=root or USER=coreboot>"
215  	@echo "  docker-jenkins-server        - Run coreboot-jenkins-node image (for server)"
216  	@echo "  docker-jenkins-attach        - Open shell in running jenkins server"
217  	@echo "  docker-build-docs            - Build the documentation"
218  	@echo "  docker-livehtml-docs         - Run sphinx-autobuild"
219  	@echo
220  	@echo "Variables:"
221  	@echo "  COREBOOT_JENKINS_PORT=$(COREBOOT_JENKINS_PORT)"
222  	@echo "  COREBOOT_JENKINS_CACHE_DIR=$(COREBOOT_JENKINS_CACHE_DIR)"
223  	@echo "  COREBOOT_JENKINS_CONTAINER=$(COREBOOT_JENKINS_CONTAINER)"
224  	@echo "  COREBOOT_IMAGE_TAG=$(COREBOOT_IMAGE_TAG)"
225  	@echo "  DOCKER_COMMIT=$(DOCKER_COMMIT)"
226  
227  .PHONY: test-docker test-docker-login test-docker-cache-dir
228  .PHONY: coreboot-jenkins-node upload-coreboot-jenkins-node coreboot-jenkins-test
229  .PHONY: coreboot-sdk upload-coreboot-sdk
230  .PHONY: doc.coreboot.org
231  .PHONY: clean-coreboot-containers clean-coreboot-images docker-cleanall
232  .PHONY: docker-abuild
233  .PHONY: docker-shell docker-jenkins-shell
234  .PHONY: docker-what-jenkins-does docker-jenkins-server docker-jenkins-attach
235  .PHONY: docker-build-docs docker-livehtml-docs
236  .PHONY: help