菜单

开发

相关源文件

本文档涵盖了 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 环境矩阵

CI 系统配置文件平台目的
Travis CI.travis.yml1-87Linux AMD64/386/ARMDocker 构建、Ubuntu PPA、Archive 创建
AppVeyorappveyor.yml1-60Windows AMD64/386Windows 构建和安装程序
GitHub Actions.github/workflows/go.yml1-49Linux i386Linting 和 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
debsrcDebian 源代码包-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

代码质量工具

该项目使用多种自动化工具来维护代码质量。

Linting 配置

.golangci.yml 配置文件启用了特定的 linter。

Linter目的
staticcheck静态分析
govetGo vet 检查
ineffassign无效赋值
misspell拼写错误
unconvert不必要的转换
unused未使用的代码

来源: .golangci.yml6-22 build/ci.go424-439

代码生成验证

check_generate命令确保生成代码是最新的

来源: build/ci.go350-392 build/ci.go466-551

依赖管理

构建系统验证依赖项,以防止架构违规

这可以防止核心包依赖于特定的数据库实现,从而保持清晰的架构边界。

来源: build/ci.go394-422

容器化开发

该项目通过 Docker 配置支持容器化构建

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

代码签名和安全性

发布工件使用多种方法进行加密签名

  • PGP 签名:使用 LINUX_SIGNING_KEY 环境变量
  • Signify 签名:使用 SIGNIFY_KEY 进行额外验证
  • 校验和验证build/checksums.txt 中的 SHA256 哈希值

签名过程与归档创建集成

来源: build/ci.go607-645 build/checksums.txt1-153