|
.phony: all |
|
|
|
all: push |
|
|
|
# configuration setup |
|
PROJECT_FILE_NAME=project.yml |
|
CONFIG := python3 -c "import yaml; import json; from pathlib import Path; print(json.dumps(yaml.safe_load(Path(\"$(PROJECT_FILE_NAME)\").read_text())))" |
|
OS := $(shell python3 -c "import platform; print(platform.system())") |
|
|
|
# defaults |
|
IMG_NAME := `$(CONFIG) | jq '.project.name' --raw-output` |
|
REGION := `$(CONFIG) | jq '.default.aws.region' --raw-output` |
|
OUTPUT_TYPE := `$(CONFIG) | jq '.default.aws.json' --raw-output` |
|
REV=$(shell git rev-parse HEAD | cut -c1-7) |
|
|
|
# debugging |
|
print-config: |
|
@echo $(IMG_NAME) |
|
$(CONFIG) | jq '.' |
|
|
|
# setup environments |
|
testing-env: |
|
@echo Using Testing Configuration 🔊 |
|
@$(eval env_name="testing") |
|
$(eval AWS_PROFILE=`$(CONFIG) | jq '.environment.$(env_name).aws.profile_name' --raw-output`) |
|
$(eval AWS_ACCOUNT_ID=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_account_id' --raw-output`) |
|
$(eval START_URL=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_start_url' --raw-output`) |
|
$(eval SESSION_NAME=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_session_name' --raw-output`) |
|
$(eval ROLE_NAME=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_role_name' --raw-output`) |
|
$(eval TAG=`$(CONFIG) | jq '.environment.$(env_name).aws.container_tag' --raw-output`) |
|
$(eval BUCKET_NAME=`$(CONFIG) | jq '.environment.$(env_name).aws.bucket_name' --raw-output`) |
|
$(eval REGISTRY_URL=$(AWS_ACCOUNT_ID).dkr.ecr.$(REGION).amazonaws.com) |
|
$(eval REPO=$(REGISTRY_URL)/$(IMG_NAME)) |
|
|
|
production-env: |
|
@echo Using Production Configuration 🔊 |
|
@$(eval env_name="production") |
|
$(eval AWS_PROFILE=`$(CONFIG) | jq '.environment.$(env_name).aws.profile_name' --raw-output`) |
|
$(eval AWS_ACCOUNT_ID=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_account_id' --raw-output`) |
|
$(eval START_URL=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_start_url' --raw-output`) |
|
$(eval SESSION_NAME=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_session_name' --raw-output`) |
|
$(eval ROLE_NAME=`$(CONFIG) | jq '.environment.$(env_name).aws.sso_role_name' --raw-output`) |
|
$(eval TAG=`$(CONFIG) | jq '.environment.$(env_name).aws.container_tag' --raw-output`) |
|
$(eval BUCKET_NAME=`$(CONFIG) | jq '.environment.$(env_name).aws.bucket_name' --raw-output`) |
|
$(eval REGISTRY_URL=$(AWS_ACCOUNT_ID).dkr.ecr.$(REGION).amazonaws.com) |
|
$(eval REPO=$(REGISTRY_URL)/$(IMG_NAME)) |
|
|
|
os: |
|
@echo Using $(OS) operating system |
|
@echo |
|
|
|
development: os |
|
$(eval RAW_SRC=`$(CONFIG) | jq '.environment.development.$(OS).raw_src' --raw-output`) |
|
$(eval PROCESSED_SRC=`$(CONFIG) | jq ".environment.development.$(OS).processed_src" --raw-output`) |
|
@echo Developing with Directories... |
|
@echo RAW_SRC=$(RAW_SRC) | xargs -I{} echo " - {}" |
|
@echo PROCESSED_SRC=$(PROCESSED_SRC) | xargs -I{} echo " - {}" |
|
@echo |
|
@mkdir -p $(PROCESSED_SRC) |
|
|
|
container: |
|
$(eval CPUS=`$(CONFIG) | jq '.default.aws.batch.cpus' --raw-output`) |
|
$(eval MEMORY=`$(CONFIG) | jq '.default.aws.batch.memory' --raw-output`) |
|
$(eval RAW_TARGET=`$(CONFIG) | jq '.default.aws.batch.raw_target' --raw-output`) |
|
$(eval PROCESSED_TARGET=`$(CONFIG) | jq '.default.aws.batch.processed_target' --raw-output`) |
|
$(eval HOSTNAME=`$(CONFIG) | jq '.default.aws.batch.hostname' --raw-output`) |
|
|
|
@echo Container Settings |
|
@echo CPUS=$(CPUS) | xargs -I{} echo " - {}" |
|
@echo MEMORY=$(MEMORY) | xargs -I{} echo " - {}" |
|
@echo RAW_TARGET=$(RAW_TARGET) | xargs -I{} echo " - {}" |
|
@echo PROCESSED_TARGET=$(PROCESSED_TARGET) | xargs -I{} echo " - {}" |
|
@echo HOSTNAME=$(HOSTNAME) | xargs -I{} echo " - {}" |
|
@echo |
|
|
|
print-test-env: testing-env |
|
@echo SESSION_NAME=$(SESSION_NAME) | xargs -I{} echo " - {}" |
|
@echo AWS_PROFILE=$(AWS_PROFILE) | xargs -I{} echo " - {}" |
|
@echo REGISTRY_URL=$(REGISTRY_URL) | xargs -I{} echo " - {}" |
|
@echo REPO=$(REPO) | xargs -I{} echo " - {}" |
|
@echo REV=$(REV) | xargs -I{} echo " - {}" |
|
|
|
print-prod-env: production-env |
|
@echo AWS_PROFILE=$(AWS_PROFILE) | xargs -I{} echo " - {}" |
|
@echo REGISTRY_URL=$(REGISTRY_URL) | xargs -I{} echo " - {}" |
|
@echo REPO=$(REPO) | xargs -I{} echo " - {}" |
|
@echo REV=$(REV) | xargs -I{} echo " - {}" |
|
|
|
# sso management |
|
configure: |
|
aws configure sso |
|
|
|
setup-accounts: |
|
bash scripts/setup-aws-config.sh testing |
|
bash scripts/setup-aws-config.sh production |
|
|
|
login-prod: production-env |
|
aws sso login --profile $(AWS_PROFILE) |
|
|
|
login-test: testing-env |
|
aws sso login --profile $(AWS_PROFILE) |
|
|
|
# container management |
|
ecr-login: |
|
@# either call one of the login targets or have an environment co-depended on |
|
@aws ecr get-login-password --profile $(AWS_PROFILE) \ |
|
| docker login --password-stdin --username AWS $(REGISTRY_URL) \ |
|
|| echo "\033[0;31mFailed to log into ecr! Be sure you're logged into an sso profile." |
|
|
|
build-prod: production-env |
|
@env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build \ |
|
--build-arg CURRENT_SHA=$(REV) \ |
|
--build-arg BUCKET_NAME=$(BUCKET_NAME) \ |
|
-t $(IMG_NAME):$(TAG) . |
|
@echo Built $(TAG) ⚒️ |
|
|
|
build-test: testing-env |
|
@env DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build \ |
|
--build-arg CURRENT_SHA=$(REV) \ |
|
--build-arg BUCKET_NAME=$(BUCKET_NAME) \ |
|
-t $(IMG_NAME):$(TAG) . |
|
@echo Built $(TAG) ⚒️ |
|
|
|
build: build-test build-prod |
|
@echo Done Building ⚒️ |
|
|
|
# Push docker image |
|
confirm: |
|
@read -p "Do you really want to push to $(env_name)? (y/n) " answer && [ "$$answer" = "y" ] || (echo "Aborted." && exit 1) |
|
|
|
push: login-prod production-env ecr-login build confirm |
|
@docker tag $(IMG_NAME):$(TAG) $(REPO):$(TAG) |
|
@docker tag $(IMG_NAME):$(TAG) $(REPO):$(REV) |
|
@docker push $(REPO):$(TAG) |
|
@docker push $(REPO):$(REV) |
|
|
|
push-test: testing-env ecr-login build confirm |
|
@docker tag $(IMG_NAME):$(TAG) $(REPO):$(TAG) |
|
@docker tag $(IMG_NAME):$(TAG) $(REPO):$(REV) |
|
@docker push $(REPO):$(TAG) |
|
@docker push $(REPO):$(REV) |
|
|
|
# Development / Debugging Container |
|
enter-dev: os development container |
|
@# without gpu's activated |
|
@docker run \ |
|
--cpus=$(CPUS) \ |
|
--memory=$(MEMORY) \ |
|
--mount src=$(RAW_SRC),target=$(RAW_TARGET),type=bind,readonly \ |
|
--mount src=$(PROCESSED_SRC),target=$(PROCESSED_TARGET),type=bind \ |
|
--hostname $(HOSTNAME) \ |
|
--entrypoint /bin/bash \ |
|
-it $(IMG_NAME) || echo "\033[0;31mFailed to enter. Check that your mounts exist." |
|
|
|
enter: os development container |
|
@# with gpu's activated |
|
@docker run \ |
|
--gpus all \ |
|
--cpus=$(CPUS) \ |
|
--memory=$(MEMORY) \ |
|
--mount src=$(RAW_SRC),target=$(RAW_TARGET),type=bind,readonly \ |
|
--mount src=$(PROCESSED_SRC),target=$(PROCESSED_TARGET),type=bind \ |
|
--hostname $(HOSTNAME) \ |
|
--entrypoint /bin/bash \ |
|
-it $(IMG_NAME) || echo "\033[0;31mFailed to enter. Check that your mounts exist." |
|
|
|
run-dev: development container |
|
@# Syntax: |
|
@# make input_dir=<YOUR_INPUT_DIR> output_dir=<YOUR_OUTPUT_DIR> run-dev |
|
|
|
@echo Arguments: |
|
@echo input_dir = "$(input_dir)" | xargs -I{} echo " - {}" |
|
@echo output_dir = "$(output_dir)" | xargs -I{} echo " - {}" |
|
@echo |
|
|
|
@# without gpu's activated |
|
@docker run \ |
|
--cpus=$(CPUS) \ |
|
--memory=$(MEMORY) \ |
|
--mount src=$(RAW_SRC),target=$(RAW_TARGET),type=bind,readonly \ |
|
--mount src=$(PROCESSED_SRC),target=$(PROCESSED_TARGET),type=bind \ |
|
--hostname $(HOSTNAME) \ |
|
-it $(IMG_NAME) \ |
|
$(input_dir) \ |
|
$(output_dir) \ |
|
|| echo "\033[0;31mFailed to enter. Check that your mounts exist." |
|
|
|
run: development container |
|
@# Syntax: |
|
@# make input_dir=<YOUR_INPUT_DIR> output_dir=<YOUR_OUTPUT_DIR> run-dev |
|
|
|
@echo Arguments: |
|
@echo input_dir = "$(input_dir)" | xargs -I{} echo " - {}" |
|
@echo output_dir = "$(output_dir)" | xargs -I{} echo " - {}" |
|
@echo |
|
|
|
@# with gpu's activated |
|
@docker run \ |
|
--gpus all \ |
|
--cpus=$(CPUS) \ |
|
--memory=$(MEMORY) \ |
|
--mount src=$(RAW_SRC),target=$(RAW_TARGET),type=bind,readonly \ |
|
--mount src=$(PROCESSED_SRC),target=$(PROCESSED_TARGET),type=bind \ |
|
--hostname $(HOSTNAME) \ |
|
-it $(IMG_NAME) \ |
|
$(input_dir) \ |
|
$(output_dir) \ |
|
|| echo "\033[0;31mFailed to enter. Check that your mounts exist." |
|
|
|
test: |
|
@# TODO: implement me! |
|
@echo Not Implented Yet |
Wow! Very useful