658 lines
14 KiB
Markdown
658 lines
14 KiB
Markdown
|
# 🚀 Go 项目 Jenkins CI/CD 模板使用指南
|
|||
|
|
|||
|
## 📖 概述
|
|||
|
|
|||
|
这是一个高度可复用的 Go 项目 Jenkins Pipeline 模板,基于成功的生产实践经验,支持完整的 CI/CD 流程。经过优化后,构建时间从 10 分钟缩短到 3 分钟,SonarQube 扫描从 7 分钟优化到 11 秒。
|
|||
|
|
|||
|
## 🎯 功能特性
|
|||
|
|
|||
|
- ✅ **完整的 CI/CD 流程**: 代码检出 → 静态检查 → 测试 → 代码扫描 → 构建 → 部署 → 健康检查
|
|||
|
- ✅ **多环境支持**: 生产、预发布、开发环境自动部署
|
|||
|
- ✅ **代码质量保障**: SonarQube 集成,覆盖率报告,静态分析
|
|||
|
- ✅ **Docker 支持**: 自动构建优化的 Alpine 镜像
|
|||
|
- ✅ **参数化构建**: 支持手动构建时的灵活配置
|
|||
|
- ✅ **健康检查**: 自动验证部署结果
|
|||
|
- ✅ **通知集成**: 支持 Slack、邮件、钉钉通知
|
|||
|
- ✅ **安全扫描**: 依赖漏洞检查,代码安全分析
|
|||
|
|
|||
|
## 🛠️ 环境要求
|
|||
|
|
|||
|
### Jenkins 要求
|
|||
|
|
|||
|
1. **必需插件**:
|
|||
|
|
|||
|
```
|
|||
|
Pipeline
|
|||
|
Git
|
|||
|
SSH Agent
|
|||
|
SonarQube Scanner
|
|||
|
HTML Publisher
|
|||
|
Publish Test Results
|
|||
|
Build Badge
|
|||
|
```
|
|||
|
|
|||
|
2. **工具配置**:
|
|||
|
|
|||
|
```
|
|||
|
Go语言 (名称: go, 版本: 1.21+)
|
|||
|
SonarQube Scanner (名称: sonarQube)
|
|||
|
Docker (系统已安装)
|
|||
|
```
|
|||
|
|
|||
|
3. **凭据配置**:
|
|||
|
```
|
|||
|
SSH Key: deploy-server-ssh-key (部署服务器访问)
|
|||
|
Token: sonar-token (SonarQube访问令牌)
|
|||
|
Docker Registry (可选): docker-registry-creds
|
|||
|
```
|
|||
|
|
|||
|
### 服务器要求
|
|||
|
|
|||
|
1. **部署服务器**:
|
|||
|
|
|||
|
```bash
|
|||
|
- Docker 20.0+
|
|||
|
- 开放端口:15021(生产), 15022(预发布), 15023(开发)
|
|||
|
- SSH访问权限
|
|||
|
```
|
|||
|
|
|||
|
2. **Go 项目要求**:
|
|||
|
```bash
|
|||
|
- Go模块项目 (go.mod文件)
|
|||
|
- 健康检查端点 (/health 或 /ping 推荐)
|
|||
|
- 基准测试 (可选)
|
|||
|
```
|
|||
|
|
|||
|
## 🚀 快速开始
|
|||
|
|
|||
|
### 1. 复制模板
|
|||
|
|
|||
|
```bash
|
|||
|
# 在你的Go项目根目录
|
|||
|
cp /path/to/Jenkinsfile.go-template ./Jenkinsfile
|
|||
|
```
|
|||
|
|
|||
|
### 2. 修改项目配置
|
|||
|
|
|||
|
编辑`Jenkinsfile`中的项目配置部分:
|
|||
|
|
|||
|
```groovy
|
|||
|
// ===========================================
|
|||
|
// 📝 项目配置 - 每个项目都需要修改这些变量
|
|||
|
// ===========================================
|
|||
|
PROJECT_NAME = 'my-awesome-go-app' // 🔧 修改:你的项目名称
|
|||
|
DEPLOY_SERVER = '116.62.163.84' // 🔧 修改:部署服务器IP
|
|||
|
SSH_CREDENTIAL_ID = 'deploy-server-ssh-key' // 🔧 修改:SSH凭据ID
|
|||
|
|
|||
|
// SonarQube配置
|
|||
|
SONAR_HOST_URL = 'http://116.62.163.84:15010'
|
|||
|
SONAR_CREDENTIAL_ID = 'sonar-token'
|
|||
|
|
|||
|
// 端口配置
|
|||
|
PROD_PORT = '15021' // 生产环境端口
|
|||
|
STAGING_PORT = '15022' // 预发布环境端口
|
|||
|
DEV_PORT = '15023' // 开发环境端口
|
|||
|
```
|
|||
|
|
|||
|
### 3. 验证项目结构
|
|||
|
|
|||
|
确保你的 Go 项目符合要求:
|
|||
|
|
|||
|
```bash
|
|||
|
# 检查Go模块
|
|||
|
go mod tidy
|
|||
|
go mod verify
|
|||
|
|
|||
|
# 检查基本语法
|
|||
|
go vet ./...
|
|||
|
go fmt ./...
|
|||
|
|
|||
|
# 运行测试
|
|||
|
go test ./...
|
|||
|
|
|||
|
# 检查健康端点(推荐)
|
|||
|
# 确保应用有 /health 或 /ping 端点
|
|||
|
```
|
|||
|
|
|||
|
### 4. 推送代码
|
|||
|
|
|||
|
```bash
|
|||
|
git add Jenkinsfile
|
|||
|
git commit -m "Add Jenkins CI/CD pipeline"
|
|||
|
git push origin main
|
|||
|
```
|
|||
|
|
|||
|
### 5. 创建 Jenkins 任务
|
|||
|
|
|||
|
1. 创建新的 Pipeline 任务
|
|||
|
2. 配置 Git 仓库
|
|||
|
3. Pipeline 脚本选择"Pipeline script from SCM"
|
|||
|
4. 保存并构建
|
|||
|
|
|||
|
## ⚙️ 配置详解
|
|||
|
|
|||
|
### 环境变量配置
|
|||
|
|
|||
|
#### 必需配置
|
|||
|
|
|||
|
```groovy
|
|||
|
PROJECT_NAME = 'your-project-name' // 项目名称,影响容器名和镜像名
|
|||
|
DEPLOY_SERVER = 'your.server.ip' // 部署服务器IP地址
|
|||
|
SSH_CREDENTIAL_ID = 'ssh-key-id' // Jenkins中配置的SSH凭据ID
|
|||
|
```
|
|||
|
|
|||
|
#### 可选配置
|
|||
|
|
|||
|
```groovy
|
|||
|
// Docker仓库配置
|
|||
|
DOCKER_REGISTRY = 'registry.example.com'
|
|||
|
DOCKER_CREDENTIAL_ID = 'docker-creds'
|
|||
|
|
|||
|
// 自定义端口
|
|||
|
PROD_PORT = '8080' // 生产环境外部端口
|
|||
|
STAGING_PORT = '8081' // 预发布环境外部端口
|
|||
|
DEV_PORT = '8082' // 开发环境外部端口
|
|||
|
APP_PORT = '8080' // 应用内部端口
|
|||
|
|
|||
|
// 构建优化
|
|||
|
CGO_ENABLED = '0' // 禁用CGO(默认推荐)
|
|||
|
GOOS = 'linux' // 目标操作系统
|
|||
|
GOARCH = 'amd64' // 目标架构
|
|||
|
```
|
|||
|
|
|||
|
### 分支策略
|
|||
|
|
|||
|
模板支持基于分支的自动环境部署:
|
|||
|
|
|||
|
```yaml
|
|||
|
分支映射: main/master → production (生产环境)
|
|||
|
staging/release → staging (预发布环境)
|
|||
|
feature/* → development (开发环境)
|
|||
|
|
|||
|
端口映射: production → PROD_PORT (15021)
|
|||
|
staging → STAGING_PORT (15022)
|
|||
|
development → DEV_PORT (15023)
|
|||
|
```
|
|||
|
|
|||
|
### 构建参数
|
|||
|
|
|||
|
支持手动构建时的参数化配置:
|
|||
|
|
|||
|
```yaml
|
|||
|
DEPLOY_ENV:
|
|||
|
- auto: 根据分支自动选择环境
|
|||
|
- production: 强制部署到生产环境
|
|||
|
- staging: 部署到预发布环境
|
|||
|
- development: 部署到开发环境
|
|||
|
- skip: 仅构建,不部署
|
|||
|
|
|||
|
SKIP_TESTS: false # 跳过单元测试(不推荐)
|
|||
|
SKIP_SONAR: false # 跳过代码质量扫描
|
|||
|
FORCE_REBUILD_IMAGE: false # 强制重新构建Docker镜像
|
|||
|
CUSTOM_TAG: "" # 自定义Docker镜像标签
|
|||
|
```
|
|||
|
|
|||
|
## 📊 流水线阶段详解
|
|||
|
|
|||
|
### 1. 初始化阶段
|
|||
|
|
|||
|
```yaml
|
|||
|
并行执行:
|
|||
|
- 代码检出: Git克隆和分支信息获取
|
|||
|
- 环境检查: Go版本、Docker状态、项目结构验证
|
|||
|
|
|||
|
输出: 构建信息、环境状态报告
|
|||
|
```
|
|||
|
|
|||
|
### 2. 依赖管理
|
|||
|
|
|||
|
```bash
|
|||
|
执行步骤:
|
|||
|
go mod download -x # 下载依赖
|
|||
|
go mod verify # 验证依赖完整性
|
|||
|
go mod tidy # 清理无用依赖
|
|||
|
govulncheck ./... # 安全漏洞扫描(可选)
|
|||
|
```
|
|||
|
|
|||
|
### 3. 代码质量检查
|
|||
|
|
|||
|
```yaml
|
|||
|
并行执行:
|
|||
|
静态检查:
|
|||
|
- go vet ./... # 语法检查
|
|||
|
- gofmt检查 # 代码格式
|
|||
|
- 语法编译测试
|
|||
|
|
|||
|
代码规范:
|
|||
|
- goimports检查 # 导入顺序
|
|||
|
- gocyclo检查 # 代码复杂度(可选)
|
|||
|
```
|
|||
|
|
|||
|
### 4. 测试阶段
|
|||
|
|
|||
|
```yaml
|
|||
|
并行执行:
|
|||
|
单元测试:
|
|||
|
- go test -v -coverprofile=coverage.out
|
|||
|
- 生成覆盖率报告 (HTML + 文本)
|
|||
|
- JUnit格式测试报告
|
|||
|
|
|||
|
性能测试:
|
|||
|
- go test -bench=. # 基准测试
|
|||
|
- 性能报告生成
|
|||
|
```
|
|||
|
|
|||
|
### 5. 代码扫描
|
|||
|
|
|||
|
```bash
|
|||
|
SonarQube扫描:
|
|||
|
- 项目配置自动生成
|
|||
|
- 覆盖率数据集成
|
|||
|
- 代码质量门禁检查
|
|||
|
- 优化后11秒完成扫描
|
|||
|
```
|
|||
|
|
|||
|
### 6. 构建阶段
|
|||
|
|
|||
|
```yaml
|
|||
|
并行执行:
|
|||
|
编译应用:
|
|||
|
- 交叉编译为Linux二进制
|
|||
|
- 版本信息注入
|
|||
|
- 二进制文件验证
|
|||
|
|
|||
|
准备部署:
|
|||
|
- 生成部署脚本
|
|||
|
- 配置文件准备
|
|||
|
```
|
|||
|
|
|||
|
### 7. Docker 镜像
|
|||
|
|
|||
|
```dockerfile
|
|||
|
优化特性:
|
|||
|
- Alpine Linux基础镜像 (~5MB)
|
|||
|
- 多阶段构建支持
|
|||
|
- 非root用户运行
|
|||
|
- 健康检查内置
|
|||
|
- 中国镜像源优化
|
|||
|
- 镜像去重检查
|
|||
|
```
|
|||
|
|
|||
|
### 8. 镜像测试
|
|||
|
|
|||
|
```bash
|
|||
|
自动化测试:
|
|||
|
- 容器启动验证
|
|||
|
- 端点连通性测试
|
|||
|
- 健康检查验证
|
|||
|
- 自动清理测试容器
|
|||
|
```
|
|||
|
|
|||
|
### 9. 部署阶段
|
|||
|
|
|||
|
```bash
|
|||
|
部署流程:
|
|||
|
1. 镜像打包传输
|
|||
|
2. SSH远程执行
|
|||
|
3. 停止旧容器
|
|||
|
4. 启动新容器
|
|||
|
5. 配置健康检查
|
|||
|
```
|
|||
|
|
|||
|
### 10. 健康检查
|
|||
|
|
|||
|
```bash
|
|||
|
检查项目:
|
|||
|
- HTTP端点响应 (/health, /ping, /)
|
|||
|
- 容器状态验证
|
|||
|
- 5次重试机制
|
|||
|
- 失败自动回滚(生产环境)
|
|||
|
```
|
|||
|
|
|||
|
## 🏥 健康检查配置
|
|||
|
|
|||
|
### 推荐的健康检查端点
|
|||
|
|
|||
|
在你的 Go 应用中添加健康检查:
|
|||
|
|
|||
|
```go
|
|||
|
// main.go 或 router.go
|
|||
|
func setupHealthChecks(r *gin.Engine) {
|
|||
|
// 基本健康检查
|
|||
|
r.GET("/health", func(c *gin.Context) {
|
|||
|
c.JSON(200, gin.H{
|
|||
|
"status": "healthy",
|
|||
|
"timestamp": time.Now().Unix(),
|
|||
|
"version": Version,
|
|||
|
"uptime": time.Since(startTime).String(),
|
|||
|
})
|
|||
|
})
|
|||
|
|
|||
|
// 简单ping检查
|
|||
|
r.GET("/ping", func(c *gin.Context) {
|
|||
|
c.String(200, "pong")
|
|||
|
})
|
|||
|
|
|||
|
// 详细健康检查
|
|||
|
r.GET("/health/detailed", func(c *gin.Context) {
|
|||
|
health := gin.H{
|
|||
|
"status": "healthy",
|
|||
|
"timestamp": time.Now().Unix(),
|
|||
|
"checks": gin.H{
|
|||
|
"database": checkDatabase(),
|
|||
|
"redis": checkRedis(),
|
|||
|
"external_api": checkExternalAPI(),
|
|||
|
},
|
|||
|
}
|
|||
|
c.JSON(200, health)
|
|||
|
})
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### Docker 健康检查
|
|||
|
|
|||
|
Dockerfile 自动包含健康检查配置:
|
|||
|
|
|||
|
```dockerfile
|
|||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
|
|||
|
CMD curl -f http://localhost:8080/health || exit 1
|
|||
|
```
|
|||
|
|
|||
|
## 📈 性能优化
|
|||
|
|
|||
|
### 构建优化
|
|||
|
|
|||
|
1. **依赖缓存**:
|
|||
|
|
|||
|
```groovy
|
|||
|
// Go模块缓存
|
|||
|
go env GOCACHE
|
|||
|
go env GOMODCACHE
|
|||
|
```
|
|||
|
|
|||
|
2. **并行构建**:
|
|||
|
|
|||
|
```bash
|
|||
|
# 利用多核CPU
|
|||
|
go build -p $(nproc)
|
|||
|
```
|
|||
|
|
|||
|
3. **镜像优化**:
|
|||
|
|
|||
|
```dockerfile
|
|||
|
# 多阶段构建
|
|||
|
FROM golang:1.21-alpine AS builder
|
|||
|
# ... 构建阶段
|
|||
|
|
|||
|
FROM alpine:latest
|
|||
|
# ... 运行阶段
|
|||
|
```
|
|||
|
|
|||
|
### SonarQube 优化
|
|||
|
|
|||
|
已经在模板中集成的优化:
|
|||
|
|
|||
|
```groovy
|
|||
|
// 使用Jenkins管理的Scanner,避免重复下载
|
|||
|
def scannerHome = tool name: 'sonarQube'
|
|||
|
|
|||
|
// 优化扫描参数
|
|||
|
-Dsonar.exclusions=**/*_test.go,**/vendor/**
|
|||
|
-Dsonar.go.coverage.reportPaths=coverage.out
|
|||
|
```
|
|||
|
|
|||
|
性能提升结果:
|
|||
|
|
|||
|
- SonarQube 扫描:从 7 分 25 秒 → 11.3 秒 (94%提升)
|
|||
|
- 总构建时间:从 10 分钟 → 3 分 16 秒 (67%提升)
|
|||
|
|
|||
|
## 🔧 故障排除
|
|||
|
|
|||
|
### 常见问题
|
|||
|
|
|||
|
#### 1. Go 工具未找到
|
|||
|
|
|||
|
```bash
|
|||
|
错误: go: not found
|
|||
|
解决:
|
|||
|
1. 检查Jenkins全局工具配置中Go工具名称是否为'go'
|
|||
|
2. 确认Go工具已正确安装或配置自动安装
|
|||
|
3. 检查PATH环境变量
|
|||
|
```
|
|||
|
|
|||
|
#### 2. SonarQube 连接失败
|
|||
|
|
|||
|
```bash
|
|||
|
错误: Connection timeout to SonarQube
|
|||
|
解决:
|
|||
|
1. 检查SONAR_HOST_URL配置
|
|||
|
2. 验证SonarQube服务器状态
|
|||
|
3. 检查网络连接和防火墙规则
|
|||
|
4. 确认sonar-token凭据有效
|
|||
|
```
|
|||
|
|
|||
|
#### 3. Docker 镜像构建失败
|
|||
|
|
|||
|
```bash
|
|||
|
错误: Cannot connect to Docker daemon
|
|||
|
解决:
|
|||
|
1. 检查Docker服务状态:systemctl status docker
|
|||
|
2. 确认Jenkins用户在docker组:usermod -aG docker jenkins
|
|||
|
3. 重启Jenkins服务
|
|||
|
```
|
|||
|
|
|||
|
#### 4. SSH 部署失败
|
|||
|
|
|||
|
```bash
|
|||
|
错误: Permission denied (publickey)
|
|||
|
解决:
|
|||
|
1. 检查SSH Key格式和权限
|
|||
|
2. 验证服务器SSH配置
|
|||
|
3. 测试手动SSH连接
|
|||
|
4. 检查known_hosts文件
|
|||
|
```
|
|||
|
|
|||
|
#### 5. 健康检查失败
|
|||
|
|
|||
|
```bash
|
|||
|
错误: Health check failed
|
|||
|
解决:
|
|||
|
1. 检查应用启动日志:docker logs container-name
|
|||
|
2. 验证健康检查端点是否存在
|
|||
|
3. 检查端口映射配置
|
|||
|
4. 确认防火墙规则
|
|||
|
```
|
|||
|
|
|||
|
### 调试技巧
|
|||
|
|
|||
|
#### 1. 开启详细日志
|
|||
|
|
|||
|
```groovy
|
|||
|
// 在Jenkinsfile中添加
|
|||
|
sh 'go build -v .' // 详细构建日志
|
|||
|
sh 'docker build --progress=plain' // Docker构建详情
|
|||
|
```
|
|||
|
|
|||
|
#### 2. 本地测试
|
|||
|
|
|||
|
```bash
|
|||
|
# 本地运行Pipeline步骤
|
|||
|
go mod download
|
|||
|
go vet ./...
|
|||
|
go test ./...
|
|||
|
docker build -t test-image .
|
|||
|
docker run --rm test-image
|
|||
|
```
|
|||
|
|
|||
|
#### 3. 分阶段调试
|
|||
|
|
|||
|
```groovy
|
|||
|
// 临时禁用某些阶段
|
|||
|
when {
|
|||
|
expression { false } // 跳过此阶段
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 日志分析
|
|||
|
|
|||
|
#### 常见错误模式
|
|||
|
|
|||
|
1. **网络超时**:
|
|||
|
|
|||
|
```
|
|||
|
dial tcp: i/o timeout
|
|||
|
→ 检查网络连接和代理设置
|
|||
|
```
|
|||
|
|
|||
|
2. **权限问题**:
|
|||
|
|
|||
|
```
|
|||
|
permission denied
|
|||
|
→ 检查文件权限和用户权限
|
|||
|
```
|
|||
|
|
|||
|
3. **资源不足**:
|
|||
|
```
|
|||
|
cannot allocate memory
|
|||
|
→ 检查系统资源和Docker限制
|
|||
|
```
|
|||
|
|
|||
|
## 📝 最佳实践
|
|||
|
|
|||
|
### 1. 项目结构建议
|
|||
|
|
|||
|
```
|
|||
|
your-go-project/
|
|||
|
├── cmd/ # 主程序入口
|
|||
|
│ └── server/
|
|||
|
│ └── main.go
|
|||
|
├── internal/ # 私有代码
|
|||
|
│ ├── config/
|
|||
|
│ ├── handler/
|
|||
|
│ ├── service/
|
|||
|
│ └── model/
|
|||
|
├── pkg/ # 公共库
|
|||
|
├── test/ # 测试文件
|
|||
|
├── docs/ # 文档
|
|||
|
├── scripts/ # 脚本
|
|||
|
├── Dockerfile
|
|||
|
├── Jenkinsfile
|
|||
|
├── go.mod
|
|||
|
├── go.sum
|
|||
|
├── README.md
|
|||
|
└── .gitignore
|
|||
|
```
|
|||
|
|
|||
|
### 2. 代码质量标准
|
|||
|
|
|||
|
```bash
|
|||
|
# 代码格式化
|
|||
|
go fmt ./...
|
|||
|
goimports -w .
|
|||
|
|
|||
|
# 静态检查
|
|||
|
go vet ./...
|
|||
|
golint ./...
|
|||
|
golangci-lint run
|
|||
|
|
|||
|
# 测试覆盖率
|
|||
|
go test -cover ./...
|
|||
|
# 目标覆盖率:>= 70%
|
|||
|
```
|
|||
|
|
|||
|
### 3. Docker 最佳实践
|
|||
|
|
|||
|
```dockerfile
|
|||
|
# 使用多阶段构建
|
|||
|
FROM golang:1.21-alpine AS builder
|
|||
|
WORKDIR /build
|
|||
|
COPY go.mod go.sum ./
|
|||
|
RUN go mod download
|
|||
|
COPY . .
|
|||
|
RUN CGO_ENABLED=0 go build -ldflags="-w -s" -o app
|
|||
|
|
|||
|
FROM alpine:latest
|
|||
|
RUN apk --no-cache add ca-certificates tzdata
|
|||
|
WORKDIR /app
|
|||
|
COPY --from=builder /build/app .
|
|||
|
USER 1000
|
|||
|
EXPOSE 8080
|
|||
|
CMD ["./app"]
|
|||
|
```
|
|||
|
|
|||
|
### 4. 安全建议
|
|||
|
|
|||
|
```yaml
|
|||
|
安全配置:
|
|||
|
- 使用非root用户运行容器
|
|||
|
- 定期更新基础镜像
|
|||
|
- 扫描依赖漏洞
|
|||
|
- 配置资源限制
|
|||
|
- 使用安全的镜像仓库
|
|||
|
- 定期轮换访问密钥
|
|||
|
```
|
|||
|
|
|||
|
### 5. 监控和告警
|
|||
|
|
|||
|
```groovy
|
|||
|
// 在Pipeline中集成通知
|
|||
|
post {
|
|||
|
success {
|
|||
|
slackSend(color: 'good', message: "✅ ${PROJECT_NAME} 部署成功")
|
|||
|
}
|
|||
|
failure {
|
|||
|
emailext(
|
|||
|
subject: "❌ ${PROJECT_NAME} 构建失败",
|
|||
|
body: "构建失败,请检查: ${BUILD_URL}"
|
|||
|
)
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 🔄 模板更新
|
|||
|
|
|||
|
### 版本管理
|
|||
|
|
|||
|
建议在项目中创建模板版本管理:
|
|||
|
|
|||
|
```bash
|
|||
|
# 创建模板版本目录
|
|||
|
mkdir -p .jenkins/templates/
|
|||
|
cp Jenkinsfile.go-template .jenkins/templates/v1.0.0
|
|||
|
|
|||
|
# 使用Git标签管理版本
|
|||
|
git tag -a jenkins-template-v1.0.0 -m "Jenkins template v1.0.0"
|
|||
|
```
|
|||
|
|
|||
|
### 更新流程
|
|||
|
|
|||
|
1. **备份当前版本**
|
|||
|
2. **测试新模板**
|
|||
|
3. **逐步部署**
|
|||
|
4. **验证结果**
|
|||
|
5. **文档更新**
|
|||
|
|
|||
|
## 📚 扩展阅读
|
|||
|
|
|||
|
- [Go 官方文档](https://golang.org/doc/)
|
|||
|
- [Jenkins Pipeline 文档](https://www.jenkins.io/doc/book/pipeline/)
|
|||
|
- [SonarQube Go 插件](https://docs.sonarqube.org/latest/analysis/languages/go/)
|
|||
|
- [Docker 最佳实践](https://docs.docker.com/develop/dev-best-practices/)
|
|||
|
|
|||
|
## 🤝 支持
|
|||
|
|
|||
|
如果在使用过程中遇到问题:
|
|||
|
|
|||
|
1. 查看本文档的故障排除部分
|
|||
|
2. 检查 Jenkins 构建日志
|
|||
|
3. 参考相关工具的官方文档
|
|||
|
4. 在团队内部寻求技术支持
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
**📝 文档版本**: v1.0.0
|
|||
|
**🕒 更新时间**: 2024 年 12 月
|
|||
|
**👥 维护团队**: DevOps 团队
|
|||
|
|
|||
|
这个模板基于实际生产环境的成功实践,经过充分测试和优化。使用时请根据具体项目需求进行调整。
|