github.com/pachyderm/pachyderm@v1.13.4/examples/run/Makefile (about) 1 #!make 2 # Various config files 3 CONFIG_FILE=pipeline.conf 4 SECRETS_YAML=secrets.yaml 5 ENCODED_ENV=.env.encoded 6 DOCKER_TEST_ENV=docker.test.env 7 8 # Various folders 9 CONFIG=config 10 SRC=src 11 TARGET=target 12 TEST=test 13 14 # Import variables from config file and make them available 15 include $(CONFIG)/$(CONFIG_FILE) 16 export 17 18 PWD=$(shell pwd) 19 20 .PHONY: pipe.config pipe.clean pipe.create pipe.delete 21 .PHONY: docker.secrets docker.secrets.clean 22 .PHONY: docker.secrets.registry docker.secrets.registry.clean 23 .PHONY: docker.secrets.container docker.secrets.container.clean 24 .PHONY: docker.push docker.build docker.clean docker.test 25 26 # Prepares everything for install 27 all: pipe.config docker.build 28 29 install: docker.push pipe.create 30 31 test: docker.test 32 33 clean: pipe.clean docker.clean 34 rm -rf $(TARGET) 35 36 # Creates the pipeline configuration file 37 PIPE_CONFIG=$(TARGET)/$(PIPELINE_BUILD_CONFIG_TARGET_FILE) 38 $(PIPE_CONFIG): 39 mkdir -p $(TARGET); \ 40 envsubst '$${PIPELINE_NAME} $${PIPELINE_DOCKER_IMAGE} \ 41 $${PIPELINE_DOCKER_HOME} $${PIPELINE_DOCKER_SCRIPT} \ 42 $${PIPELINE_DOCKER_SECRETS} $${PIPELINE_DOCKER_SECRETS_PATH} \ 43 $${PIPELINE_DOCKER_REGISTRY_SECRETS} $${PIPELINE_REPO}' \ 44 < $(CONFIG)/$(PIPELINE_BUILD_CONFIG_TEMPLATE_FILE) \ 45 > $(PIPE_CONFIG) 46 # Just makes it easier to type and test 47 pipe.config: $(PIPE_CONFIG) 48 pipe.clean: 49 rm -f $(PIPE_CONFIG); 50 51 # Creates the pipeline in pachyderm 52 pipe.create: 53 pachctl create pipeline -f $(PIPE_CONFIG) 54 55 # Deletes the pipeline from pacyderm 56 pipe.delete: 57 pachctl delete pipeline ${PIPELINE_NAME} 58 59 docker.secrets: docker.secrets.registry docker.secrets.container 60 # Create the secrets to access the docker registry 61 docker.secrets.registry: 62 if kubectl get secret $(PIPELINE_DOCKER_REGISTRY_SECRET); then \ 63 echo "$$PIPELINE_DOCKER_REGISTRY_SECRET already exists, skipping"; \ 64 else \ 65 kubectl create secret docker-registry $(PIPELINE_DOCKER_REGISTRY_SECRET) \ 66 --docker-server=$(PIPELINE_DOCKER_REGISTRY) \ 67 --docker-username=$(PIPELINE_DOCKER_REGISTRY_USERNAME) \ 68 --docker-password=$(PIPELINE_DOCKER_REGISTRY_PASSWORD) \ 69 --docker-email=$(PIPELINE_DOCKER_REGISTRY_EMAIL); \ 70 fi 71 # Cleanup 72 docker.secrets.registry.clean: 73 if kubectl get secret $(PIPELINE_DOCKER_REGISTRY_SECRETS); then \ 74 kubectl delete secret $(PIPELINE_DOCKER_REGISTRY_SECRETS); \ 75 fi 76 77 # Export env, rename variables to *_ENCODED, envsubst the secrets file 78 # All this effort because they kubectl requires them to be base64 encoded ... 79 docker.secrets.container: $(TARGET)/$(ENCODED_ENV) $(TARGET)/$(SECRETS_YAML) 80 # Export env and rename everything to *_ENCODED 81 $(TARGET)/$(ENCODED_ENV): 82 mkdir -p $(TARGET); \ 83 env | awk '{split($$0,a,"="); foo="echo \""a[2]"\\c\" | base64"; foo | getline b; \ 84 close(foo); printf("export %s_ENCODED=%s\n", a[1], b);}' > $(TARGET)/$(ENCODED_ENV); \ 85 86 $(TARGET)/$(SECRETS_YAML): 87 . $(TARGET)/$(ENCODED_ENV); \ 88 envsubst < $(CONFIG)/$(SECRETS_YAML) > $(TARGET)/$(SECRETS_YAML); \ 89 if kubectl get secret $(PIPELINE_DOCKER_SECRETS); then \ 90 echo "$$PIPELINE_DOCKER_SECRETS already exists, skipping"; \ 91 else \ 92 kubectl create -f $(TARGET)/$(SECRETS_YAML); \ 93 fi 94 95 docker.secrets.container.clean: 96 rm -f $(TARGET)/$(SECRETS_YAML); \ 97 rm -f $(TARGET)/$(ENCODED_ENV); \ 98 if kubectl get secret $(PIPELINE_DOCKER_SECRETS); then \ 99 kubectl delete secret $(PIPELINE_DOCKER_SECRETS); \ 100 fi 101 102 docker.secrets.clean: docker.secrets.container.clean docker.secrets.registry.clean 103 104 # Build the docker image, some env variables must be passed along 105 docker.build: 106 docker build -t $(PIPELINE_DOCKER_IMAGE) \ 107 --label "$(PIPELINE_DOCKER_IMAGE)" \ 108 --build-arg SRC=$(SRC) \ 109 --build-arg PIPELINE_HOME=$(PIPELINE_DOCKER_HOME) \ 110 --build-arg PIPELINE_INPUT=$(PIPELINE_INPUT) \ 111 --build-arg PIPELINE_OUTPUT=$(PIPELINE_OUTPUT) $(PWD) 112 113 docker.push: docker.secrets 114 docker push $(PIPELINE_DOCKER_IMAGE) 115 116 # Remove docker image(s) 117 docker.image.clean: 118 -docker rmi -f $(shell docker images --filter \ 119 "label=$(PIPELINE_DOCKER_IMAGE)" -q); \ 120 121 # Remove docker contaner(s) 122 docker.container.clean: 123 -docker rm -f $(shell docker ps -a --filter \ 124 "label=$(PIPELINE_DOCKER_IMAGE):test" -q); \ 125 126 # Remove all trace of docker 127 docker.clean: docker.secrets.clean docker.container.clean docker.image.clean docker.test.clean 128 129 # Performs a test by running the docker container locally and mounting local folders 130 # Again, make sure all environmental variables are present, e.g. passwords etc. 131 docker.test.env: 132 envsubst < $(CONFIG)/$(DOCKER_TEST_ENV) > $(TEST)/$(DOCKER_TEST_ENV); 133 docker.test.env.clean: 134 rm -f $(TEST)/$(DOCKER_TEST_ENV); 135 136 docker.test: docker.build docker.test.env 137 docker run \ 138 --label "$(PIPELINE_DOCKER_IMAGE):test" \ 139 -e PIPELINE_INPUT=$(PIPELINE_INPUT) \ 140 -e PIPELINE_OUTPUT=$(PIPELINE_OUTPUT) \ 141 -e PIPELINE_HOME=$(PIPELINE_DOCKER_HOME) \ 142 --env-file $(TEST)/$(DOCKER_TEST_ENV) \ 143 --mount src="$(PWD)"/$(PIPELINE_TEST_INPUT),dst=$(PIPELINE_INPUT),type=bind \ 144 --mount src="$(PWD)"/$(PIPELINE_TEST_OUTPUT),dst=$(PIPELINE_OUTPUT),type=bind \ 145 $(PIPELINE_DOCKER_IMAGE) \ 146 /bin/bash -c "$(PIPELINE_DOCKER_HOME)/$(PIPELINE_DOCKER_SCRIPT)" 147 148 docker.test.clean: docker.container.clean docker.test.env.clean 149 150 # Display some information about the pipeline 151 verify: 152 pachctl inspect pipeline $(PIPELINE_NAME); \ 153 pachctl list file $(PIPELINE_NAME)@master 154