mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 13:19:21 +00:00

This PR modernizes the ZITADEL monorepo build system by migrating from Yarn to pnpm, introducing Turbo for improved build orchestration, and cleaning up configuration inconsistencies across all apps and packages. ### 🎯 Key Improvements #### 📦 **Package Manager Migration (Yarn → pnpm)** - **Performance**: Faster installs with pnpm's efficient symlink-based node_modules structure - **Disk space**: Significant reduction in disk usage through content-addressable storage - **Lockfile**: More reliable dependency resolution with pnpm-lock.yaml - **Workspace support**: Better monorepo dependency management #### ⚡ **Turbo Integration** - **Build orchestration**: Dependency-aware task execution across the monorepo - **Intelligent caching**: Dramatically faster builds on CI/CD and local development - **Parallel execution**: Optimal task scheduling based on dependency graphs - **Vercel optimization**: Enhanced build performance and caching on Vercel deployments #### 🧹 **Configuration Cleanup & Unification** - **Removed config packages**: Eliminated `@zitadel/*-config` packages and inlined configurations - **Simplified dependencies**: Reduced complexity in package.json files across all apps - **Consistent tooling**: Unified prettier, ESLint, and TypeScript configurations - **Standalone support**: Improved prepare-standalone.js script for subtree deployments ### 📋 Detailed Changes #### **🔧 Build System & Dependencies** - ✅ Updated all package.json scripts to use `pnpm` instead of `yarn` - ✅ Replaced `yarn.lock` with pnpm-lock.yaml and regenerated dependencies - ✅ Added Turbo configuration (turbo.json) to root and individual packages - ✅ Configured proper dependency chains: `@zitadel/proto#generate` → `@zitadel/client#build` → `console#build` - ✅ Added missing `@bufbuild/protobuf` dependency to console app for TypeScript compilation #### **🚀 CI/CD & Workflows** - ✅ Updated all GitHub Actions workflows to use `pnpm/action-setup@v4` - ✅ Migrated build processes to use Turbo with directory-based filters (`--filter=./console`) - ✅ **New**: Added `docs.yml` workflow for building documentation locally (helpful for contributors without Vercel access) - ✅ Fixed dependency resolution issues in lint workflows - ✅ Ensured proto generation always runs before builds and linting #### **📚 Documentation & Proto Generation** - ✅ **Robust plugin management**: Enhanced plugin-download.sh with retry logic and error handling - ✅ **Vercel compatibility**: Fixed protoc-gen-connect-openapi plugin availability in Vercel builds - ✅ **API docs generation**: Resolved Docusaurus build errors with OpenAPI plugin configuration - ✅ **Type safety**: Improved TypeScript type extraction patterns in Angular components #### **🛠️ Developer Experience** - ✅ Updated all README files to reference pnpm commands - ✅ Improved Makefile targets to use Turbo for consistent builds - ✅ Enhanced standalone build process for login app subtree deployments - ✅ Added debug utilities for troubleshooting build issues #### **🗂️ File Structure & Cleanup** - ✅ Removed obsolete configuration packages and their references - ✅ Cleaned up Docker files to remove non-existent package copies - ✅ Updated workspace references and import paths - ✅ Streamlined turbo.json configurations across all packages ### 🎉 Benefits 1. **⚡ Faster Builds**: Turbo's caching and parallel execution significantly reduce build times 2. **🔄 Better Caching**: Improved cache hits on Vercel and CI/CD environments 3. **🛠️ Simplified Maintenance**: Unified tooling and configuration management 4. **📈 Developer Productivity**: Faster local development with optimized dependency resolution 5. **🚀 Enhanced CI/CD**: More reliable and faster automated builds and deployments 6. **📖 Better Documentation**: Comprehensive build documentation and troubleshooting guides ### 🧪 Testing - ✅ All apps build successfully with new pnpm + Turbo setup - ✅ Proto generation works correctly across console, login, and docs - ✅ GitHub Actions workflows pass with new configuration - ✅ Vercel deployments work with enhanced plugin management - ✅ Local development workflow verified and documented This migration sets a solid foundation for future development while maintaining backward compatibility and improving the overall developer experience. --------- Co-authored-by: Elio Bischof <elio@zitadel.com>
216 lines
8.5 KiB
Makefile
216 lines
8.5 KiB
Makefile
go_bin := "$$(go env GOPATH)/bin"
|
|
gen_authopt_path := "$(go_bin)/protoc-gen-authoption"
|
|
gen_zitadel_path := "$(go_bin)/protoc-gen-zitadel"
|
|
|
|
now := $(shell date '+%Y-%m-%dT%T%z' | sed -E 's/.([0-9]{2})([0-9]{2})$$/-\1:\2/')
|
|
VERSION ?= development-$(now)
|
|
COMMIT_SHA ?= $(shell git rev-parse HEAD)
|
|
ZITADEL_IMAGE ?= zitadel:local
|
|
|
|
GOCOVERDIR = tmp/coverage
|
|
ZITADEL_MASTERKEY ?= MasterkeyNeedsToHave32Characters
|
|
|
|
export GOCOVERDIR ZITADEL_MASTERKEY
|
|
|
|
LOGIN_REMOTE_NAME := login
|
|
LOGIN_REMOTE_URL ?= https://github.com/zitadel/typescript.git
|
|
LOGIN_REMOTE_BRANCH ?= main
|
|
|
|
.PHONY: compile
|
|
compile: core_build console_build compile_pipeline
|
|
|
|
.PHONY: docker_image
|
|
docker_image:
|
|
@if [ ! -f ./zitadel ]; then \
|
|
echo "Compiling zitadel binary"; \
|
|
$(MAKE) compile; \
|
|
else \
|
|
echo "Reusing precompiled zitadel binary"; \
|
|
fi
|
|
DOCKER_BUILDKIT=1 docker build -f build/Dockerfile -t $(ZITADEL_IMAGE) .
|
|
|
|
.PHONY: compile_pipeline
|
|
compile_pipeline: console_move
|
|
CGO_ENABLED=0 go build -o zitadel -v -ldflags="-s -w -X 'github.com/zitadel/zitadel/cmd/build.commit=$(COMMIT_SHA)' -X 'github.com/zitadel/zitadel/cmd/build.date=$(now)' -X 'github.com/zitadel/zitadel/cmd/build.version=$(VERSION)' "
|
|
chmod +x zitadel
|
|
|
|
.PHONY: core_dependencies
|
|
core_dependencies:
|
|
go mod download
|
|
|
|
.PHONY: core_static
|
|
core_static:
|
|
go install github.com/rakyll/statik@v0.1.7
|
|
go generate internal/api/ui/login/static/resources/generate.go
|
|
go generate internal/api/ui/login/statik/generate.go
|
|
go generate internal/notification/statik/generate.go
|
|
go generate internal/statik/generate.go
|
|
|
|
.PHONY: core_generate_all
|
|
core_generate_all:
|
|
go install github.com/dmarkham/enumer@v1.5.10 # https://pkg.go.dev/github.com/dmarkham/enumer?tab=versions
|
|
go install github.com/rakyll/statik@v0.1.7 # https://pkg.go.dev/github.com/rakyll/statik?tab=versions
|
|
go install go.uber.org/mock/mockgen@v0.4.0 # https://pkg.go.dev/go.uber.org/mock/mockgen?tab=versions
|
|
go install golang.org/x/tools/cmd/stringer@v0.22.0 # https://pkg.go.dev/golang.org/x/tools/cmd/stringer?tab=versions
|
|
go generate ./...
|
|
|
|
.PHONY: core_assets
|
|
core_assets:
|
|
mkdir -p docs/apis/assets
|
|
go run internal/api/assets/generator/asset_generator.go -directory=internal/api/assets/generator/ -assets=docs/apis/assets/assets.md
|
|
|
|
.PHONY: core_api_generator
|
|
core_api_generator:
|
|
ifeq (,$(wildcard $(gen_authopt_path)))
|
|
go install internal/protoc/protoc-gen-authoption/main.go \
|
|
&& mv $$(go env GOPATH)/bin/main $(gen_authopt_path)
|
|
endif
|
|
ifeq (,$(wildcard $(gen_zitadel_path)))
|
|
go install internal/protoc/protoc-gen-zitadel/main.go \
|
|
&& mv $$(go env GOPATH)/bin/main $(gen_zitadel_path)
|
|
endif
|
|
|
|
.PHONY: core_grpc_dependencies
|
|
core_grpc_dependencies:
|
|
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.35.1 # https://pkg.go.dev/google.golang.org/protobuf/cmd/protoc-gen-go?tab=versions
|
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.5.1 # https://pkg.go.dev/google.golang.org/grpc/cmd/protoc-gen-go-grpc?tab=versions
|
|
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@v2.22.0 # https://pkg.go.dev/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway?tab=versions
|
|
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@v2.22.0 # https://pkg.go.dev/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2?tab=versions
|
|
go install github.com/envoyproxy/protoc-gen-validate@v1.1.0 # https://pkg.go.dev/github.com/envoyproxy/protoc-gen-validate?tab=versions
|
|
go install github.com/bufbuild/buf/cmd/buf@v1.45.0 # https://pkg.go.dev/github.com/bufbuild/buf/cmd/buf?tab=versions
|
|
go install connectrpc.com/connect/cmd/protoc-gen-connect-go@v1.18.1 # https://pkg.go.dev/connectrpc.com/connect/cmd/protoc-gen-connect-go?tab=versions
|
|
|
|
.PHONY: core_api
|
|
core_api: core_api_generator core_grpc_dependencies
|
|
buf generate
|
|
mkdir -p pkg/grpc
|
|
cp -r .artifacts/grpc/github.com/zitadel/zitadel/pkg/grpc/** pkg/grpc/
|
|
mkdir -p openapi/v2/zitadel
|
|
cp -r .artifacts/grpc/zitadel/ openapi/v2/zitadel
|
|
|
|
.PHONY: core_build
|
|
core_build: core_dependencies core_api core_static core_assets
|
|
|
|
.PHONY: console_move
|
|
console_move:
|
|
cp -r console/dist/console/* internal/api/ui/console/static
|
|
|
|
.PHONY: console_dependencies
|
|
console_dependencies:
|
|
pnpm install
|
|
|
|
.PHONY: console_client
|
|
console_client:
|
|
cd console && \
|
|
pnpm generate
|
|
|
|
.PHONY: console_build
|
|
console_build: console_dependencies console_client
|
|
cd console && \
|
|
pnpm build
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
$(RM) -r .artifacts/grpc
|
|
$(RM) $(gen_authopt_path)
|
|
$(RM) $(gen_zitadel_path)
|
|
$(RM) -r tmp/
|
|
|
|
.PHONY: core_unit_test
|
|
core_unit_test:
|
|
go test -race -coverprofile=profile.cov -coverpkg=./internal/... ./...
|
|
|
|
.PHONY: core_integration_db_up
|
|
core_integration_db_up:
|
|
docker compose -f internal/integration/config/docker-compose.yaml up --pull always --wait cache postgres
|
|
|
|
.PHONY: core_integration_db_down
|
|
core_integration_db_down:
|
|
docker compose -f internal/integration/config/docker-compose.yaml down
|
|
|
|
.PHONY: core_integration_setup
|
|
core_integration_setup:
|
|
go build -cover -race -tags integration -o zitadel.test main.go
|
|
mkdir -p $${GOCOVERDIR}
|
|
GORACE="halt_on_error=1" ./zitadel.test init --config internal/integration/config/zitadel.yaml --config internal/integration/config/postgres.yaml
|
|
GORACE="halt_on_error=1" ./zitadel.test setup --masterkeyFromEnv --init-projections --config internal/integration/config/zitadel.yaml --config internal/integration/config/postgres.yaml --steps internal/integration/config/steps.yaml
|
|
|
|
.PHONY: core_integration_server_start
|
|
core_integration_server_start: core_integration_setup
|
|
GORACE="log_path=tmp/race.log" \
|
|
./zitadel.test start --masterkeyFromEnv --config internal/integration/config/zitadel.yaml --config internal/integration/config/postgres.yaml \
|
|
> tmp/zitadel.log 2>&1 \
|
|
& printf $$! > tmp/zitadel.pid
|
|
|
|
.PHONY: core_integration_test_packages
|
|
core_integration_test_packages:
|
|
go test -race -count 1 -tags integration -timeout 30m $$(go list -tags integration ./... | grep "integration_test")
|
|
|
|
.PHONY: core_integration_server_stop
|
|
core_integration_server_stop:
|
|
pid=$$(cat tmp/zitadel.pid); \
|
|
$(RM) tmp/zitadel.pid; \
|
|
kill $$pid; \
|
|
if [ -s tmp/race.log.$$pid ]; then \
|
|
cat tmp/race.log.$$pid; \
|
|
exit 66; \
|
|
fi
|
|
|
|
.PHONY: core_integration_reports
|
|
core_integration_reports:
|
|
go tool covdata textfmt -i=tmp/coverage -pkg=github.com/zitadel/zitadel/internal/...,github.com/zitadel/zitadel/cmd/... -o profile.cov
|
|
|
|
.PHONY: core_integration_test
|
|
core_integration_test: core_integration_server_start core_integration_test_packages core_integration_server_stop core_integration_reports
|
|
|
|
.PHONY: console_lint
|
|
console_lint:
|
|
pnpm turbo lint --filter=./console
|
|
|
|
.PHONY: core_lint
|
|
core_lint:
|
|
golangci-lint run \
|
|
--timeout 10m \
|
|
--config ./.golangci.yaml \
|
|
--out-format=github-actions \
|
|
--concurrency=$$(getconf _NPROCESSORS_ONLN)
|
|
|
|
.PHONY: login_pull
|
|
login_pull: login_ensure_remote
|
|
@echo "Pulling changes from the 'login' subtree on remote $(LOGIN_REMOTE_NAME) branch $(LOGIN_REMOTE_BRANCH)"
|
|
git fetch $(LOGIN_REMOTE_NAME) $(LOGIN_REMOTE_BRANCH)
|
|
git merge -s ours --allow-unrelated-histories $(LOGIN_REMOTE_NAME)/$(LOGIN_REMOTE_BRANCH) -m "Synthetic merge to align histories"
|
|
git push
|
|
|
|
.PHONY: login_push
|
|
login_push: login_ensure_remote
|
|
@echo "Pushing changes to the 'login' subtree on remote $(LOGIN_REMOTE_NAME) branch $(LOGIN_REMOTE_BRANCH)"
|
|
git subtree split --prefix=login -b login-sync-tmp
|
|
git checkout login-sync-tmp
|
|
git fetch $(LOGIN_REMOTE_NAME) main
|
|
git merge -s ours --allow-unrelated-histories $(LOGIN_REMOTE_NAME)/main -m "Synthetic merge to align histories"
|
|
git push $(LOGIN_REMOTE_NAME) login-sync-tmp:$(LOGIN_REMOTE_BRANCH)
|
|
git checkout -
|
|
git branch -D login-sync-tmp
|
|
|
|
login_ensure_remote:
|
|
@if ! git remote get-url $(LOGIN_REMOTE_NAME) > /dev/null 2>&1; then \
|
|
echo "Adding remote $(LOGIN_REMOTE_NAME)"; \
|
|
git remote add $(LOGIN_REMOTE_NAME) $(LOGIN_REMOTE_URL); \
|
|
else \
|
|
echo "Remote $(LOGIN_REMOTE_NAME) already exists."; \
|
|
fi
|
|
|
|
export LOGIN_DIR := ./login/
|
|
export LOGIN_BAKE_CLI_ADDITIONAL_ARGS := --set login-*.context=./login/ --file ./docker-bake.hcl
|
|
export ZITADEL_TAG ?= $(ZITADEL_IMAGE)
|
|
include login/Makefile
|
|
|
|
# Intentional override of login_test_acceptance_build
|
|
login_test_acceptance_build: docker_image
|
|
@echo "Building login test acceptance environment with the local zitadel image"
|
|
$(MAKE) login_test_acceptance_build_compose login_test_acceptance_build_bake
|
|
|
|
login_dev: docker_image typescript_generate login_test_acceptance_build_compose login_test_acceptance_cleanup login_test_acceptance_setup_dev
|
|
@echo "Starting login test environment with the local zitadel image"
|