GCP多服务Git Monorepo自动化CI/CD独立部署方案咨询
GCP Monorepo 独立服务自动化CI/CD落地方案
核心实现逻辑
基于GitHub Actions实现流水线,通过路径变更匹配实现服务独立触发构建,完全兼容现有GCP Container Registry环境,可直接替换现有手动构建发布流程。
前置准备
- 在GitHub仓库的Secrets配置项中存入GCP服务账号JSON密钥,命名为
GCP_SA_KEY,确保该服务账号拥有GCR镜像推送权限、对应生产环境(Cloud Run/GKE/其他GCP计算服务)的部署权限 - 检查三个服务的dockerfile配置,确认COPY shared_module的相对路径写法正确,避免构建时找不到公共依赖
流水线配置细节
流水线配置文件存放在仓库的.github/workflows/gcp-auto-deploy.yml路径下,核心规则如下:
- 触发逻辑按路径匹配,仅当服务自身目录、公共模块
shared_module目录、流水线配置文件本身发生变更时,才触发对应服务的构建发布流程,无变更的服务不会重复构建- Service 1 触发匹配路径:
Service 1/**、shared_module/**、.github/workflows/** - Service 2 触发匹配路径:
Service 2/**、shared_module/**、.github/workflows/** - Service 3 触发匹配路径:
Service 3/**、shared_module/**、.github/workflows/**
- Service 1 触发匹配路径:
- 每个服务的构建发布流程统一分为6步:
- 拉取仓库全量代码,用于路径变更判断和构建
- 完成GCP鉴权,登录GCR镜像仓库,执行命令参考:
echo "${{ secrets.GCP_SA_KEY }}" | docker login -u _json_key --password-stdin https://gcr.io - 进入对应服务目录执行单元测试,测试不通过直接中断流程,禁止发布
- 构建docker镜像,必须将构建上下文设置为仓库根目录,否则无法读取shared_module公共代码;镜像标签使用Git提交短SHA+构建时间戳命名,不要固定使用latest,方便后续版本回滚
- 将构建完成的镜像推送到GCR对应仓库
- 调用GCP对应服务的更新接口,将生产环境的服务镜像替换为刚推送的新版本
常见坑点提醒
- 不要将单服务的docker构建上下文设置为服务自身目录,否则构建时COPY shared_module会直接报路径不存在错误
- shared_module目录发生变更时,三个服务会同时触发重建,这个是预期行为,避免公共模块更新后各服务依赖版本不一致
- 建议给流水线增加手动触发入口,方便需要强制重发版本时不用额外提交空提交触发流程
- 可以在流程最后加版本通知逻辑,把发布的服务名、对应代码提交、镜像地址推送到团队内部通知渠道,方便全员知晓发版情况
核心流水线片段参考:
name: GCP Auto Deploy on: push: branches: [ main ] paths: - 'Service 1/**' - 'Service 2/**' - 'Service 3/**' - 'shared_module/**' - '.github/workflows/**' workflow_dispatch: # 支持手动触发 jobs: deploy-service1: runs-on: ubuntu-latest if: | contains(github.event.head_commit.modified, 'Service 1/') || contains(github.event.head_commit.modified, 'shared_module/') steps: - uses: actions/checkout@v4 - name: Login GCR run: echo "${{ secrets.GCP_SA_KEY }}" | docker login -u _json_key --password-stdin https://gcr.io - name: Run test run: cd "Service 1" && pip install -r requirements.txt && pytest test_main.py - name: Build and push image run: | GIT_SHA=$(git rev-parse --short HEAD) IMAGE_TAG=gcr.io/替换为自己的GCP项目ID/service1:${GIT_SHA}-$(date +%Y%m%d%H%M) docker build -t $IMAGE_TAG -f "Service 1/dockerfile" . # 最后的.代表根目录构建上下文,不能修改 docker push $IMAGE_TAG - name: Deploy to production run: gcloud run deploy service1 --image $IMAGE_TAG --region 替换为实际部署区域 # 按实际使用的GCP服务调整部署命令 # Service2、Service3的job配置和上述逻辑一致,替换对应路径、镜像名、服务名即可
内容的提问来源于stack exchange,提问作者helloWorld
相关产品推荐
相关产品推荐

