本文档涵盖了 go-ethereum 项目的开发基础设施、构建流程、测试框架和开发者工具。它提供了关于如何构建、测试和贡献代码库的技术细节,以及维护代码质量的自动化 CI/CD 系统。
有关构建和打包系统的具体信息,请参阅 构建系统。有关测试基础设施和测试执行的详细信息,请参阅 测试。
go-ethereum 项目使用一个复杂的构建系统,该系统围绕 build/ci.go 脚本构建,该脚本作为所有构建、测试和部署操作的主要协调器。该系统提供跨平台编译、自动化测试、包创建以及部署到各种分发渠道。
构建系统支持多个入口点和目标,使开发人员能够执行特定任务或完成端到端构建和部署。
来源: build/ci.go1-1600 Makefile1-58 internal/build/util.go1-237
构建基础设施由几个关键组件组成,它们协同工作以提供全面的开发环境。
来源: build/ci.go142-177 internal/build/env.go59-125 internal/build/util.go39-90
该项目维护多个 CI 环境,这些环境可自动在不同平台和架构上构建、测试和部署软件。
| CI 系统 | 配置文件 | 平台 | 目的 |
|---|---|---|---|
| Travis CI | .travis.yml1-87 | Linux AMD64/386/ARM | Docker 构建、Ubuntu PPA、Archive 创建 |
| AppVeyor | appveyor.yml1-60 | Windows AMD64/386 | Windows 构建和安装程序 |
| GitHub Actions | .github/workflows/go.yml1-49 | Linux i386 | Linting 和 i386 测试 |
build/ci.go 脚本提供以下主要命令:
| 命令 | 目的 | 关键标志 |
|---|---|---|
install | 构建二进制文件 | -arch、-cc、-static、-dlgo |
test | 运行测试套件 | -coverage、-v、-race、-short |
lint | 静态分析 | -cachedir |
check_generate | 验证生成的代码 | 无 |
check_baddeps | 依赖项验证 | 无 |
archive | 创建发布包 | -arch、-type、-signer、-upload |
dockerx | 多架构 Docker 构建 | -platform、-hub、-upload |
debsrc | Debian 源代码包 | -signer、-upload、-workdir |
来源: build/ci.go151-177 build/ci.go181-228 build/ci.go275-330
测试基础设施在多个维度上提供全面的验证,包括状态测试、区块链测试、事务测试和集成测试。
来源: tests/state_test.go62-76 tests/block_test.go27-75 tests/init_test.go93-100
测试系统使用复杂的 testMatcher 框架来控制测试选择、配置和故障处理。
testMatcher 提供了用于控制测试执行的方法。
skipLoad(pattern) - 跳过与正则表达式匹配的测试加载slow(pattern) - 将测试标记为慢速(在 short 模式下跳过)fails(pattern, reason) - 期望特定的测试失败checkFailure(t, err) - 验证期望的故障与实际故障来源: tests/init_test.go93-191 tests/state_test_util.go188-196 tests/block_test_util.go92-114
该项目为常见的开发任务提供了多种接口。
Makefile 目标
直接使用 CI 脚本
来源: Makefile11-47 build/ci.go153-228
该项目使用多种自动化工具来维护代码质量。
.golangci.yml 配置文件启用了特定的 linter。
| Linter | 目的 |
|---|---|
staticcheck | 静态分析 |
govet | Go vet 检查 |
ineffassign | 无效赋值 |
misspell | 拼写错误 |
unconvert | 不必要的转换 |
unused | 未使用的代码 |
来源: .golangci.yml6-22 build/ci.go424-439
check_generate命令确保生成代码是最新的
来源: build/ci.go350-392 build/ci.go466-551
构建系统验证依赖项,以防止架构违规
这可以防止核心包依赖于特定的数据库实现,从而保持清晰的架构边界。
该项目通过 Docker 配置支持容器化构建
| Dockerfile | 目的 | 内容 |
|---|---|---|
Dockerfile | 仅 Geth 镜像 | 单个 geth 二进制文件 |
Dockerfile.alltools | 完整工具链 | 所有开发工具 |
两者都使用多阶段构建和 Alpine Linux 来实现最小的镜像尺寸
来源: Dockerfile6-27 Dockerfile.alltools6-40
dockerx 命令创建多架构 Docker 镜像
这使用 Docker Buildx 同时构建并推送多个 CPU 架构的镜像。
来源: build/ci.go660-728 .travis.yml20-22
构建系统创建多种软件包格式以供分发
来源: build/ci.go554-591 build/ci.go731-814 build/ci.go1043-1127
发布工件使用多种方法进行加密签名
LINUX_SIGNING_KEY 环境变量SIGNIFY_KEY 进行额外验证build/checksums.txt 中的 SHA256 哈希值签名过程与归档创建集成