在Hudson中的作业之间共享构建工件

时间:2009-05-06 00:21:03

标签: build-process build continuous-integration build-automation hudson

我正在尝试在哈德森建立我们的构建过程。

Job 1将是一个超级快速(希望)持续集成构建作业,将经常构建。

Job 2将负责定期运行综合测试套件或手动触发。

Job 3将负责在整个代码库中运行分析工具(非常类似于Job 2)。

我尝试使用“高级项目选项>使用自定义工作区”功能,以便在作业1中编译的代码可以在作业2和3中使用。但是,似乎所有构建工件都保留在作业1工作区内。我这样做对吗?有没有更好的方法呢?我想我正在寻找类似于构建管道设置的东西......这样就可以共享东西,并且可以分阶段执行相应的工作。

(我也考虑使用'批处理任务'......但似乎无法安排那些?只能手动触发?)

欢迎任何建议。谢谢!

8 个答案:

答案 0 :(得分:15)

您可能想尝试复制工件插件:

http://wiki.hudson-ci.org/display/HUDSON/Copy+Artifact+Plugin

您的连续工作可以构建必要的工件,而您的其他两个工作可以将它们拉入进行分析。

答案 1 :(得分:7)

Hudson有一个插件可以解决这个问题:http://wiki.hudson-ci.org/display/HUDSON/Clone+Workspace+SCM+Plugin(链接目前已损坏)

相应的Jenkins页面位于:https://wiki.jenkins-ci.org/display/JENKINS/Clone+Workspace+SCM+Plugin

答案 2 :(得分:2)

是的,那个wiki页面不是很有帮助,因为它试图使它听起来非常优雅。事实是,如果你必须把东西从一个工作转移到另一个工作,Hudson不会非常优雅地支持工作链。

我也在使用zip-up-and-copy-workspace方法将工作空间从一个作业转移到另一个作业。我有一个快速构建,完整的分析构建,然后分发构建。在这两者之间,我使用Ant来生成时间戳和“构建标记”,以标记哪个作业的编号构建了哪个其他作业的编号。指纹识别功能有助于跟踪文件,但由于我不打算存档工作区拉链,因此指纹对用户来说是无用的,因为它们实际上看不到工作区的拉链。

答案 3 :(得分:1)

你看过哈德逊维基吗?具体来说:Splitting a big job into smaller jobs

答案 4 :(得分:0)

我遇到了同样的问题,我最终得到的是长期运行任务的单独项目。这些项目的第一步是将Job 1工作空间(即最后一次构建)中的所有文件复制到Job 2/3 / etc工作区。这通常是有效的,除非Job 2在Job 2/3开始时正在建造,因为它会得到一个不完整的工作空间。您可以通过使用sentinel文件检测作业1中的“构建结束”或使用Hudson锁插件(我还没有尝试过)来解决这个问题。

如果您假设其他作业的位置相对于%WORKSPACE%,则

答案 5 :(得分:0)

我现在正在做类似的事情。我建议避免尝试在同一个共享工作区中运行多个作业。我只有这个问题。

我正在使用maven和自由格式项目类型。当版本控制系统中的文件触发它时,将运行一组作业。它们创建本地快照工件。第二组作业每晚运行并设置集成测试环境,然后对其进行测试。

如果你不使用maven;一个选项是在磁盘上设置一个区域,并在作业中的最后一步将工件复制到该位置。第二项工作的第一步应该是移动这些文件。运行无论你需要运行什么。

至于第三项工作,现在有针对Hudson的findbugs / checkstyle / pmd等所有插件。我建议只创建一个作业1的版本,它可以完成一个干净的夜间结账并在你的代码库上运行。

答案 6 :(得分:0)

Hudson似乎没有构建工件的内置存储库。我们的解决方案是创建一个。

我们处于Windosw环境中,因此我创建了一个可供所有Hudson服务器访问的共享(我们为相关服务提供了一个通用帐户,因为系统帐户无法通过网络访问资源)。

在我们的构建脚本(ant)中,我们有将任务从其他作业复制到本地工作区的任务,生成工件的作业将它们复制到公共存储库中。

在其他环境中,您可以通过FTP或任何其他移动文件的机制进行发布和获取。

发布和获取任务的简单示例:

<!-- ==================== Publish ==================================== -->
<target name="Publish" description="Publish files">
  <mkdir dir="${publish.dir}/lib" />
  <copy todir="${publish.dir}/lib" file="${project.jar}"/>
</target>

<!-- ==================== Get ==================================== -->
<target name="getdependencies" description="Get necessary results from published directory">
  <copy todir="${support.dir}">
    <fileset dir="${publish.dir}/lib">
      <include name="*.jar"/>
    </fileset>
  </copy>
</target>

答案 7 :(得分:0)

我同意手动作业之间的当前复制文件/工件/工作区不够优雅。

另外,我发现需要存档巨大的tgz / zip文件浪费空间/时间..在我们的例子中,这些文件很大(1.5G)并且需要很长时间来打包/存档/指纹/解包。 / p>

所以我选择了稍微优化的相同变体:

  • Job 1/2/3所有签出/克隆相同的源存储库,但
  • 作业1仅打包实际构建工件的文件
    • 使用Git使git ls-files -oz变得简单快捷,不确定其他SCM
  • 使用Copy Artifact插件传输文件
  • 在我们的案例中,这会将这些文件减少到1/3 - &gt;加速,浪费更少的空间