diff --git a/Jenkinsfile b/Jenkinsfile index 13adb3a..de1539e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,9 @@ pipeline { timestamps() } - + tools { + go 'go' // 使用Jenkins手动配置的Go工具 + } environment { // 目标服务器配置 @@ -49,12 +51,15 @@ pipeline { echo '🔍 检查构建环境...' script { sh ''' + echo "=== Go版本 ===" + go version + + echo "=== Go环境信息 ===" + go env + echo "=== Docker版本 ===" docker --version - echo "=== Go版本(Docker中) ===" - docker run --rm golang:1.21-alpine go version - echo "=== 工作目录 ===" pwd && ls -la ''' @@ -68,64 +73,14 @@ pipeline { steps { echo '📦 下载Go依赖...' sh ''' - echo "工作空间路径: ${WORKSPACE}" - echo "检查go.mod文件存在性:" - ls -la go.mod go.sum + echo "下载依赖..." + go mod download - echo "使用Docker容器管理Go依赖..." - echo "测试Docker挂载是否正常:" - docker run --rm -v "${WORKSPACE}":/workspace -w /workspace golang:1.21-alpine sh -c " - echo '容器内工作目录:' - pwd - echo '容器内文件列表:' - ls -la - echo '检查go.mod文件:' - ls -la go.mod go.sum || echo 'go.mod文件未找到' - " + echo "验证依赖..." + go mod verify - echo "开始Go依赖管理..." - - # 如果直接挂载有问题,使用复制文件的方式 - if docker run --rm -v "${WORKSPACE}":/workspace -w /workspace golang:1.21-alpine test -f go.mod; then - echo "✅ 直接挂载方式可用" - docker run --rm -v "${WORKSPACE}":/workspace -w /workspace golang:1.21-alpine sh -c " - echo '下载依赖...' - go mod download - - echo '验证依赖...' - go mod verify - - echo '整理依赖...' - go mod tidy - " - else - echo "⚠️ 直接挂载失败,使用容器复制方式" - - # 创建临时容器并复制文件(设置正确的工作目录) - CONTAINER_ID=$(docker create -w /app golang:1.21-alpine sh -c " - echo '下载依赖...' - go mod download - - echo '验证依赖...' - go mod verify - - echo '整理依赖...' - go mod tidy - ") - - # 复制所有文件到容器的/app目录 - docker cp . $CONTAINER_ID:/app - - # 启动容器执行Go命令 - docker start -a $CONTAINER_ID - - # 复制结果文件回来 - docker cp $CONTAINER_ID:/app/go.mod . || true - docker cp $CONTAINER_ID:/app/go.sum . || true - - # 清理容器 - docker rm $CONTAINER_ID - fi + echo "整理依赖..." + go mod tidy echo "✅ 依赖管理完成" ''' @@ -136,30 +91,15 @@ pipeline { steps { echo '🔍 运行Go代码检查...' sh ''' - echo "使用Docker容器进行代码检查..." + echo "运行go vet..." + go vet ./... - # 创建容器并设置工作目录 - CONTAINER_ID=$(docker create -w /app golang:1.21-alpine sh -c " - echo '运行go vet...' - go vet ./... - - echo '运行go fmt检查...' - UNFORMATTED=\$(gofmt -l . 2>/dev/null || true) - if [ -n \"\$UNFORMATTED\" ]; then - echo '❌ 代码格式不正确,需要运行 go fmt' - echo \$UNFORMATTED - exit 1 - fi - ") - - # 复制文件到容器 - docker cp . $CONTAINER_ID:/app - - # 执行代码检查 - docker start -a $CONTAINER_ID - - # 清理容器 - docker rm $CONTAINER_ID + echo "运行go fmt检查..." + if [ "$(gofmt -l . | wc -l)" -gt 0 ]; then + echo "❌ 代码格式不正确,需要运行 go fmt" + gofmt -l . + exit 1 + fi echo "✅ 代码检查通过" ''' @@ -170,35 +110,14 @@ pipeline { steps { echo '🧪 运行单元测试...' sh ''' - echo "使用Docker容器运行测试..." + echo "运行测试并生成覆盖率报告..." + go test -v -race -coverprofile=coverage.out -covermode=atomic ./... - # 创建容器并设置工作目录 - CONTAINER_ID=$(docker create -w /app golang:1.21-alpine sh -c " - echo '运行测试并生成覆盖率报告...' - go test -v -race -coverprofile=coverage.out -covermode=atomic ./... || echo '测试执行完成(可能有测试失败)' - - echo '生成HTML覆盖率报告...' - if [ -f coverage.out ]; then - go tool cover -html=coverage.out -o coverage.html - echo '显示覆盖率统计...' - go tool cover -func=coverage.out - else - echo '⚠️ coverage.out文件不存在,跳过覆盖率报告生成' - fi - ") + echo "生成HTML覆盖率报告..." + go tool cover -html=coverage.out -o coverage.html - # 复制文件到容器 - docker cp . $CONTAINER_ID:/app - - # 执行测试 - docker start -a $CONTAINER_ID - - # 复制测试结果文件回来 - docker cp $CONTAINER_ID:/app/coverage.out . || true - docker cp $CONTAINER_ID:/app/coverage.html . || true - - # 清理容器 - docker rm $CONTAINER_ID + echo "显示覆盖率统计..." + go tool cover -func=coverage.out ''' } post { @@ -262,30 +181,10 @@ EOF steps { echo '🔨 编译Go应用程序...' sh ''' - echo "使用Docker容器编译Go应用..." - - # 创建容器并设置工作目录 - CONTAINER_ID=$(docker create -w /app golang:1.21-alpine sh -c " - echo '开始编译...' - CGO_ENABLED=0 GOOS=linux go build \\ - -ldflags='-w -s -X main.gitCommit=${GIT_COMMIT_SHORT}' \\ - -o golang-demo . - - echo '设置二进制文件权限...' - chmod +x golang-demo - ") - - # 复制文件到容器 - docker cp . $CONTAINER_ID:/app - - # 执行编译 - docker start -a $CONTAINER_ID - - # 复制编译结果回来 - docker cp $CONTAINER_ID:/app/golang-demo . - - # 清理容器 - docker rm $CONTAINER_ID + echo "开始编译..." + CGO_ENABLED=0 GOOS=linux go build \\ + -ldflags="-w -s -X main.gitCommit=${GIT_COMMIT_SHORT}" \\ + -o golang-demo . echo "验证二进制文件..." ls -lh golang-demo