【问题标题】:Jenkins pipelines: How to use them with Git, especially with multiple Git repos?Jenkins 管道:如何将它们与 Git 一起使用,尤其是与多个 Git 存储库一起使用?
【发布时间】:2018-04-01 23:38:12
【问题描述】:

情况……

我有几个 Git 存储库,这些都是我的构建所必需的。我正在积极开发其中的代码,而其他的则包含我使用的库代码。由于每个 repo 都是独立的,当然它们都有不同的分支名称。

对于我的 Jenkins 构建,我想从每个 repo 中获取相关版本的代码,将它们放在正确的子目录中,然后构建我的项目。理想情况下,我还应该能够进行浅层克隆(因为其中一个存储库很大),并且能够仅对我想要的路径进行稀疏检查。

Multiple SCMs plugin 似乎是完成这项工作的理想工具。但是它还没有处于积极的开发中,而且我已经看到它抛出了其他人谈论过的断言。

我已经看到this question 回答了如何使用 Jenkins 流水线来执行此操作,因此我调查了 Jenkins 流水线。我很快从Git Pipeline documentation 中发现,它对 Git 的支持可以最仁慈地描述为“最小”,这对于 Pipeline 概念的其余部分同样适用。 (那是在我们进入噩梦之前,它正在用纯文本界面替换一个完美可行的 UI。维护的噩梦,很多吗?呃!)

我还可以设置 Git 子项目。我宁愿不必走这条路来解决最新版本 Jenkins 的不足之处,但如果这是唯一的解决方案,则必须这样做。

我会说除了 Jenkins 之外的解决方案并不是一个真正的选择,因为我们公司已经使用 Jenkins 有一段时间了,我们真的不想设置其他东西。

【问题讨论】:

    标签: git jenkins jenkins-pipeline


    【解决方案1】:

    我认为 Pipeline 中的 git 支持一点也不缺。至少现在没有了。并且管道非常强大。当然不是最小的。也许您正在查看旧文档。声明式管道可能仍被认为有点不成熟,但仍然非常强大和简单,通常是我的默认选择,除非我需要更疯狂一点。

    您为git 构建步骤发布的文档只是checkout scm 步骤的包装,可用于非常简单的git 操作。这当然不是在 Jenkins 中使用 git 的可用选项的范围。

    特别是,我有一个监视 git 存储库的多分支管道作业。当检测到更改时,repo 被拉下,然后我将另一个 repo 的稀疏签出下拉到子目录中,然后将另一个完整的 repo 拉到另一个目录中。我运行一些构建脚本。压缩一些东西,部署 zip 文件,然后运行一些远程 ssh 进程来处理远程服务器上的包。

    在声明式管道中,我这样做是为了进行稀疏结帐:

    dir("package/infra") {
        deleteDir()  //start with a clean directory
    
        checkout([$class: 'GitSCM', 
          branches: [[name: '*/master']],
          extensions: [[$class: 'SparseCheckoutPaths', sparseCheckoutPaths: [[path: "my/path/here"]]]],
          userRemoteConfigs: [[credentialsId: 'asdf-fdsa-werw5-asjksadf-wlfjsdf', url: 'git@github.com:ABC/DEF.git']]
        ])
    
    }
    

    你也可以做浅克隆,以及各种复杂的 git 行为。

    为您的库进行第二次构建可能会更好,并将构建的工件存储在工件中,或者只是将它们存档在 Jenkins 中。然后从 artifactory 中引入 artifacts 或使用 copy Artifacts 插件。把他们从另一份工作中带出来。但每种情况都不同。

    【讨论】:

    • 谢谢罗伯。所以问题不在于插件能做什么,而在于文档。 :/那我会继续挖掘。
    • 注意在调用稀疏检出之前删除目录会导致git报告git read-tree -mu HEAD" returned status code 128: stdout: stderr: fatal: Not a valid object name HEAD。这并没有破坏我的构建。 This answer 解释了正在发生的事情以及为什么它不是主要问题。通过不删除目录来解决它,但添加 CleanBeforeCheckout 扩展例如extensions: [[$class: 'CleanBeforeCheckout'],[$class: 'SparseCheckoutPaths',sparseCheckoutPaths: [[path: "my/path/here"]]]],
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2014-08-29
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多