构建 SPIRE
前置条件
Go 版本
检查项目要求的 Go 版本:
cat .go-version
安装 Go
# macOS
brew install go
# Linux (手动安装)
wget https://go.dev/dl/go1.21.x.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.x.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
获取源码
git clone https://github.com/spiffe/spire.git
cd spire
使用 Make 构建
基本构建
# 构建所有二进制文件
make build
# 构建结果在 bin/ 目录
ls bin/
# spire-agent spire-server oidc-discovery-provider
构建特定目标
# 只构建 Server
make build-server
# 只构建 Agent
make build-agent
# 构建 OIDC Discovery Provider
make build-oidc-discovery-provider
交叉编译
# 构建 Linux amd64
GOOS=linux GOARCH=amd64 make build
# 构建 Linux arm64
GOOS=linux GOARCH=arm64 make build
# 构建 Windows
GOOS=windows GOARCH=amd64 make build
使用 Go 直接构建
# 构建 Server
go build -o bin/spire-server ./cmd/spire-server
# 构建 Agent
go build -o bin/spire-agent ./cmd/spire-agent
# 带版本信息构建
go build -ldflags "-X github.com/spiffe/spire/pkg/common/version.gittag=v1.0.0" \
-o bin/spire-server ./cmd/spire-server
构建容器镜像
使用 Docker
# 构建 Server 镜像
docker build -t spire-server:local -f Dockerfile --target spire-server .
# 构建 Agent 镜像
docker build -t spire-agent:local -f Dockerfile --target spire-agent .
多阶段构建
Dockerfile 使用多阶段构建优化镜像大小:
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /build
COPY . .
RUN make build
# 运行阶段
FROM gcr.io/distroless/static AS spire-server
COPY --from=builder /build/bin/spire-server /usr/bin/spire-server
ENTRYPOINT ["/usr/bin/spire-server"]
开发构建
启用调试信息
# 禁用优化,保留调试信息
go build -gcflags="all=-N -l" -o bin/spire-server ./cmd/spire-server
使用 Race Detector
go build -race -o bin/spire-server ./cmd/spire-server
生成代码
Protocol Buffers
# 安装 protoc
# macOS
brew install protobuf
# 安装 Go 插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# 生成代码
make generate
Mocks
# 安装 mockgen
go install go.uber.org/mock/mockgen@latest
# 生成 mocks
make generate
依赖管理
更新依赖
# 更新所有依赖
go get -u ./...
go mod tidy
# 更新特定依赖
go get -u github.com/spiffe/go-spiffe/v2
go mod tidy
检查依赖
# 查看直接依赖
go list -m -json all | jq 'select(.Main != true and .Indirect != true)'
# 查看依赖图
go mod graph
清理
# 清理构建产物
make clean
# 清理 Go 缓存
go clean -cache -testcache
常见问题
构建失败:缺少依赖
# 下载依赖
go mod download
# 验证依赖
go mod verify
CGO 相关问题
# 禁用 CGO
CGO_ENABLED=0 make build
# 启用 CGO(某些插件需要)
CGO_ENABLED=1 make build
版本信息不正确
# 确保 git 标签正确
git describe --tags
# 手动指定版本
make build VERSION=1.0.0
Makefile 目标
目标 |
描述 |
|---|---|
|
构建所有二进制文件 |
|
构建 Server |
|
构建 Agent |
|
运行单元测试 |
|
代码检查 |
|
生成代码 |
|
清理构建产物 |
|
显示帮助 |