|
1 |
| -prod_aws_account = 298118738376 |
2 |
| -dev_aws_account = 427040638965 |
3 |
| -current_aws_account := $(shell aws sts get-caller-identity --query Account --output text) |
4 |
| - |
5 |
| -src_directory_root = src/ |
6 |
| -dist_ui_directory_root = dist_ui/ |
7 |
| -integration_test_directory_root = tests/live_integration/ |
8 |
| -npm_install_params = --omit=dev --target_arch=arm64 --target_platform=linux --target_libc=glibc --cpu arm64 --os linux --arch=arm64 |
9 |
| -GIT_HASH := $(shell git rev-parse --short HEAD) |
10 |
| - |
11 |
| -.PHONY: clean |
12 |
| - |
13 |
| -check_account_prod: |
14 |
| -ifneq ($(current_aws_account),$(prod_aws_account)) |
15 |
| - $(error Error: running in account $(current_aws_account), expected account ID $(prod_aws_account)) |
16 |
| -endif |
17 |
| - |
18 |
| -check_account_dev: |
19 |
| -ifneq ($(current_aws_account),$(dev_aws_account)) |
20 |
| - $(error Error: running in account $(current_aws_account), expected account ID $(dev_aws_account)) |
21 |
| -endif |
22 |
| - |
| 1 | +# ============================================================================= |
| 2 | +# VARIABLES |
| 3 | +# ============================================================================= |
| 4 | + |
| 5 | +# AWS Account IDs |
| 6 | +PROD_AWS_ACCOUNT := 298118738376 |
| 7 | +DEV_AWS_ACCOUNT := 427040638965 |
| 8 | + |
| 9 | +# Tools & Shell Commands (immediate expansion) |
| 10 | +SHELL := /bin/bash |
| 11 | +GIT_HASH := $(shell git rev-parse --short HEAD) |
| 12 | +CURRENT_AWS_ACCT := $(shell aws sts get-caller-identity --query Account --output text) |
| 13 | +CURL := curl -f |
| 14 | + |
| 15 | +# Directories |
| 16 | +API_SRC_DIR := src/api |
| 17 | +TERRAFORM_PROD_DIR := terraform/envs/prod |
| 18 | +TERRAFORM_QA_DIR := terraform/envs/qa |
| 19 | +DIST_LAMBDA_DIR := dist/lambda |
| 20 | +DIST_SQS_CONSUMER_DIR := dist/sqsConsumer |
| 21 | + |
| 22 | +# Build Parameters |
| 23 | +NODE_BUILDER_IMAGE := public.ecr.aws/sam/build-nodejs22.x:latest |
| 24 | +NPM_INSTALL_PARAMS := --omit=dev --target_arch=arm64 --target_platform=linux --target_libc=glibc |
| 25 | + |
| 26 | +# Platforms for Terraform provider locking |
| 27 | +TF_LOCK_PLATFORMS := -platform=windows_amd64 -platform=darwin_amd64 -platform=darwin_arm64 -platform=linux_amd64 -platform=linux_arm64 |
| 28 | + |
| 29 | +# ============================================================================= |
| 30 | +# PHONY TARGETS & DEFAULT GOAL |
| 31 | +# ============================================================================= |
| 32 | + |
| 33 | +.PHONY: help all clean build build_swagger local deploy_prod deploy_dev init_terraform \ |
| 34 | + install test_all test_unit test_live_integration test_e2e test_post_deploy \ |
| 35 | + check_account_prod check_account_dev dev_health_check prod_health_check \ |
| 36 | + lock_terraform validate_terraform |
| 37 | + |
| 38 | +# Set the default goal to 'help' |
| 39 | +.DEFAULT_GOAL := help |
| 40 | + |
| 41 | +# ============================================================================= |
| 42 | +# HELPER DEFINITION |
| 43 | +# ============================================================================= |
| 44 | + |
| 45 | +# Define a reusable function for building Node.js packages in Docker. |
| 46 | +# Argument 1: The directory to process (e.g., dist/lambda) |
| 47 | +define build-lambda-package |
| 48 | + @echo "--- Building Node.js package in $(1) ---" |
| 49 | + docker run --rm -v "$(shell pwd)/$(1)":/var/task $(NODE_BUILDER_IMAGE) \ |
| 50 | + sh -c "npm install $(NPM_INSTALL_PARAMS) && \ |
| 51 | + rm -rf node_modules/aws-crt/dist/bin/{darwin*,linux-x64*,linux-arm64-musl} && \ |
| 52 | + rm -rf node_modules/argon2/prebuilds/{darwin*,freebsd*,linux-arm,linux-x64*,win32-x64*} && \ |
| 53 | + rm -rf node_modules/argon2/prebuilds/linux-arm64/argon2.armv8.musl.node" |
| 54 | +endef |
| 55 | + |
| 56 | +# ============================================================================= |
| 57 | +# CORE TARGETS |
| 58 | +# ============================================================================= |
| 59 | + |
| 60 | +help: ## ✨ Show this help message |
| 61 | + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_0-9-]+:.*?## / {printf "\033[36m%-25s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) |
| 62 | + |
| 63 | +all: install build test_all ## 🚀 Install, build, and run all tests |
| 64 | + |
| 65 | +install: ## 📦 Install all project dependencies using Yarn |
| 66 | + yarn -D |
23 | 67 |
|
24 |
| -clean: |
25 |
| - rm -rf .aws-sam |
26 |
| - rm -rf node_modules/ |
27 |
| - rm -rf src/api/node_modules/ |
28 |
| - rm -rf src/ui/node_modules/ |
29 |
| - rm -rf dist/ |
30 |
| - rm -rf dist_ui/ |
31 |
| - rm -rf dist_devel/ |
32 |
| - rm -rf coverage/ |
| 68 | +clean: ## 🧹 Remove all build artifacts and node_modules |
| 69 | + rm -rf .aws-sam node_modules/ src/api/node_modules/ src/ui/node_modules/ \ |
| 70 | + dist/ dist_ui/ dist_devel/ coverage/ |
33 | 71 |
|
34 |
| -build_swagger: |
35 |
| - cd src/api && npx tsx --experimental-loader=./mockLoader.mjs createSwagger.ts && cd ../.. |
| 72 | +build_swagger: ## 📝 Generate Swagger/OpenAPI specification |
| 73 | + @(cd $(API_SRC_DIR); npx tsx --experimental-loader=./mockLoader.mjs createSwagger.ts) |
36 | 74 |
|
37 |
| -build: src/ |
38 |
| - yarn -D |
| 75 | +build: install build_swagger ## 🛠️ Build the entire application |
| 76 | + @echo "--- Building project source ---" |
39 | 77 | yarn build
|
40 |
| - make build_swagger |
41 |
| - cp -r src/api/resources/ dist/api/resources |
| 78 | + cp -r $(API_SRC_DIR)/resources/ dist/api/resources |
42 | 79 | rm -rf dist/lambda/sqs
|
43 |
| - docker run --rm -v "$(shell pwd)/dist/lambda":/var/task public.ecr.aws/sam/build-nodejs22.x:latest \ |
44 |
| - sh -c "npm install $(npm_install_params) && \ |
45 |
| - rm -rf node_modules/aws-crt/dist/bin/{darwin*,linux-x64*,linux-arm64-musl} && \ |
46 |
| - rm -rf node_modules/argon2/prebuilds/{darwin*,freebsd*,linux-arm,linux-x64*,win32-x64*} && \ |
47 |
| - rm -rf node_modules/argon2/prebuilds/linux-arm64/argon2.armv8.musl.node" |
48 |
| - |
49 |
| - docker run --rm -v "$(shell pwd)/dist/sqsConsumer":/var/task public.ecr.aws/sam/build-nodejs22.x:latest \ |
50 |
| - sh -c "npm install $(npm_install_params) && \ |
51 |
| - rm -rf node_modules/aws-crt/dist/bin/{darwin*,linux-x64*,linux-arm64-musl} && \ |
52 |
| - rm -rf node_modules/argon2/prebuilds/{darwin*,freebsd*,linux-arm,linux-x64*,win32-x64*} && \ |
53 |
| - rm -rf node_modules/argon2/prebuilds/linux-arm64/argon2.armv8.musl.node" |
54 |
| - |
55 |
| -local: |
56 |
| - VITE_BUILD_HASH=$(GIT_HASH) yarn run dev |
57 |
| - |
58 |
| -deploy_prod: check_account_prod |
59 |
| - @echo "Deploying Terraform..." |
60 |
| - terraform -chdir=terraform/envs/prod init -lockfile=readonly |
61 |
| - terraform -chdir=terraform/envs/prod apply -auto-approve |
62 |
| - |
63 |
| -deploy_dev: check_account_dev |
64 |
| - @echo "Deploying Terraform..." |
65 |
| - terraform -chdir=terraform/envs/qa init -lockfile=readonly |
66 |
| - terraform -chdir=terraform/envs/qa apply -auto-approve |
| 80 | + $(call build-lambda-package,$(DIST_LAMBDA_DIR)) |
| 81 | + $(call build-lambda-package,$(DIST_SQS_CONSUMER_DIR)) |
67 | 82 |
|
68 |
| -init_terraform: |
69 |
| - terraform -chdir=terraform/envs/qa init |
70 |
| - terraform -chdir=terraform/envs/prod init |
71 |
| - |
72 |
| -install: |
73 |
| - yarn -D |
74 |
| - |
75 |
| -test_live_integration: install |
76 |
| - yarn test:live |
| 83 | +local: install ## 🏃 Run the development server locally |
| 84 | + VITE_BUILD_HASH=$(GIT_HASH) yarn run dev |
77 | 85 |
|
78 |
| -test_unit: install |
| 86 | +# ============================================================================= |
| 87 | +# DEPLOYMENT & TERRAFORM |
| 88 | +# ============================================================================= |
| 89 | + |
| 90 | +deploy_prod: check_account_prod ## 🚀 Deploy to PRODUCTION environment |
| 91 | + @echo "--- Deploying Terraform to Production ---" |
| 92 | + terraform -chdir=$(TERRAFORM_PROD_DIR) apply -auto-approve |
| 93 | + |
| 94 | +deploy_dev: check_account_dev ## 🚀 Deploy to DEVELOPMENT (QA) environment |
| 95 | + @echo "--- Deploying Terraform to Development (QA) ---" |
| 96 | + terraform -chdir=$(TERRAFORM_QA_DIR) apply -auto-approve |
| 97 | + |
| 98 | +init_terraform: ## Terraform: Initialize all environments |
| 99 | + @echo "--- Initializing Terraform for Production ---" |
| 100 | + terraform -chdir=$(TERRAFORM_PROD_DIR) init |
| 101 | + @echo "--- Initializing Terraform for Development (QA) ---" |
| 102 | + terraform -chdir=$(TERRAFORM_QA_DIR) init |
| 103 | + |
| 104 | +validate_terraform: ## Terraform: Format and validate all environments |
| 105 | + @echo "--- Validating Production Terraform ---" |
| 106 | + terraform -chdir=$(TERRAFORM_PROD_DIR) fmt -check |
| 107 | + terraform -chdir=$(TERRAFORM_PROD_DIR) validate |
| 108 | + @echo "--- Validating Development (QA) Terraform ---" |
| 109 | + terraform -chdir=$(TERRAFORM_QA_DIR) fmt -check |
| 110 | + terraform -chdir=$(TERRAFORM_QA_DIR) validate |
| 111 | + |
| 112 | +lock_terraform: ## Terraform: Update provider dependency locks for all platforms |
| 113 | + @echo "--- Locking Terraform providers for Production ---" |
| 114 | + terraform -chdir=$(TERRAFORM_PROD_DIR) providers lock $(TF_LOCK_PLATFORMS) |
| 115 | + @echo "--- Locking Terraform providers for Development (QA) ---" |
| 116 | + terraform -chdir=$(TERRAFORM_QA_DIR) providers lock $(TF_LOCK_PLATFORMS) |
| 117 | + |
| 118 | +# ============================================================================= |
| 119 | +# TESTING & QA |
| 120 | +# ============================================================================= |
| 121 | + |
| 122 | +test_all: test_unit test_e2e ## ✅ Run all unit and e2e tests |
| 123 | + |
| 124 | +test_unit: install ## ✅ Run linters, formatters, and unit tests |
79 | 125 | yarn lint
|
80 |
| - terraform -chdir=terraform/envs/qa init -reconfigure -backend=false -upgrade |
81 |
| - terraform -chdir=terraform/envs/qa fmt -check |
82 |
| - terraform -chdir=terraform/envs/qa validate |
83 |
| - terraform -chdir=terraform/envs/prod init -reconfigure -backend=false |
84 |
| - terraform -chdir=terraform/envs/prod fmt -check |
85 |
| - terraform -chdir=terraform/envs/prod validate |
86 | 126 | yarn prettier
|
| 127 | + $(MAKE) validate_terraform |
87 | 128 | yarn test:unit
|
88 | 129 |
|
89 |
| -test_e2e: install |
| 130 | +test_live_integration: install ## ✅ Run post-deployment integration tests |
| 131 | + yarn test:live |
| 132 | + |
| 133 | +test_e2e: install ## ✅ Run Playwright end-to-end tests |
90 | 134 | yarn playwright install
|
91 | 135 | yarn test:e2e
|
92 | 136 |
|
93 |
| -test_post_deploy: test_live_integration test_e2e |
| 137 | +test_post_deploy: test_live_integration test_e2e ## ✅ Run all post-deployment tests |
| 138 | + |
| 139 | +# ============================================================================= |
| 140 | +# HEALTH CHECKS & GUARDS |
| 141 | +# ============================================================================= |
94 | 142 |
|
95 |
| -dev_health_check: |
96 |
| - curl -f https://core.aws.qa.acmuiuc.org/api/v1/healthz && curl -f https://core.aws.qa.acmuiuc.org/ |
| 143 | +check_account_prod: ## 🔒 Verify execution in the PRODUCTION AWS account |
| 144 | +ifneq ($(CURRENT_AWS_ACCT),$(PROD_AWS_ACCOUNT)) |
| 145 | + $(error ERROR: Not in PROD account. Expected $(PROD_AWS_ACCOUNT), but in $(CURRENT_AWS_ACCT)) |
| 146 | +endif |
| 147 | + |
| 148 | +check_account_dev: ## 🔒 Verify execution in the DEVELOPMENT AWS account |
| 149 | +ifneq ($(CURRENT_AWS_ACCT),$(DEV_AWS_ACCOUNT)) |
| 150 | + $(error ERROR: Not in DEV account. Expected $(DEV_AWS_ACCOUNT), but in $(CURRENT_AWS_ACCT)) |
| 151 | +endif |
97 | 152 |
|
98 |
| -prod_health_check: |
99 |
| - curl -f https://core.acm.illinois.edu/api/v1/healthz && curl -f https://core.acm.illinois.edu |
| 153 | +dev_health_check: ## ❤️ Check health of the DEVELOPMENT environment |
| 154 | + @echo "--- Pinging Development (QA) Environment ---" |
| 155 | + $(CURL) https://core.aws.qa.acmuiuc.org/api/v1/healthz |
| 156 | + $(CURL) https://core.aws.qa.acmuiuc.org/ |
100 | 157 |
|
101 |
| -lock_terraform: |
102 |
| - terraform -chdir=terraform/envs/qa providers lock -platform=windows_amd64 -platform=darwin_amd64 -platform=darwin_arm64 -platform=linux_amd64 -platform=linux_arm64 |
103 |
| - terraform -chdir=terraform/envs/prod providers lock -platform=windows_amd64 -platform=darwin_amd64 -platform=darwin_arm64 -platform=linux_amd64 -platform=linux_arm64 |
| 158 | +prod_health_check: ## ❤️ Check health of the PRODUCTION environment |
| 159 | + @echo "--- Pinging Production Environment ---" |
| 160 | + $(CURL) https://core.acm.illinois.edu/api/v1/healthz |
| 161 | + $(CURL) https://core.acm.illinois.edu |
0 commit comments