本文转载自微信公众号《精益码农》,作者有态度。转载本文请联系精益码农公众号。在之前的公司,我为团队搭建了一个基于主流git流程的devops流程,跑在docker&k8s上。在现代devops流程中,一般推荐使用git分支名或者gittag作为镜像的标签名。在实际运行中,遇到了进程阻塞。根据gitflow的规范,我们一般会打出feature/xxx、fix/issue234、release/x.x.x这样的分支名,当然也会生成x.y.z这样的git标签名。但是dockerbuild-t生成镜像标签规定,除了-,_,。镜像标签不允许有其他特殊字符。标记名称必须是有效的ASCII,并且可以包含小写和大写字母、数字、下划线、句点和破折号。标记名称不能以句点或破折号开头,最多可包含128个字符。当时让组员不要打包含/的分支名,改用其他的,比如上图release-1.0.0等,但总觉得不是常规操作,因为它打破了一致的gitflow命名约定,并且需要团队内部的技术约束。gitflow分支的命名和dockerimagetag分支的命名冲突怎么办?为谷歌编程,为Stackoverflow编程[1]。01脚本替换Gitlab-ci过程中,我们使用shell脚本替换特殊字符:dockerbuild.-timage_name:$CI_COMMIT_REF_NAME|sed's/[^a-zA-Z0-9]/-/g')CI_COMMIT_REF_NAME:Thebranchortagnameforwhichprojectisbuilt.02gitlab-cibuilt-invariableCI_COMMIT_REF_SLUG可能Gitlab-ci早就关注这个问题了,在9.0中给出了一个CI_COMMIT_REF_SLUG变量。CI_COMMIT_REF_SLUG:小写的CI_COMMIT_REF_NAME,缩短为63字节,除0-9anda-z之外的所有内容都替换为-.Noleading/trailing-.UseinURLs、hostnamesanddomainnames。显然,CI_COMMIT_REF_SLUG[2]是最优方案,完美避免了gitflowbranchimage和tagflow的命名冲突。这篇文章基本没有什么技巧点,只是在DevOps路上记录的一个小插曲。前人栽树,后人乘凉;顺便表达一种态度,希望在顺畅自然的发展过程中修炼。后续有兴趣的可以结合《基于容器和K8s的 Devops 探索和落地实践》了解一个正规/有效/可落地的DevOps流程。
