make nginx-provisioning work and rename make targets to prefix jenkins-... (#183)
Co-authored-by: Michael Hoennig <michael@hoennig.de> Reviewed-on: https://dev.hostsharing.net/hostsharing/hs.hsadmin.ng/pulls/183 Reviewed-by: Timotheus Pokorra <timotheus.pokorra@hostsharing.net>
This commit is contained in:
		
							
								
								
									
										102
									
								
								Jenkins/Makefile
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								Jenkins/Makefile
									
									
									
									
									
								
							| @@ -1,17 +1,15 @@ | ||||
| include .env | ||||
| export | ||||
|  | ||||
| SOCKET := /var/run/docker.sock | ||||
| VOLUME := jenkins_home | ||||
|  | ||||
| CERTBOT_CONF := $(PWD)/.generated/certbot/lib/conf | ||||
| CERTBOT_WWW := $(PWD)/.generated/certbot/lib/www | ||||
| CERTBOT_LOG := $(PWD)/.generated/certbot/log | ||||
| NGINX_LOG := $(PWD)/.generated/certbot/nginx/log | ||||
|  | ||||
| .PHONY: provision \ | ||||
| 	build run bash init-pw unprotected protected start stop rm purge \ | ||||
| 	nginx-prepare nginx-proxy nginx-start nginx-letsencrypt-init nginx-letsencrypt-timer nginx-restart nginx-stop | ||||
| .PHONY: provision clean \ | ||||
| 	jenkins-build jenkins-run jenkins-bash jenkins-init-pw jenkins-unprotected jenkins-protected jenkins-start jenkins-stop jenkins-rm jenkins-purge \ | ||||
| 	nginx-prepare nginx-proxy nginx-run nginx-start nginx-letsencrypt-init nginx-letsencrypt-timer nginx-restart nginx-stop \ | ||||
| 	jenkins-security | ||||
|  | ||||
| ## lists all documented targets | ||||
| help: | ||||
| @@ -20,38 +18,51 @@ help: | ||||
| 		print "    " desc "\n" \ | ||||
| 	}' $(MAKEFILE_LIST) | ||||
|  | ||||
| ## uploads to hs.hsadmin.ng/Jenkins/ on the server for testing purposes | ||||
| upload: | ||||
| 	scp -r * .env .gitignore tallyman@$(SERVER_NAME):hs.hsadmin.ng/Jenkins/ | ||||
|  | ||||
|  | ||||
| ## initially, run this once to provision te nginx | ||||
| provision: nginx-prepare nginx-letsencrypt-init nginx-letsencrypt-timer nginx-start build start | ||||
| provision: nginx-prepare nginx-letsencrypt-init nginx-letsencrypt-timer jenkins-build jenkins-run nginx-restart | ||||
| 	@echo "now you can start nginx: make nginx-start" | ||||
|  | ||||
| ## removes all generated files | ||||
| clean: nginx-stop stop | ||||
| clean: nginx-stop jenkins-rm | ||||
| 	rm -rf .generated/ | ||||
|  | ||||
| ## builds the Jenkins image | ||||
| build: | ||||
| jenkins-build: | ||||
| 	docker build -t jenkins-docker . | ||||
|  | ||||
| ## manually running the Jenkins container | ||||
| run: | ||||
| # initially runs the Jenkins container during provisioning, later use `make jenkins-start` | ||||
| jenkins-run: | ||||
| 	$(eval DOCKER_SOCKET_MOUNT := $(if $(DOCKER_SOCKET),$(DOCKER_SOCKET):/var/run/docker.sock,/dev/null:/var/run/docker.no-socket)) | ||||
| 	docker run --detach \ | ||||
| 		--dns 8.8.8.8 \ | ||||
| 		--network bridge \ | ||||
| 		--publish 8090:8080 --publish 50000:50000 \ | ||||
| 		--volume $(SOCKET):/var/run/docker.sock \ | ||||
| 		--volume $(VOLUME):/var/jenkins_home \ | ||||
| 		--volume $(DOCKER_SOCKET_MOUNT) \ | ||||
| 		--volume $(JENKINS_VOLUME):/var/jenkins_home \ | ||||
| 		--volume $(PWD)/jenkins.yaml:/var/jenkins_home/jenkins.yaml \ | ||||
| 		--restart unless-stopped \ | ||||
| 		--env-file .env \ | ||||
| 		--name jenkins jenkins-docker | ||||
|  | ||||
| ## manually starts the Jenkins container (again) | ||||
| start: | ||||
| jenkins-start: | ||||
| 	docker start jenkins | ||||
|  | ||||
| ## opens a bash within the Jenkins container | ||||
| bash: | ||||
| jenkins-bash: | ||||
| 	docker exec -it jenkins bash | ||||
|  | ||||
| ## prints the Jenkins log | ||||
| jenkins-log: | ||||
| 	docker logs jenkins 2>&1 | ||||
|  | ||||
| ## prints the initial password of a newly setup Jenkins | ||||
| init-pw: | ||||
| jenkins-init-pw: | ||||
| 	docker exec -it jenkins sh -c '\ | ||||
|     		while [ ! -f /var/jenkins_home/secrets/initialAdminPassword ]; do \ | ||||
|     			sleep 1; \ | ||||
| @@ -60,50 +71,44 @@ init-pw: | ||||
|     	' | ||||
|  | ||||
| ## disables security for the Jenkins => allows login to Jenkins without credentials | ||||
| unprotected: | ||||
| jenkins-unprotected: | ||||
| 	docker exec -it jenkins sed -i 's|<useSecurity>true</useSecurity>|<useSecurity>false</useSecurity>|' /var/jenkins_home/config.xml | ||||
| 	docker exec -it jenkins grep useSecurity /var/jenkins_home/config.xml | ||||
|  | ||||
| ## enables security for the Jenkins => Jenkins requires login with credentials | ||||
| protected: | ||||
| jenkins-protected: | ||||
| 	docker exec -it jenkins sed -i 's|<useSecurity>true</useSecurity>|<useSecurity>true</useSecurity>|' /var/jenkins_home/config.xml | ||||
| 	docker exec -it jenkins grep useSecurity /var/jenkins_home/config.xml | ||||
|  | ||||
| ## stops the Jenkins container | ||||
| stop: | ||||
| 	docker stop jenkins | ||||
| jenkins-stop: | ||||
| 	docker stop jenkins || true | ||||
|  | ||||
| ## removes the Jenkins container | ||||
| rm: stop | ||||
| 	docker rm jenkins | ||||
| jenkins-rm: jenkins-stop | ||||
| 	docker rm jenkins || true | ||||
|  | ||||
| ## purges the Jenkins volume (finally deletes the configuration) | ||||
| purge: rm | ||||
| 	docker volume rm $(VOLUME) | ||||
| jenkins-purge: jenkins-rm | ||||
| 	docker volume rm $(JENKINS_VOLUME) || true | ||||
|  | ||||
| # (internal) generates the files for nginx-proxy and certbot | ||||
| nginx-prepare: | ||||
| 	mkdir -p $(CERTBOT_WWW) $(CERTBOT_LOG) $(CERTBOT_CONF)/live/$(SERVER_NAME) $(NGINX_LOG) | ||||
| 	chmod 755 $(CERTBOT_WWW) $(CERTBOT_LOG) $(CERTBOT_CONF)/live/$(SERVER_NAME) $(NGINX_LOG) | ||||
| 	sed -e 's/%SERVER_NAME/$(SERVER_NAME)/g' <nginx-proxy/nginx.conf >.generated/nginx.conf | ||||
| 	sed -e 's/%SERVER_NAME/$(SERVER_NAME)/g' <nginx-proxy/nginx-init.conf >.generated/nginx.conf | ||||
| 	cp nginx-proxy/options-ssl-nginx.conf $(CERTBOT_CONF)/options-ssl-nginx.conf | ||||
| 	chmod 644 $(CERTBOT_CONF)/options-ssl-nginx.conf | ||||
| 	test -f $(CERTBOT_CONF)/ssl-dhparams.pem || curl -o $(CERTBOT_CONF)/ssl-dhparams.pem \ | ||||
| 		https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem | ||||
| 	chmod 644 $(CERTBOT_CONF)/ssl-dhparams.pem | ||||
| 	openssl req -x509 -nodes -newkey rsa:2048 \ | ||||
| 	  -keyout $(CERTBOT_CONF)/live/$(SERVER_NAME)/privkey.pem \ | ||||
| 	  -out /$(CERTBOT_CONF)/live/$(SERVER_NAME)/fullchain.pem \ | ||||
| 	  -subj "/CN=dummy" | ||||
|  | ||||
| ## opens a bash within the Nginx-proxy container | ||||
| nginx-bash: | ||||
| 	docker exec -it nginx bash | ||||
|  | ||||
| # (internal) fetches an initial certificate from letsencrypt | ||||
| nginx-letsencrypt-init: nginx-start | ||||
| 	# wait for nginx actually running (could be improved) | ||||
| 	@sleep 5 | ||||
| nginx-letsencrypt-init: nginx-run | ||||
| 	# delete the previous (dummy) config to avoid file creation with suffix -0001 etc. | ||||
| 	rm -rf $(CERTBOT_CONF)/etc/letsencrypt/live/$(SERVER_NAME) \ | ||||
|        $(CERTBOT_CONF)/etc/letsencrypt/archive/$(SERVER_NAME) \ | ||||
| @@ -114,13 +119,12 @@ nginx-letsencrypt-init: nginx-start | ||||
| 	  -v $(CERTBOT_WWW):/var/www/certbot \ | ||||
| 	  -v $(CERTBOT_LOG):/var/log/letsencrypt \ | ||||
| 	  certbot/certbot \ | ||||
| 	  certonly --webroot --webroot-path /var/www/certbot \ | ||||
| 	  --email $(EMAIL) --cert-name $(SERVER_NAME) \ | ||||
| 	  certonly --webroot --webroot-path /var/www/certbot --cert-name $(SERVER_NAME) \ | ||||
| 	  -d $(SERVER_NAME) --rsa-key-size 4096 \ | ||||
| 	  --agree-tos --force-renewal | ||||
| 	# restart nginx | ||||
| 	  --non-interactive --agree-tos --force-renewal $(CERTBOT_ENV) | ||||
| 	# from now on, start nginx including https | ||||
| 	sed -e 's/%SERVER_NAME/$(SERVER_NAME)/g' <nginx-proxy/nginx.conf >.generated/nginx.conf | ||||
| 	docker stop nginx || true | ||||
| 	docker start nginx | ||||
|  | ||||
| ## opens a shell in the letsencrypt certbot | ||||
| nginx-letsencrypt-sh: | ||||
| @@ -147,8 +151,8 @@ nginx-letsencrypt-renew: | ||||
| 	  -v $(CERTBOT_LOG):/var/log/letsencrypt \ | ||||
| 	  certbot/certbot renew -q | ||||
|  | ||||
| ## starts the nginx proxy server | ||||
| nginx-start: nginx-stop | ||||
| ## initially runs the nginx proxy server | ||||
| nginx-run: nginx-stop | ||||
| 	docker run -d --name nginx \ | ||||
| 	  --publish 8080:80 \ | ||||
| 	  --publish 8443:443 \ | ||||
| @@ -157,8 +161,16 @@ nginx-start: nginx-stop | ||||
| 	  -v $(CERTBOT_WWW):/var/www/certbot \ | ||||
| 	  -v $(NGINX_LOG):/var/log/nginx \ | ||||
| 	  -v $(PWD)/.generated/nginx.conf:/etc/nginx/nginx.conf \ | ||||
| 	  --health-cmd="curl -kfs https://localhost:8443/ || exit 1" \ | ||||
| 	  --health-interval=5s \ | ||||
| 	  --health-timeout=3s \ | ||||
| 	  --health-retries=3 \ | ||||
| 	  nginx | ||||
|  | ||||
| ## starts the nginx proxy server again | ||||
| nginx-start: | ||||
| 	docker start nginx | ||||
|  | ||||
| ## restarts the nginx proxy server | ||||
| nginx-restart: nginx-stop nginx-start | ||||
|  | ||||
| @@ -167,3 +179,15 @@ nginx-stop: | ||||
| 	docker stop nginx || true | ||||
| 	docker rm nginx || true | ||||
|  | ||||
| ## remove the nginx container | ||||
| nginx-rm: nginx-stop | ||||
| 	docker rm nginx || true | ||||
|  | ||||
| ## check security status | ||||
| jenkins-security: | ||||
| 	@curl --insecure -s -o /dev/null -w "%{http_code}\n" https://localhost:8443/script | ||||
|  | ||||
| ## fix access rights in workspaces | ||||
| jenkins-fix: | ||||
| 	@docker run --rm -it -v $(JENKINS_VOLUME):/mnt alpine chown 1000:1000 -R /mnt/workspace | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user