16

我正在尝试使用 Hudson 来替换我们当前的 Buildbot 设置。我安装了 git 插件。我们当前的设置如下:

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

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

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

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

4

5 回答 5

6

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


设置链接

在 project_a 的作业配置中,向下滚动到 Post-build actions 并选中 Build other projects... 输入 test_framework 作为要构建的项目。

在 test_framework 的作业配置中,确保未选中Poll SCM并且将 Build after other projects 设置为 project_a。


这个怎么运作

您现在配置的是 project_a 将轮询 SCM 以查找更改,当发现更改时,它将从 git 中提取它们。运行构建步骤(如果有)并在完成时触发 test_framework 作业以从 git(如果有)中提取更改并运行其构建步骤。

于 2009-11-29T22:41:52.783 回答
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://user@server:/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://user@server:/repo/project_a.git +refs/heads/*:refs/remotes/origin/*
git ls-tree HEAD

接下来,使用以下内容创建挂钩文件“server:/repo/test_framework.git/hooks/post-receive”和“server:/repo/project_a.git/hooks/post-receive”:

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

现在,无论何时将更改推送到任一存储库,钩子都会使用 Hudson 的 API 来触发构建。

于 2010-07-09T18:41:05.357 回答
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)将三个任务链接在一起。拉取任务的顺序可能重要,也可能不重要(你比我更清楚),但没有源代码控制的任务应该是链中的最后一个环节。

于 2011-03-21T03:53:31.807 回答
1

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

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

于 2010-09-16T15:31:14.910 回答
1

您描述的问题已在 Jenkins 错误跟踪器中作为错误提交: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)
于 2011-08-17T11:17:39.360 回答