Skip to content

Commit 6946d3f

Browse files
committed
fix makefile
1 parent b36b4e8 commit 6946d3f

File tree

1 file changed

+144
-86
lines changed

1 file changed

+144
-86
lines changed

Makefile

Lines changed: 144 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,161 @@
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
2367

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/
3371

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)
3674

37-
build: src/
38-
yarn -D
75+
build: install build_swagger ## 🛠️ Build the entire application
76+
@echo "--- Building project source ---"
3977
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
4279
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))
6782

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
7785

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
79125
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
86126
yarn prettier
127+
$(MAKE) validate_terraform
87128
yarn test:unit
88129

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
90134
yarn playwright install
91135
yarn test:e2e
92136

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+
# =============================================================================
94142

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
97152

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/
100157

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

Comments
 (0)