基于 Gitlab 实现 Go 的 CI/CD

# 定义流水线的几个阶段
stages:
  - lint
  - test
  - build
  - docker
  - deploy

# 定义所有 job 的默认环境变量
variables:
  GO111MODULE: "on"
  CGO_ENABLED: "0"
  GOPROXY: "https://goproxy.cn,direct"

# 缓存设置,以免每次都重新拉取镜像和第三方库
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - go/pkg/mod        # go mod 缓存目录
    - go/bin            # go install 的工具目录
    - .cache/go-build   # go build 缓存目录

# 代码静态检查
lint:                   # 这是 job 的名字(随便起,但最好能看懂)
  stage: lint           # 声明它属于 lint 阶段
  image: golang:latest  # 使用官方 Go 镜像,保证环境一致
  script:               # job 内真正执行的命令
    # 安装最新的 golangci-lint 工具
    - go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
    # 检查整个项目代码
    - golangci-lint run ./...

# 代码测试
test:
  stage: test
  tags: [shell]
  image: golang:1.23
  script:
    # 测试所有包,并输出覆盖率,可以加 -race 选项检查并发问题,可以保存 coverage.out 作为 artifact,生成覆盖率报告
    - go test ./... -cover

# 代码构建
# 提示:这一步和 docker 阶段分离,是为了方便调试(不必每次都打镜像
build:
  stage: build
  tags: [docker]
  image: golang:1.23
  script:
    # 编译入口文件,生成二进制
    - go build -o bin/app ./cmd/main.go
  # 指定要保存的产物
  artifacts:
    paths:
      # bin/app 上传到 GitLab 的 artifact 系统,供后续 job 使用或下载
      - bin/app

# 构建 docker 镜像,并将其推送到指定路径下
# 提示:需要在 CI/CD 设置里配置 Registry 的登录凭证(CI_REGISTRY_USER、CI_REGISTRY_PASSWORD)
# 提示:如果嫌 DinD 慢,可以用 kaniko 或 buildah 作为无特权构建器
docker:
  stage: docker
  image: docker:latest          # 使用官方 Docker 镜像作为 runner 环境
  services:
    # 启用 Docker in Docker,让 CI job 能执行 docker build/push
    - docker:dind
  script:
    # 构建镜像,打标签为 registry.gitlab.com/yourgroup/yourproject:$CI_COMMIT_SHORT_SHA
    # $CI_COMMIT_SHORT_SHA 是 GitLab 内置变量,表示当前提交的短 hash(保证镜像唯一性)
    - docker build -t registry.gitlab.com/yourgroup/yourproject:$CI_COMMIT_SHORT_SHA .
    # 推送镜像到 GitLab Registry
    - docker push registry.gitlab.com/yourgroup/yourproject:$CI_COMMIT_SHORT_SHA

# 部署应用到开发、测试、生产环境
# 需要提前在 CI/CD 设置里配置好 SSH Key,否则无法远程部署
# 如果要多环境部署,可以加 environment: staging、environment: dev
deploy:
  stage: deploy
  # 这个 job 不会自动执行,必须手动点击运行(避免误上线)
  when: manual
  script:
    # 通过 ssh 登录到目标服务器,拉取新镜像并更新服务(这里用 docker-compose up -d 管理容器)
    - ssh user@server "docker pull registry.gitlab.com/yourgroup/yourproject:$CI_COMMIT_SHORT_SHA && docker-compose up -d"
  environment:
    # 定义环境名,在 GitLab UI 里会展示
    name: production # dev/test/pro
    # 点击环境名可以跳转到你的线上地址
    url: https://yourdomain.com

# 总结:
# 这个 .gitlab-ci.yml 实际上体现了完整的 Go 项目 CI/CD 流程
# 1、Lint → 代码质量
# 2、Test → 自动化验证
# 3、Build → 编译产物
# 4、Docker → 制作镜像并上传
# 5、Deploy → 手动上线

posted @ 2025-09-12 18:56  江南烟雨梦  阅读(31)  评论(0)    收藏  举报