349 lines
No EOL
12 KiB
Makefile
349 lines
No EOL
12 KiB
Makefile
# import config.
|
|
# you can change the default config with `make cnf="config_special.env" build`
|
|
|
|
cnf ?= .env
|
|
ifneq ("$(wildcard $(cnf))","")
|
|
include $(cnf)
|
|
export $(shell sed 's/=.*//' $(cnf))
|
|
endif
|
|
|
|
cur_date = $(shell date '+%Y-%m-%d-%H-%M-%S')
|
|
|
|
# Make will use bash instead of sh
|
|
SHELL := /usr/bin/env bash
|
|
ifdef CICD_MODE
|
|
SHELL := /usr/bin/env sh
|
|
endif
|
|
|
|
# Interactive mode
|
|
NON_INTERACTIVE ?= 0
|
|
|
|
help: ## This help.
|
|
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
# Name of the output of the terraform plan
|
|
# Name of the output of the terraform plan
|
|
PLAN_BINARY_FILE=tfplan.binary
|
|
PLAN_JSON_FILE=tfplan.json
|
|
|
|
# Select the config file based of the stage
|
|
CONFIG_FILE := parameters.auto.tfvars
|
|
VAR_PARAMETERS := -var-file=../common.tfvars -var-file=${CONFIG_FILE} -var="module_path=${CURRENT_DIR}"
|
|
|
|
DOCKER_COMPOSE_FILES = -f docker-compose.yml
|
|
DOCKER_COMPOSE_FILES_TOOLS = -f docker-compose-tools.yml
|
|
|
|
DOCKER_COMPOSE = docker compose ${DOCKER_COMPOSE_FILES}
|
|
DOCKER_COMPOSE_DEV_TOOLS = docker compose ${DOCKER_COMPOSE_FILES_TOOLS}
|
|
|
|
ifdef CICD_MODE
|
|
ROLE_NAME := ${CICD_ROLE_NAME}
|
|
else
|
|
ROLE_NAME := ${LOCAL_ROLE_NAME}
|
|
endif
|
|
TERRAFORM_INIT = init --upgrade \
|
|
-backend-config="bucket=${TF_VAR_backend_bucket_name}"\
|
|
-backend-config="region=${TF_VAR_backend_bucket_region}" \
|
|
-backend-config="dynamodb_table=${TF_VAR_backend_dynamodb_table}" \
|
|
-backend-config="key=${PROJECT_NAME}${subst terraform,,$(CURRENT_DIR)}.tfstate" \
|
|
-backend-config="role_arn=${TF_VAR_backend_bucket_access_role}"
|
|
|
|
ifdef CICD_MODE
|
|
TFENV_EXEC ?= $(shell which tfenv)
|
|
TERRAFORM_EXEC ?= $(shell which terraform)
|
|
TFLINT_RUN ?= $(shell which tflint) --config .config/.tflint.hcl
|
|
PRECOMMIT_RUN ?= $(shell which pre-commit)
|
|
DOTENV_LINTER ?= $(shell which dotenv-linter)
|
|
SHELL_LINT ?= $(shell which shellcheck)
|
|
YAML_LINT ?= $(shell which yamllint)
|
|
MD_LINT ?= $(shell which mdl) --style config/.mdl_style.rb
|
|
TRIVY_RUN ?= $(shell which trivy)
|
|
TERRASCAN_RUN ?= $(shell which terrascan)
|
|
TERRAFORM_COMPLIANCE_RUN ?= $(shell which terraform-compliance)
|
|
TERRAFORM_DOCS ?= $(shell which terraform-docs)
|
|
else
|
|
TFENV_EXEC = $(DOCKER_COMPOSE) exec terraform
|
|
TERRAFORM_EXEC = $(DOCKER_COMPOSE) exec terraform
|
|
TFLINT_RUN = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm lint --config ./.config/.tflint.hcl
|
|
PRECOMMIT_RUN = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm precommit
|
|
DOTENV_LINTER = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm dotenv-linter
|
|
SHELL_LINT = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm shell_lint shellcheck
|
|
YAML_LINT = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm yaml_lint yamllint
|
|
MD_LINT = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm markdown_lint mdl --style ./.config/.mdl_style.rb
|
|
TRIVY_RUN = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm trivy
|
|
TERRASCAN_RUN = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm terrascan
|
|
TERRAFORM_COMPLIANCE_RUN = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm terraform-compliance
|
|
TERRAFORM_DOCS = $(DOCKER_COMPOSE_DEV_TOOLS) run --rm terraform-docs
|
|
endif
|
|
|
|
debug: ## Print debug logs
|
|
debug:
|
|
ifeq ($(PRINT_DEBUG),"true")
|
|
printenv
|
|
echo $(TFENV_EXEC)
|
|
echo $(TERRAFORM_EXEC)
|
|
echo $(TFLINT_RUN)
|
|
echo $(PRECOMMIT_RUN)
|
|
endif
|
|
|
|
CONFIG_FILE := parameters.auto.tfvars
|
|
ifdef CICD_MODE
|
|
VAR_PARAMETERS := -var-file=$(shell pwd)/terraform/common.tfvars \
|
|
-var-file=${CONFIG_FILE} \
|
|
-var="module_path=${CURRENT_DIR}" \
|
|
#-var="backend_bucket_key=${CURRENT_DIR}"
|
|
else
|
|
VAR_PARAMETERS := -var-file=/workdir/terraform/common.tfvars \
|
|
-var-file=${CONFIG_FILE} \
|
|
-var="module_path=${CURRENT_DIR}" \
|
|
#-var="backend_bucket_key=${CURRENT_DIR}"
|
|
endif
|
|
|
|
########################################################################################################################
|
|
# FUNCTIONS
|
|
########################################################################################################################
|
|
terraform_validate:
|
|
ifndef CICD_MODE
|
|
$(TFENV_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && tfenv install"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform validate"
|
|
else
|
|
cd ${CURRENT_DIR} && tfenv install
|
|
cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)
|
|
cd ${CURRENT_DIR} && terraform validate
|
|
endif
|
|
|
|
terraform_format:
|
|
ifndef CICD_MODE
|
|
$(TFENV_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && tfenv install"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform fmt -recursive"
|
|
else
|
|
cd ${CURRENT_DIR} && $(TFENV_EXEC) install
|
|
cd ${CURRENT_DIR} && terraform fmt -recursive
|
|
endif
|
|
|
|
# Combination of Terraform commands to install a stack layer
|
|
terraform_install_commands:
|
|
ifneq (,$(wildcard ${CURRENT_DIR}/${CONFIG_FILE}))
|
|
ifdef CICD_MODE
|
|
cd ${CURRENT_DIR} && tfenv install
|
|
cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)
|
|
cd ${CURRENT_DIR} && terraform plan ${VAR_PARAMETERS} -out ${PLAN_BINARY_FILE}
|
|
cd ${CURRENT_DIR} && terraform apply ${PLAN_BINARY_FILE}
|
|
else
|
|
$(TFENV_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && tfenv install"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform apply -compact-warnings ${VAR_PARAMETERS}"
|
|
endif
|
|
endif
|
|
|
|
# Combination of Terraform commands to install a stack layer
|
|
terraform_init_commands:
|
|
ifneq (,$(wildcard ${CURRENT_DIR}/${CONFIG_FILE}))
|
|
ifdef CICD_MODE
|
|
cd ${CURRENT_DIR} && tfenv install
|
|
cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)
|
|
else
|
|
$(TFENV_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && tfenv install"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)"
|
|
endif
|
|
endif
|
|
|
|
# Combination of Terraform commands to install a stack layer
|
|
terraform_plan_commands:
|
|
ifneq (,$(wildcard ${CURRENT_DIR}/${CONFIG_FILE}))
|
|
ifdef CICD_MODE
|
|
cd ${CURRENT_DIR} && $(TFENV_EXEC) install
|
|
cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)
|
|
cd ${CURRENT_DIR} && terraform plan ${VAR_PARAMETERS} -out ${PLAN_BINARY_FILE}
|
|
cd ${CURRENT_DIR} && terraform show -json ${PLAN_BINARY_FILE} > ${PLAN_JSON_FILE}
|
|
else
|
|
$(TFENV_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && tfenv install"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform $(TERRAFORM_INIT)"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform plan -compact-warnings ${VAR_PARAMETERS} -out ${PLAN_BINARY_FILE}"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform show -json ${PLAN_BINARY_FILE} > ${PLAN_JSON_FILE}"
|
|
endif
|
|
endif
|
|
|
|
terraform_lint:
|
|
$(TFLINT_RUN) ${CURRENT_DIR}
|
|
|
|
# Terraform commands to delete a stack layer
|
|
terraform_destroy_commands:
|
|
ifneq (,$(wildcard ${CURRENT_DIR}/${CONFIG_FILE}))
|
|
ifdef CICD_MODE
|
|
cd ${CURRENT_DIR} && tfenv install
|
|
cd ${CURRENT_DIR} && terraform destroy ${VAR_PARAMETERS}
|
|
else
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && tfenv install"
|
|
$(TERRAFORM_EXEC) /bin/sh -c "cd ${CURRENT_DIR} && terraform destroy ${VAR_PARAMETERS}"
|
|
endif
|
|
endif
|
|
|
|
########################################################################################################################
|
|
# LOCAL DEV DOCKER
|
|
########################################################################################################################
|
|
|
|
init: ## Generate .env file
|
|
init:
|
|
if [ ! -d .backup ] ; then mkdir .backup ; fi
|
|
if [ -f .env ] ; then cp .env .backup/.env-${cur_date}.bck ; else touch .env ; fi
|
|
cp configure.yaml automation/jinja2/variables/
|
|
# Hack: use only for first run
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run --rm jinja2docker .env.dist.j2 /variables/configure.yaml
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run --rm jinja2docker .env.dist.j2 /variables/configure.yaml | tee .env
|
|
|
|
generate: ## Generate from template gitlab-ci.yml and Makefile
|
|
generate:
|
|
@$(MAKE) init
|
|
@$(MAKE) generate_makefile
|
|
if [ "${GENERATE_GITLAB_CI}" == "True" ]; then "$(MAKE)" generate_gitlab_ci; fi
|
|
|
|
|
|
generate_makefile: ## Generate Makefile
|
|
generate_makefile:
|
|
if [ ! -d .backup ] ; then mkdir .backup ; fi
|
|
cp Makefile .backup/Makefile-${cur_date}.bck
|
|
# Hack: use only for first run
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run --rm jinja2docker make.mk.j2 /variables/vars.yml
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run --rm jinja2docker make.mk.j2 /variables/vars.yml | tee makeplan.mk
|
|
./automation/Makefile/delete_automatic_content.sh
|
|
cat makeplan.mk >> Makefile
|
|
|
|
generate_gitlab_ci: ## Generate GitlabCI
|
|
generate_gitlab_ci:
|
|
if [ ! -d .backup ] ; then mkdir .backup ; fi
|
|
if [ -f .gitlab-ci.yml ] ; then cp .gitlab-ci.yml .backup/.gitlab-ci.yml-${cur_date}.bck ; else touch .gitlab-ci.yml ; fi
|
|
cp configure.yaml automation/jinja2/variables/
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run jinja2docker .gitlab-ci.yml.j2 /variables/configure.yaml | tee .gitlab-ci.yml
|
|
tr -d "\r" < .gitlab-ci.yml>.gitlab-ci.yml.tmp
|
|
mv .gitlab-ci.yml.tmp .gitlab-ci.yml
|
|
|
|
start: ## Start the project
|
|
start: init generate
|
|
$(DOCKER_COMPOSE) up -d
|
|
# $(TERRAFORM_EXEC) apk add --no-cache python3 py3-pip
|
|
|
|
stop: ## Stop the project
|
|
stop:
|
|
$(DOCKER_COMPOSE) stop
|
|
|
|
down: ## stop containers
|
|
down:
|
|
$(DOCKER_COMPOSE) down -v
|
|
|
|
kill: ## Destroy all containers
|
|
kill:
|
|
$(DOCKER_COMPOSE) kill
|
|
$(DOCKER_COMPOSE) down --volumes --remove-orphans
|
|
|
|
console: ## Connect Terraform Docker
|
|
console:
|
|
$(TERRAFORM_EXEC) /bin/sh
|
|
|
|
restart: ## Restart the Terraform stack
|
|
restart: stop start
|
|
|
|
logout: ## Remove assumed role
|
|
logout:
|
|
rm -f .env
|
|
|
|
########################################################################################################################
|
|
# QUALITY CHECKS
|
|
########################################################################################################################
|
|
|
|
precommit: ## Launch precommit hooks
|
|
precommit:
|
|
$(PRECOMMIT_RUN) run -a --config=./.config/.pre-commit-config.yaml
|
|
|
|
dotenv_lint: ## Lint dotenv files
|
|
dotenv_lint:
|
|
$(DOTENV_LINTER) --skip UnorderedKey --skip LowercaseKey
|
|
|
|
markdown_lint: ## Lint Markdown files files
|
|
markdown_lint:
|
|
echo $(MD_LINT)
|
|
$(MD_LINT) .
|
|
|
|
shell_lint: ## Lint shell files
|
|
shell_lint:
|
|
$(SHELL_LINT) **/*/*.sh
|
|
|
|
yaml_lint: ## Lint yaml files
|
|
yaml_lint:
|
|
$(YAML_LINT) -c ./.config/.yamllintrc --no-warnings .
|
|
|
|
terrascan_docker: ## Terrascan Docker
|
|
terrascan_docker:
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run terrascan scan -d automation -i docker --verbose --config-path=./.config/.terrascan_config.toml
|
|
|
|
powershell_lint: ## PowerShell Linter
|
|
powershell_lint:
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run powershell_lint "Invoke-ScriptAnalyzer -Recurse -Path ."
|
|
|
|
quality-checks: ## run quality checks
|
|
quality-checks: dotenv_lint format validate lint precommit markdown_lint shell_lint yaml_lint trivy terrascan_docker terraform_terrascan
|
|
|
|
########################################################################################################################
|
|
# INSTALL / DELETE PLANS
|
|
########################################################################################################################
|
|
|
|
# Automatic Content Generated
|
|
|
|
generate_documentation: ## Generate Terraform Documentation
|
|
generate_documentation:
|
|
$(DOCKER_COMPOSE_DEV_TOOLS) run --rm --remove-orphans terraform_docs terraform/demo --config=./.config/.terraform-docs.yml
|
|
|
|
terraform_terrascan: ## Terrascan Terraform
|
|
terraform_terrascan:
|
|
$(TERRASCAN_RUN) scan -i terraform --verbose --config-path=./.terrascan_config.toml --iac-dir=terraform/demo
|
|
format: ## Format all Terraform files using "terraform fmt"
|
|
format:
|
|
@$(MAKE) --no-print-directory terraform_format CURRENT_DIR="terraform/demo"
|
|
|
|
trivy: ## Terraform Trivy
|
|
trivy:
|
|
$(TRIVY_RUN) config terraform/demo --config=./.config/.trivy.yaml --skip-dirs .terraform
|
|
|
|
validate: ## Validate all Terraform files using "terraform validate"
|
|
validate:
|
|
@$(MAKE) --no-print-directory terraform_validate CURRENT_DIR="terraform/demo"
|
|
|
|
lint: ## Check that good naming practices are respected in Terraform files (using tflint)
|
|
lint:
|
|
$(TFLINT_RUN) --init
|
|
@$(MAKE) --no-print-directory terraform_lint CURRENT_DIR="terraform/demo"
|
|
|
|
|
|
init_terraform_demo: ## Init AWS terraform/demo layer
|
|
init_terraform_demo:
|
|
@$(MAKE) --no-print-directory CURRENT_DIR=terraform/demo terraform_init_commands
|
|
|
|
plan_terraform_demo: ## Plan AWS terraform/demo layer
|
|
plan_terraform_demo:
|
|
@$(MAKE) --no-print-directory CURRENT_DIR=terraform/demo terraform_plan_commands
|
|
|
|
install_terraform_demo: ## Install AWS terraform/demo layer
|
|
install_terraform_demo:
|
|
@$(MAKE) --no-print-directory CURRENT_DIR=terraform/demo terraform_install_commands
|
|
|
|
destroy_terraform_demo: ## Uninstall AWS terraform/demo layer
|
|
destroy_terraform_demo:
|
|
@$(MAKE) --no-print-directory CURRENT_DIR=terraform/demo terraform_destroy_commands
|
|
|
|
|
|
init_all: ## Init all AWS layers
|
|
init_all:
|
|
@$(MAKE) --no-print-directory init_terraform_demo
|
|
|
|
plan_all: ## Plan all AWS layers
|
|
plan_all:
|
|
@$(MAKE) --no-print-directory plan_terraform_demo
|
|
|
|
install_all: ## Install all AWS layers
|
|
install_all: install_terraform_demo
|
|
|
|
destroy_all: ## Uninstall all layers
|
|
destroy_all: delete_terraform_demo |