2009-11-27 130 views
16

我试图用哈德森替换我们目前的Buildbot安装程序。我安装了git插件。我们目前的设置是这样的:使用哈德森并与多个git仓库构建步骤

ssh://server:/repo/test_framework.git 
ssh://server:/repo/project_a.git 

现在,建立project_a我增加了一个新的工作与多个Git仓库(上面的)。我希望Hudson将存储库克隆到$WORKSPACE下的不同目录中,因为test_framework需要该层次结构。但哈德森似乎将所有东西都合并为$WORKSPACE。从控制台日志:

warning: no common commits 
... 
[workspace] $ git merge-base ce14a4579e87971659e5e0469136713847055a29 96d2b3c27595de243702414c4358366923696d78 
[workspace] $ git merge-base ce14a4579e87971659e5e0469136713847055a29 5bb011b3fa288afd5e4392640b32b8bcc982103e 
[workspace] $ git merge-base ce14a4579e87971659e5e0469136713847055a29 aa6ade81669883909ba5f5459a205df1bd0df3c0 

我可以在哈德逊配置此更好地适应我们的项目设置?我是否需要为每个项目创建一个本地的虚拟git存储库作为git子模块或其他东西?

回答

6

在Hudson中,您可以将多个作业链接在一起。您可以尝试为test_framework创建单独的Hudson作业,为project_a创建另一个作业。 Hudson为每个作业在$ WORKSPACE中创建一个单独的目录,因此现在应该在$ WORKSPACE下有两个不同的目录。


设置链接

在project_a滚动的作业配置到生成后的行动和检查建设等项目......在test_framework作为项目建设进入。

在test_framework的作业配置中,确保Poll SCM未被选中,并且在其他项目设置为project_a后生成。


它是如何工作

什么现在你已经配置是project_a将轮询SCM寻找变化,当发现​​它的变化会拉他们饭桶。运行构建步骤(如果有的话)并在完成时触发test_framework作业以从git(如果有)中提取更改并运行构建步骤。

+1

1)我们为什么不能用“投票SCM”连同与“建立以后。”? 2)这个上/下游设置似乎会发生什么,git回购将不会在兄弟目录中。在上面的例子中,我们获得了HUDSON_HOME/jobs/project_a/workspace和HUDSON_HOME/jobs/test_framework/workspace ..他们可以被带到同一级别吗? – inger 2010-12-14 23:54:20

6

“构建其他项目”解决方案的问题是,如果test_framework发生更改,则不会触发project_a构建。相反,我建议放弃git的插件,并设立“执行shell”构建步骤有以下:

rm -rf ${WORKSPACE}/* 

git clone ssh://server:/repo/test_framework.git ${WORKSPACE}/test_framework 
cd ${WORKSPACE}/test_framework 
git fetch -t ssh://[email protected]:/repo/test_framework.git +refs/heads/*:refs/remotes/origin/* 
git ls-tree HEAD 

git clone ssh://server:/repo/project_a.git ${WORKSPACE}/project_a 
cd ${WORKSPACE}/project_a 
git fetch -t ssh://[email protected]:/repo/project_a.git +refs/heads/*:refs/remotes/origin/* 
git ls-tree HEAD 

接下来,创建挂钩文件“服务器:/repo/test_framework.git/hooks/post-receive”和“服务器:/repo/project_a.git/hooks/post-receive”具有以下内容:

#!/bin/sh 
curl http://hudson/job/job_name/build 

现在,每当更改推要么库,钩子会用哈德森的API来触发一个构建。

+2

这会重新克隆每一个构建? – inger 2010-12-14 23:56:20

1

我遇到了同样的问题,目前通过为每个项目创建一个作业并使用Copy Artifact Plugin来允许构建依赖作业,即使对它的依赖关系进行了Git更新(这是为了避免在中间构建对我们依赖的项目进行更新)。

因此,project_a会从test_framework复制它需要的最新稳定构件,并且测试框架的更新将触发project_a中的构建。project_a仍然可以通过Git中的更改触发,它只是再次复制test_framework中的最新工件。

6

我意识到这个问题很古老,但我遇到了同样的问题,并使用此页来充实我自己的解决方案,似乎工作得很好(即使它有点复杂)。这个解决方案的大部分功劳应该去克林顿(我不愿意提交这个答案的唯一原因是因为他的回答似乎没有解决需要位于同一个基本目录中的多个存储库)。

假设您有两个存储库(A和B)。

步骤:

1)请两个项目来拉从远程仓库A码和B.将在任一仓库任何必要的构建步骤。

2)建立没有任何源代码管理的第三个目录。一生成步骤添加到这个项目中来执行类似以下的shell命令:(你的路径可能不一样找一找自己!)

ln -s /var/lib/jenkins/jobs/A/workspace A 
ln -s /var/lib/jenkins/jobs/B/workspace B 

现在你可以添加任何其他构建步骤这取决于A和B是姐妹在一个目录中。耶符号链接!

3)将三个任务连接在一起。拉任务的顺序可能并不重要(你比我更了解),但没有源代码控制的任务应该是链中的最后一个环节。

+0

谢谢彼得。仍然相关! – pojo 2011-04-11 13:44:34

1

你所描述的问题在詹金斯错误追踪系统已经申请为错误:https://issues.jenkins-ci.org/browse/JENKINS-8082


我们使用的扩展项目作业配置“自定义工作空间”选项检出我们的工作的一个仓库到的子目录另一份工作。

其他工作检查出来的主目录下的所有子模块:

var/lib/jenkins/jobs/ 
    + main_job 
    + workspace (main git checkout with submodules) 
     + modules 
     + mod1 
     + mod2 
    + mod1_job (custom workspace set to main_job/workspace/modules/mod1) 
    + workspace (empty)