You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过GitLab提交自动更新Helm Chart的镜像标签?

GitLab CI自动更新Helm Chart镜像标签及仓库结构最佳实践

一、用GitLab CI处理镜像标签更新(两种方案)

方案1:部署时动态传入标签(推荐,无无效提交)

不用修改chart/values.yaml文件,直接在Helm部署命令中通过参数覆盖镜像标签,完全避免额外提交操作:

  1. 在GitLab CI流水线的部署阶段添加如下Job:
deploy:
  stage: deploy
  image: alpine/helm:latest
  script:
    # 假设你的Chart在chart/目录,发布到目标K8s集群
    - helm upgrade --install my-service ./chart --set image.tag=$CI_COMMIT_SHORT_SHA
  only:
    - main # 仅在主分支触发部署

这里$CI_COMMIT_SHORT_SHA是GitLab内置变量,直接取当前提交的短SHA值,无需额外处理。

方案2:修改Values文件并提交(适合需同步Chart仓库的场景)

如果必须将更新后的image_tag写入values.yaml并提交到仓库(比如需要把Chart推送到公共Helm仓库),可以用yq工具修改文件,再通过CI权限提交:

  1. 准备CI权限:在项目设置中创建Deploy Token,勾选read_repository和write_repository权限,然后在CI/CD变量中添加DEPLOY_TOKEN_USERNAME和DEPLOY_TOKEN_PASSWORD。
  2. 编写CI Job:
update-chart-tag:
  stage: post-build
  image: mikefarah/yq:latest # 自带yq和git的镜像
  script:
    # 修改values.yaml里的image.tag字段
    - yq eval '.image.tag = "'$CI_COMMIT_SHORT_SHA'"' -i ./chart/values.yaml
    # 配置Git身份
    - git config --global user.name "GitLab CI/CD"
    - git config --global user.email "ci@gitlab.example.com"
    # 提交并推送变更
    - git add ./chart/values.yaml
    - git commit -m "chore(chart): update image tag to $CI_COMMIT_SHORT_SHA"
    - git push https://$DEPLOY_TOKEN_USERNAME:$DEPLOY_TOKEN_PASSWORD@$CI_REPOSITORY_URL HEAD:$CI_COMMIT_BRANCH
  only:
    - main

注意:这种方式会产生额外提交,建议仅在必要场景使用,比如Chart需要独立版本化对外发布时。

二、Chart与源代码同仓是否为最佳实践?

没有绝对的标准答案,取决于团队规模和业务场景:

  • 同仓优势:
    • 代码与Chart版本强绑定,每次代码变更对应的镜像标签和配置可直接追溯,排查问题更高效。
    • 流水线配置简单,无需跨仓库拉取Chart,减少依赖环节。
    • 适合小型团队、单个服务的项目。
  • 分仓优势:
    • Chart可独立进行版本管理,适合多服务共用同一套Chart模板的场景(比如微服务集群的通用部署模板)。
    • 可单独维护Chart团队,与业务代码开发解耦。
    • 适合大型团队、多服务共享Chart的项目。

三、避免无效提交的优化方案

如果不想因更新镜像标签产生大量无意义提交,优先选择方案1(部署时动态传参),另外还有两种思路:

  • 用Chart模板变量替代硬编码:在Chart的templates文件中直接引用变量,比如在Deployment.yaml中写image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }},部署时通过--set image.tag=$CI_COMMIT_SHORT_SHA传入标签,或把AppVersion设为SHA值。
  • 仅在发布分支更新Chart:不在开发分支修改Values,而是当代码合并到主分支后,触发单独的发布流程,将Chart打包推送到Helm仓库,同时把镜像标签作为Chart版本的一部分(比如Chart版本设为1.0.$CI_PIPELINE_ID,镜像标签用SHA),无需修改仓库内的Values文件。

内容的提问来源于stack exchange,提问作者PhilosopherRemote177

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:17:19