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