代码之家  ›  专栏  ›  技术社区  ›  pojo

在多个Git存储库中使用Hudson和构建步骤

  •  16
  • pojo  · 技术社区  · 15 年前

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

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

    现在,建造 project_a 我在多个Git存储库中添加了一个新工作(上面的那些)。我想让哈德逊将存储库克隆到 $WORKSPACE 贝卡斯 test_framework 需要层次结构。但哈德逊似乎把一切都融入 $WorkStudio 相反。从控制台日志:

    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子模块或其他东西?

    5 回复  |  直到 12 年前
        1
  •  6
  •   Clinton    15 年前

    在哈德逊,你可以把多个工作链接在一起。您可以尝试为测试框架和项目框架分别创建一个Hudson作业。Hudson在$workspace中为每个作业创建一个单独的目录,因此现在您应该在$workspace下有两个不同的目录。


    设置链接

    在项目的作业配置中,向下滚动以发布生成操作并检查生成其他项目…在测试框架中输入作为要构建的项目。

    在测试框架的作业配置中,确保轮询SCM 未检查的 在其他项目设置为项目“A”后生成。


    它是如何工作的

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

        2
  •  6
  •   scribnerc    14 年前

    “构建其他项目”解决方案的问题是,如果对测试框架进行了更改,则不会触发要构建的项目。相反,我建议放弃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
    

    接下来,创建hook文件“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来触发构建。

        3
  •  6
  •   JugsteR    12 年前

    我意识到这个问题很古老,但我遇到了同样的问题,并用这一页充实了我自己的解决方案,它看起来非常有效(尽管有点复杂)。这个解决方案的大部分功劳应该归功于克林顿(我提交这个答案的唯一原因是他的答案似乎不能解决需要在同一个基本目录中的多个存储库)。

    假设您有两个存储库(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)把这三个任务连在一起。拉任务的顺序可能重要,也可能不重要(你比我知道得多),但是没有源代码控制的任务应该是链中的最后一个链接。

        4
  •  1
  •   Viesti    14 年前

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

    因此,Project_a会从test_framework复制它所需的最新稳定的工件,对test framework的更新会触发项目_a中的构建。项目_a仍然可以由git中的更改触发,它只会再次复制test_framework中的最新工件。

        5
  •  1
  •   cweiske agentofuser    13 年前

    您描述的问题已经作为Bug在Jenkins BugTracker中归档: 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)