我正在尝试在哈德森建立我们的构建过程。
Job 1将是一个超级快速(希望)持续集成构建作业,将经常构建。
Job 2将负责定期运行综合测试套件或手动触发。
Job 3将负责在整个代码库中运行分析工具(非常类似于Job 2)。
我尝试使用“高级项目选项>使用自定义工作区”功能,以便在作业1中编译的代码可以在作业2和3中使用。但是,似乎所有构建工件都保留在作业1工作区内。我这样做对吗?有没有更好的方法呢?我想我正在寻找类似于构建管道设置的东西......这样就可以共享东西,并且可以分阶段执行相应的工作。
(我也考虑使用'批处理任务'......但似乎无法安排那些?只能手动触发?)
欢迎任何建议。谢谢!
答案 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)
答案 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>
所以我选择了稍微优化的相同变体:
git ls-files -oz
变得简单快捷,不确定其他SCM