我如何使用 Git for-each-ref 命令进行 DevOps

搜索和过滤分支和标签,以获取有用的信息或实践 DevOps。
2 位读者喜欢这篇文章。
Coding on a computer

对于当今大多数开发人员来说,使用 Git 就像呼吸一样,没有它就无法生存。 除了版本控制之外,Git 的使用近年来甚至扩展到了 GitOps 领域,即通过 Git 管理和版本控制配置。 很多用户没有意识到或者考虑的是,Git 不仅跟踪每次提交的文件更改,还跟踪围绕提交和分支的大量元数据。 您的 DevOps 可以利用这些数据,或者使用软件开发最佳实践(例如使用 CI/CD)来自动化 IT 运维。

就我而言,我使用一个自动化流程(DevOps),每次我将镜像提升到 Kubernetes 中的下游 CI/CD 环境(命名空间)时,都会创建一个新分支(这里是我 Opensource.com 文章 的一个无耻的宣传,描述了该过程)。 这使我可以独立于其他环境修改下游 CI/CD 环境中特定部署的部署描述符,并使我能够对这些更改进行版本控制(GitOps)。

我将讨论一个典型的场景,即在 QA 中发现了一个破坏性错误,没有人确定是哪个构建引入的。 我不能也不想依靠镜像元数据来查找 Git 中保存正确部署描述符的分支,原因有很多,尤其是考虑到我可能需要搜索一个本地仓库或多个远程镜像。 那么,如何轻松地利用 Git 仓库中的信息来找到我正在寻找的东西?

使用 for-each-ref 命令

这个场景是 for-each-ref 命令真正有用武之地的地方。 它允许我搜索所有 Git 仓库的分支,通过我使用的命名约定进行过滤(强制在创建分支时使用命名约定是一个好理由),并按降序返回最近修改的分支。 例如

$ git clone git@github.com:elcicd/Test-CICD1.git
$ cd Test-CICD1
$ git for-each-ref --format='%(refname:short) (%(committerdate))' \
                   --sort='-committerdate' \
                   'refs/remotes/**/deployment-qa-*'
origin/deployment-qa-c6e94a5 (Wed May 12 19:40:46 2021 -0500)
origin/deployment-qa-b70b438 (Fri Apr 23 15:42:30 2021 -0500)
origin/deployment-qa-347fc1d (Thu Apr 15 17:11:25 2021 -0500)
origin/deployment-qa-c1df9dd (Wed Apr 7 11:10:32 2021 -0500)
origin/deployment-qa-260f8f1 (Tue Apr 6 15:50:05 2021 -0500)

上面的命令克隆了一个我经常用来测试 Kubernetes 部署的仓库。 然后,我使用 git for-each-ref 按上次提交的日期搜索分支,将搜索范围限制在与 QA 环境的部署分支命名约定匹配的分支,并返回最近的五个分支。 这些大致(即不一定,但足够接近)对应于我要重新部署的组件/微服务的最后五个版本。

deployment-qa-* 基于以下命名约定

<描述性前缀>-<部署环境>-<开发分支提交哈希>

运行 CI/CD 重新部署管道时,开发人员或 QA 人员可以使用返回的信息来决定在 Kubernetes 命名空间中回滚/前进到哪个版本,从而最终返回到已知良好的状态。 在人为设计的场景中,此过程缩小了何时以及什么引入了破坏性错误。

虽然上面的命名约定和场景特别适合需求和自动化 CI/CD 流程,但还有其他更通用的方法来使用 for-each-ref。 许多组织都有类似于以下内容的分支命名约定

<版本>-<功能或错误>-<功能或错误 ID>

ID 值是指在项目管理系统(如 Rally 或 Jira)中描述功能或错误的 ID; 例如

v1.23-feature-12345

取决于开发过程和分支命名约定策略,此 ID 允许用户轻松快速地了解仓库和项目的更广泛的开发历史记录(使用 refs/remotes/**/v.123-feature-*)。 此过程也适用于标签,因此几乎可以轻松地列出最新的预生产、生产或其他特定版本(并非所有标签都默认拉取)。

总结

这些只是使用 for-each-ref 的特定和狭隘的示例。 从作者到提交消息,官方文档 提供了对可以搜索、过滤和报告的许多细节的深入了解。

标签
Evan "Hippy" Slatis
我在 Red Hat 服务部门担任顾问,专门从事 OpenShift 上的应用程序部署和 CI/CD,并且我运行自己的 OSS 项目 el-CICD(https://github.com/elcicd),这是一个完整的 CICD COTS 解决方案,适用于 OKD/OpenShift 容器平台。 我是多家初创公司的老手,并且我已经从事软件开发人员/架构师工作,主要使用 Java,已经将近 30 年了。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.