Gitflow branch与Docker image tag命名冲突怎么办?
谷歌还是比必应要好用一点。
在前公司,我根据主流的git flow 给团队搭建了一套devops流程,运行在 docker & k8s上。
在现代devops流程中,一般推荐使用git分支名或者git tag作为镜像的tag名。
在实际操作中, 我遇到了一个流程阻塞。
根据git flow的规范,我们一般会打出feature/xxx,fix/issue234,release/x.x.x 这样的分支名, 当然我们还会产生x.y.z 这样的git tag名。
但是docker build -t
产生镜像tag的规定,除了-,_,.
镜像tag不允许使用其他特殊字符
A tag name must be valid ASCII and may contain lowercase and uppercase letters, digits, underscores, periods and dashes. A tag name may not start with a period or a dash and may contain a maximum of 128 characters
我当时是让团队小伙伴不要打出含有 /
的分支名, 如上图中所示的release-1.0.0
等,但是我始终觉得不是一个常规操作,因为这破坏了一以贯之的git flow命名规范,而且需要在团队内做技术性约束。
当git flow分支命名与docker image tag分支有冲突,该怎么办?
面向谷歌编程,面向Stackoverflow编程啊。
策略1: 脚本手动替换
在Gitlab-ci中,我们使用:
docker build . -t image_name:$( echo $CI_COMMIT_REF_NAME | sed 's/[^a-zA-Z0-9]/-/g')
release/v1.0.0 会被转换为 release-v1-0-1
unix pipe: 不依靠临时文件的情况下,将前者应用程序的输出作为后者应用程序的输入。
sed命令一般用于替换 文件中的字符: s: substitution 操作; /:分隔符,将前者为后者; 默认情况下 sed s替换每行第一个匹配的字符串,这里我们使用/g表示全局替换。
CI_COMMIT_REF_NAME
: The branch or tag name for which project is built.
策略2: gitlab-ci内置变量CI_COMMIT_REF_SLUG
CI_COMMIT_REF_SLUG
:CI_COMMIT_REF_NAME in lowercase, shortened to 63 bytes, and with everything except 0-9 and a-z replaced with -. No leading / trailing -. Use in URLs, host names and domain names.
很明显,CI_COMMIT_REF_SLUG是正解,后续在devops中针对git branch/git tag 可采用此ci变量。
本文基本没啥技能点, 单纯记录在Devops路上的一个小插曲,前人栽树后人乘凉;
顺便表明一个态度,希望在流畅、自然的开发流程上深耕。
后续大家有意的话,可以结合 《基于容器和K8s的 Devops 探索和落地实践》 了解一个常规/有效/可落地的Devops流程。
引用链接
[1] Stackoverflow: https://stackoverflow.com/questions/62905914/turning-a-git-branch-name-into-a-valid-docker-image-tag
[2] CI_COMMIT_REF_SLUG: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
[3] 基于容器和K8s的 Devops 探索和落地实践: https://www.cnblogs.com/JulianHuang/p/13676065.html
本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/15469639.html
欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?