【问题标题】:How to dynamically checkout feature branches from multiple repositories via Jenkins pipeline?如何通过 Jenkins 管道从多个存储库中动态签出功能分支?
【发布时间】:2019-11-06 15:22:39
【问题描述】:

首先:这里已经回答了多个类似的问题,但没有一个可以真正帮助我解决我的问题。

我想我需要一些帮助来创建高级 CI 管道。我正在处理的项目分为多个存储库,每个存储库管理一个特定方面(Web 应用程序、常用方法等)。我目前正在创建一个 CI 工作流来管理功能分支中的集成测试。我想到了以下工作流程(和问题):

  • 在名为“feature1”的相应功能分支中的多个不同项目(例如 UI 更改和后端功能)中开发了一项新功能
  • 提交更改后,Jenkins 会通过 web-hook 触发并分别构建每个功能分支
  • 因此,我需要一种方法来收集具有此确切功能分支“feature1”的所有存储库中的所有更改并分别构建它,对于所有其他依赖项,应使用主分支
  • 存储库的数量在不久的将来可能会增加,因此我不想在管道脚本中硬编码所有存储库 URL
  • 每个存储库都是一个 maven 项目,因此构建功能分支并将其安装到本地 jenkins 存储库将覆盖潜在的“主工件”,因此可能会破坏其他存储库的依赖关系

我正在努力寻找最有效和最合理的策略来管理这个项目结构。更改 maven 版本控制以将分支名称合并到版本标记中可能是明智的,但这会使所有存储库中的依赖管理更加复杂。

如果有人知道这个问题的巧妙解决方案,或者可以推荐一个解决这个问题的其他策略,请告诉我。

【问题讨论】:

  • “每个存储库都是一个 maven 项目,因此构建一个功能分支并将其安装到本地 jenkins 存储库中将覆盖潜在的“主工件”,因此可能会破坏其他存储库的依赖关系” i> 我不认为这是准确的。同一代码库的每个分支都有一个唯一的工件版本。
  • 您是否打算在某处部署 UI 和后端工件以便运行集成测试?你的策略是什么?
  • @OSGIJava 感谢您的反馈。但是如何区分具有相同 groupid、artifactid 和(快照)版本的两个工件?整个东西被打包成一个war文件,部署在jetty服务器上进行集成测试。
  • 如果您触发同一项目的多个构建,那么它将覆盖旧构建。这不是你想要的吗?您不想构建和部署最新的代码吗?
  • @OSGIJava 不是真的,我想部署功能分支更改的项目,以便在将功能合并到 master 之前确保集成测试成功运行

标签: maven jenkins continuous-integration jenkins-pipeline


【解决方案1】:

我的理解是您在 Jenkins 中配置了多个项目。这些项目使用相同的分支名称。您希望能够将新项目添加到 Jenkins 以构建并部署到您的测试集成环境,但是当您需要处理不同的功能时,您不希望在分支更改时手动更改每个 Jenkins 项目中的分支名称。

解决方案很简单。在 Jenkins 中使用 Environment variables:

这些键值对适用于每个节点上的每个构建。它们可以在 Jenkins 的配置中使用(作为 $key 或 ${key}),并将添加到从构建启动的进程的环境中。

例如,您可以声明 DEV_BRANCH 变量以指向您的功能分支,然后在每个项目中将 Repository URL 指定为 ${DEV_BRANCH}/projectName

【讨论】:

  • 这听起来与我想出的类似,基本上检查所有具有功能分支的依赖项,否则使用主分支。但是为了让它工作,我需要一种方法(一些 Jenkinsfile 管道配置)来动态检查组织中的所有存储库。该项目基本上是 Jenkins 中的一个多分支项目,可以动态添加我组织中的所有存储库。您是否偶然知道这样的配置如何在 Jenkinsfile 中专门工作?
  • 如果我没记错的话,您希望 Jenkins 查询您公司的代码仓库,找到所有具有给定分支名称的项目,为它们配置 Jenkins 作业,包括特定的部署脚本,然后将它们全部部署可以执行集成测试吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2017-03-06
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多