詹金斯管道的 GIT 交叉签出和依赖项检查

Posted

技术标签:

【中文标题】詹金斯管道的 GIT 交叉签出和依赖项检查【英文标题】:GIT cross checkout and dependency check for jenkins pipeline 【发布时间】:2020-09-10 22:40:42 【问题描述】:

我有以下 git 项目结构:

MAIN_PRJ
  SUB_MODULE1
  SUB_MODULE2
     SUB_MODULE2_1
  SUB_MODULE3
     SUB_MODULE3_1
         SUBMODULE_3_1_1

作为我的詹金斯作业触发器的一部分,传递的触发器消息包含窗帘子模块的获取命令,作为字符串传递。例如:

git fetch https://git.server/SUB_MODULE1 hash_commit;git fetch https://git.server/SUB_MODULE2_1 hash_commit;git fetch https://git.server/SUB_MODULE3_1_1 hash_commit

我们使用它们进行交叉依赖检查。 我正在寻找一种方法来递归地进行所有这些“获取”。

方向之一——

    运行git submodule foreach --recursive 'git remote -v'command

    从中获取遥控器

    比较远程路径和获取路径

    如果为真则执行获取命令

git remote -v 命令返回 fetch 和 push 的来源,有没有办法只获取其中一个?有没有办法将此远程值存储为参数?递归运行期间的路径存储为 pwd 参数。

在我看来,它会是这样的:

foreach fetch_remote in fetchlist:
    git submodule foreach --recursive 'git remote -v;if [$origin==$fetch_remote] then fetch_command fi' 

还有其他想法吗?

更新: 到目前为止,我设法结合了以下部分有效的命令:

foreach fetch_remote in fetchlist:
   git submodule foreach --recursive 'sub_remote=$(git remote get-url origin);if[$sub_remote==$fetch_remote];then $fetch_command; fi'

但我收到一个错误,为了解释,假设 fetch_remote="http://git_remote/SUB_MODULE2_1"

/usr/lib/git-core/git-submodule: 1: eval: [http://git_remote/SUB_MODULE2_1==http://git_remote/SUB_MODULE2_1]: not found

【问题讨论】:

试试空格和单个=:if [ $origin = $fetch_remote ]; then 试过这个:' git submodule foreach --recursive 'sub_remote=$(git remote get-url origin);if [ $sub_remote=$fetch_remote ];then $fetch_command; fi' ' 但是现在总是打印 YES - 避免 if 条件 【参考方案1】:

找到适合我的解决方案:

foreach fetch_remote in fetchlist:
    git submodule foreach --recursive 'if [ "$(git remote get-url origin)"  = "$fetch_remote" ]; then fetch_command; fi'

【讨论】:

以上是关于詹金斯管道的 GIT 交叉签出和依赖项检查的主要内容,如果未能解决你的问题,请参考以下文章

如何在詹金斯管道中访问 git commit 消息 INSIDE sh STEP?

使用 Jenkins 管道将多个 git 存储库签出到同一个作业中

如何相对于子目录运行詹金斯管道?

如何在另一个詹金斯管道B中调用詹金斯管道A

如何使用管道代码覆盖默认的 Jenkins Git 插件检出?

詹金斯管道:代理与节点?