如何动态选择要在 Jenkins 构建中使用的 git 分支

2024-03-28

我正在尝试为 Jenkins 构建服务器创建一个新的项目配置。为了简化我想要做的事情,我将仅使用两个组件来描述问题。

组分A

  • 该组件的更改会触发该项目在 CI 服务器上的构建。
  • CI 服务器具有静态配置的分支来监视更改和构建。例如。掌握或开发分支。
  • 该组件包含一个配置文件,其中包含它所依赖的 ComponentB 所需版本。

组件B

  • 对此组件的更改不会触发 CI 服务器上该项目的构建(将有另一个项目来涵盖 ComponentB 的开发)。
  • 组件的各个版本都被标记
  • ComponentA 在其配置文件中具有所需的 ComponentB 版本
  • CI 服务器不知道要签出哪个分支(标签),直到以某种方式解析了 ComponentA 的配置文件。

在詹金斯上实现这一目标的正确方法是什么?我试图找出如何添加解析配置文件并使 Git 插件根据 ComponentB 的预期版本检查分支的动态行为,但到目前为止我还没有任何线索。

在下一步中,我什至可能希望在配置文件中包含通配符(如 5.3.*),因此我必须找到与通配符匹配的最新 ComponentB 标签。

EDIT

现在我发现我过于简化了我的问题,并且由于简化,主要限制不再存在。

主要限制是组件 A 和 B 必须一起构建。不可能单独构建它们,因为它们形成一个可执行文件/库,并且构建脚本需要来自两个组件的源文件。

如果你问为什么会有这么奇怪的配置,我们先给组件 A 和组件 B 做一些描述:

  • ComponentA:本机平台特定代码
  • ComponentB:本机平台独立代码

可能有许多组件 A - 每个平台一个,但只有一个组件 B。将特定的 A 与 B 合并会生成单个平台的完整源代码,但并非每个平台都可以更新到 B 的最新版本,因此它需要控制应该使用哪个版本的 B 来构建。


实现您想要的效果的一种选择是使用以下设置:

创建两个 Jenkins 作业:

  • “组件 A”(SCM 更改时自动触发)
  • “组件B”(“手动”触发)

Step #1

定义branch 构建参数 https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build对于“组件 B”:

使用此参数作为“Git Plugin”分支说明符:

现在您应该能够通过为其指定适当的分支(标签)参数来手动触发“组件 B”构建,例如tags/5.3.0.

Step #2

将新的“执行外壳”构建步骤添加到“组件 A”构建中,这将从工作区的配置文件中提取“组件 B”版本,并准备b.properties具有“组件 B”构建参数的文件。

安装一个参数化触发器 https://plugins.jenkins.io/parameterized-triggerJenkins 插件,并向“组件 A”作业添加新的“触发/调用在其他项目上构建”构建步骤:

使用您的b.properties文件作为构建参数的来源。

现在,每次重新构建“组件 A”时,都会触发新的“组件 B”构建,并以目标分支/标签作为构建参数。

添加通配符支持

如果你想支持通配符版本,你可以使用git ls-remote命令查找最新标签,如下所示:

#B=$(obtain B version from the config file in a usual way)   

LATEST=$(\
    git ls-remote --tags YOUR_REPOSITORY_URL "$B"\
    |cut -d / -f3|sort -r --version-sort|head -1\
)
 
cat <<EOF > b.properties
    branch=tags/$LATEST
EOF

这将列出远程“组件 B”存储库中与“B”版本模式匹配的所有标签,并将最新版本号保存在LATEST多变的。

将其添加到“组件 A”作业的“执行 Shell”步骤中, 它应该能够处理版本号模式,例如:5.3.*

问题是 shell 脚本将以 Jenkins 守护程序用户身份运行, 因此它必须配置正确的凭据才能访问远程 Git 存储库(例如通过 ssh 公钥)。

或者,您可能想查看凭证绑定插件 https://wiki.jenkins-ci.org/display/JENKINS/Credentials+Binding+Plugin,以重用存储在 Jenkins 本身中的 Git 凭据。

使用 Jenkins 2.0 风格的管道

您还可以使用 Jenkins 2.0 风格来解决手头的任务Pipeline https://jenkins.io/doc/book/pipeline/,这将允许您将组件 A 和 B 的代码检出到单个工作区中,然后对它们应用一些常见的构建步骤。

你的管道可能看起来像这样:

node {

   //Settings
   def credentialsId = '8fd28e34-b04e-4bc5-874a-87f4c0e05a03'    
   def repositoryA = 'ssh://[email protected] /cdn-cgi/l/email-protection/projects/a.git'
   def repositoryB = 'ssh://[email protected] /cdn-cgi/l/email-protection/projects/b.git'

   stage('Checkout component A') {
      git credentialsId: credentialsId , 
      url: repositoryA , branch : "master"
   }
   
   stage("Resolve and checkout component B") {
      def deps = readProperties file: 'meta.properties'
      echo "Resolved B version = ${deps['b']}"
      
      dir("module/b") {
           //Clone/Fetch Component B 
           checkout scm:[
                $class: 'GitSCM', 
                userRemoteConfigs: [[url: repositoryB, credentialsId: credentialsId]], 
                branches: [[name: 'refs/tags/*']]
           ], 
           changelog: false, poll: false

           //Checkout the tag, matching deps['b'] pattern     
           sshagent([credentialsId]) {
                sh "git checkout \$(git tag -l \"${deps['b']}\" |sort -r --version-sort|head -1)"
           }
      }
   }
   
   stage("Build A+B") {
        //Apply a common build step
   }

}

这里我们使用“readProperties”命令,它是管道实用程序步骤插件 https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Utility+Steps+Plugin从中提取“组件 B”版本模式meta.properties。还有 readYaml、readJSON 命令可用。

接下来我们获取/克隆“组件 B”,其中changelog: false, poll: false标志,以防止其注册用于 SCM 轮询,并将其放入当前工作区的“module/b”文件夹中。

然后调用 shell 命令来根据我们上面获得的版本模式选择标签,并签出它(5.3.* 样式通配符也应该有效)。

The sh调用,被包装在sshagent https://wiki.jenkins-ci.org/display/JENKINS/SSH+Agent+Plugin,使其重用适当的 来自 Jenkins 凭证存储的凭证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态选择要在 Jenkins 构建中使用的 git 分支 的相关文章

  • 明确的追溯 .gitignore (如何让 Git 完全/追溯地*忘记*现在在 .gitignore 中的文件)

    Preface This question attempts to clear the confusion regarding applying gitignore retroactively not just to the present
  • 如何正确分叉本地 git 存储库?

    我有一个本地 git 存储库 我想分叉它并将其用作新项目的基础 新项目不应该将任何东西推回到原来的项目 这就是我的think我应该做 git clone originalproject newproject git remote remov
  • 每个命令重置外部差异工具

    我最近安装了一个新的差异工具 差异性的 https github com Wilfred difftastic 这扰乱了我将差异复制到剪贴板 或文件 以发送这些内容的习惯 diff external difft As per https d
  • 将一些提交移至另一个分支

    我只有一个分支有 git repo A B C D E master 我想将提交 B C 和 D 拆分到另一个名为开发的分支 A E master B C D develop 做到这一点最简单的方法是什么 无需关心远程仓库 做cherry
  • Jenkins Pipeline - 如何使用“工具”选项来指定自定义工具?

    我通过自定义工具插件在 Jenkins 中定义了一个自定义工具 如果我创建一个自由式项目Install custom tools选项在执行期间正确找到并使用该工具 Salesforce DX 但是 我找不到通过管道文件执行相同操作的方法 我
  • 如何运行 .bat 文件而不弹出 cmd 窗口?

    我有一个 bat 文件 我正在尝试在 Jenkins 中运行 Jenkins 作为服务运行 因此不会识别弹出窗口 有没有办法以静默模式运行这个 bat 文件 或者不允许弹出 cmd 窗口 那么你可以使用start命令与 min and b切
  • 无法放弃 git 中的更改

    一两周前 我拿了一些文件 这些文件是我用一个简单的程序存档的find sed tar xz gpgbash 脚本 将它们全部解压 并将它们的内容放入 git 存储库中 提交 将下一个档案内容放入存储库中 提交 冲洗并重复 以便拥有一个更好的
  • git 项目与存储库,根本区别是什么?

    我有两个项目当前使用 SVN 我正在迁移到 git 我注册了 gitorious 并且可以选择创建新项目或添加存储库 我刚刚开始使用 git 所以我不知道有什么区别 或者更确切地说 如果我只是在一个项目下使用存储库 这意味着什么 如果我这样
  • 仅对 Visual Studio 团队服务强制执行拉取请求

    有一种方法可以强制某些人只能通过拉取请求为一个分支做出贡献 我希望他们能够接受拉取请求 但不能直接推送更改 这将很有用 因为我们有一些分支策略 对于接受拉取请求的人来说 例如构建必须通过 问题是 如果我们允许某人接受拉取请求 我们将允许他们
  • GIT: /.git/index.lock': 文件存在

    我的 git 存储库一直存在问题 我不断收到以下错误 fatal Unable to create v path to files git index lock File exists If no other git process is
  • 添加原始哈希以在 git rebase 上提交(使用新根)

    我有一个代码库 以前用 SVN 管理 但现在用 git 管理 当代码迁移到 git 时 历史记录就丢失了 我已经设法恢复 SVN 历史记录 https stackoverflow com questions 79165 现在我正在努力git
  • 如何从 Jenkins 文件调用 groovy 脚本?

    我正在尝试将 Jenkinsfile 中的内容分离成一个常规脚本来制作 但它无法调用这些脚本 这是代码 usr bin env groovy node test node stage Checkout echo BRANCH NAME en
  • 获取自分离父分支以来的提交日志,包括父分支的最新提交

    我正在尝试创建一个快速的 bash 函数 该函数返回 oneline自当前分支从其父分支分支以来的每次提交的日志 以及包括先前提交的行 这是我到目前为止所拥有的 stolen from another Stack Overflow ques
  • 如何构建 Boost::program_options

    我想使用 boost program options 安装boost后 我认为我必须单独构建program options http www boost org doc libs 1 43 0 more getting started wi
  • 使用 git 客户端和 SVN 存储库的最佳工具/方法

    我已经使用 SVN 大约两年了 主要是通过 TortoiseSVN 和 IntelliJ 并尝试了 git 主要是通过 TortoiseGIT 在这里检测到模式 我们公司正在使用 SVN 作为存储库 他们不会考虑很快进行切换 在本地使用 g
  • Windows 主服务器上的 Jenkins Poll SCM (Git) / Linux 从服务器上的构建

    这是我的场景 使用 git 作为我的 SCM Jenkins Job 在 Linux Slave 上运行 Jenkins master 托管在 Windows 上 我已经配置了两个 Git 安装 如所示Jenkins 到 git Windo
  • 无法签出以连字符 (-) 开头的 git 分支

    我克隆了一个 git 存储库 该存储库有一个远程分支 例如 feature abc 当我打字时git checkout feature abc I get error unknown switch e 知道如何结帐这个分支吗 尝试使用以下语
  • 如何在Windows平台上编写Git Server Hooks?

    我找不到任何适用于 Windows 的 Git 挂钩的明确示例 我在 Windows Server 上使用 Bonobo Git Server 我需要预提交和提交后挂钩作为 cmd 或 bat 预提交应检查空注释 提交后应发送有关提交的电子
  • git rebase 冲突是由哪个提交引起的

    当我执行 git rebase master 时 有时会发生冲突 有时 即使有错误消息 也很难追踪问题 如果我能找出 git 正在尝试重新申请并导致冲突的提交 这将是一个真正的帮助 如何找出哪个提交导致了冲突 查看冲突的文件 以开头的行 g
  • ORIG_HEAD、FETCH_HEAD、MERGE_HEAD 等

    有很多有用的 git 参考资料 这个的确切名称是什么 例如HEAD ORIG HEAD FETCH HEAD MERGE HEAD 上游 等 这方面有什么参考吗 带有解释的完整列表 git help revisions brings up

随机推荐

  • 如何使用scrollTop或scrollTo滚动到div的顶部

    我在一个页面上有 4 个模态框 如果我将一个卷轴打开到底部 关闭它 然后重新打开它 它会将我置于模式中滚动到 最后的位置 每个模态都会发生这种情况 因此如果我滚动到第一个模态的底部 关闭它 然后打开第三个模态 它将把我带到模态的底部 我正在
  • 我可以在不成为系统管理员的情况下修复“找不到版本 GLIBC_2.14”错误吗?

    我正在尝试运行一个setup pyConda 环境中远程计算机上的文件 我收到以下错误消息 from torch utils cpp extension import BuildExtension CUDAExtension File ho
  • iOS 弹出“此应用内购买已被购买”

    我的 iOS 应用程序遇到问题 当我触摸 购买 按钮购买 IAP 产品时 会出现一个弹出窗口 显示以下消息 此应用内购买已被购买 它将免费恢复 我以前从未遇到过这种弹出窗口 而且我的产品只是不续订订阅 所以我想知道为什么在购买订阅时会出现此
  • Java方法重载+双重调度

    谁能详细解释一下重载方法的原因print Parent parent 在使用时被调用Child我的测试代码中的实例 这里涉及到 Java 中的虚拟方法或方法重载 解析的特殊性吗 有直接参考 Java Lang Spec 的吗 哪个术语描述了
  • 获取 WrappedArray 行值并将其转换为 Scala 中的字符串

    我有一个数据框 如下所示 value WrappedArray LineItem organizationId LineItem lineItemId WrappedArray OrganizationId LineItemId Segme
  • Bootstrap 3.3.2 模态事件多次触发

    引导模态事件 http getbootstrap com javascript modals events多次开火 或者更确切地说 总是比以前多开火一次 我将模态事件包装在一个单击函数中 该函数现在返回模态 id 如何确保该事件始终仅触发一
  • IDE0006 在 Visual Studio 中运行 Xamarin Android 项目时出错

    我刚刚创建了一个新的 Visual Studio for Cross Platform 项目 清理解决方案 重建解决方案 运行 Android 项目 编译花了很长时间 最后模拟器出现了 一段时间后 我收到 Warning IDE0006 错
  • 在 Eclipse 中编码

    我正在尝试使用 Eclipse 编码 UTF 8 来表示波兰语字符 不幸的是 我仍然遇到编码问题 我的设置 Window gt Preferences gt Debug Window gt Preferences gt Workspace
  • 嵌套结构的 boost 序列化不起作用

    我正在尝试序列化包含两种或多种其他类型结构的结构 但序列化好像不行 以下是示例代码 简单数据 hpp include
  • C# 中的并行和工作划分?

    假设我有 10 个核心 当我写的时候 Parallel For 0 100 i state gt Console WriteLine i 问题 每个核心分配数量的公式是什么 是吗100 10 在执行点 每个核心是否已经知道将处理哪些数字 或
  • 使用 tar.gz 下载在 Ubuntu 13.10 上安装 nltk 3.0

    我想在 Ubuntu 13 10 上安装 nltk 3 0 我已经运行 Ubuntu 几个星期了 我第一次使用 Linux 我刚刚下载了 python 3 4 0 3 3 也在 Ubuntu 上 因为它是随操作系统一起安装的 Python
  • 使用 ARC,哪个更好:分配或自动释放初始值设定项?

    使用起来是否更好 更快且更高效 alloc or autorelease初始化器 例如 NSString hello NSString name return NSString alloc initWithFormat Hello name
  • StringIndexOutOfBoundsException 字符串索引超出范围错误

    当我在输入整数后输入字符串 s 时 出现此错误 Exception in thread main java lang StringIndexOutOfBoundsException String index out of range 0 a
  • 覆盖 makefile 中的“CC”和“CXX”变量

    我有一个主 makefile 其中包含通用设置 以及一个子 makefile 其中包含项目特定设置 从我的另一个问题来看覆盖 makefile 中的变量 https stackoverflow com q 18869628 24949 我了
  • 如何在张量流中找到已识别对象的位置(ROI)

    我使用的是tensorflow android示例 它有一个用于ROI位置的占位符 参见tensorflow examples android src Classifier java 但它没有被使用 我希望能够找到分类对象的投资回报率 我查
  • Selenium 失败并显示空异常消息

    我使用 Selenium 2 7 0 和 Python 2 6 我的操作系统是 Mac OS X 10 7 当我尝试实例化 webdriver 对象时 我收到以下消息 selenium common exception WebDriverE
  • 路由错误 没有路由匹配 [PATCH]“/locations”

    我在尝试更新位置项后收到路线错误 我正在使用 before action 来设置位置 id before action set location only show edit update destroy private def set l
  • 显示具有单个 ID 的多条通知消息

    我有几个同时发生的事件 我需要以串行方式向用户显示多条通知消息 理想的情况是 每条通知消息将轮流显示 持续时间约为 2 秒 我能得到的最接近的是使用多个 id 但是 使用多个 id 会产生我不想要的副作用 最终状态栏上会同时显示多条通知消息
  • 如何在退出时杀死所有子进程?

    当node js进程退出时 如何杀死所有子进程 使用child process spawn生成 我认为唯一的方法是保留对ChildProcess返回的对象spawn 并在退出 master 进程时杀死它 一个小例子 var spawn re
  • 如何动态选择要在 Jenkins 构建中使用的 git 分支

    我正在尝试为 Jenkins 构建服务器创建一个新的项目配置 为了简化我想要做的事情 我将仅使用两个组件来描述问题 组分A 该组件的更改会触发该项目在 CI 服务器上的构建 CI 服务器具有静态配置的分支来监视更改和构建 例如 掌握或开发分