我有一个相当复杂的Jenkins工作,它构建,单元测试和打包Web应用程序。根据具体情况,一旦这项工作完成,我想做不同的事情。我没有找到可重用/可维护的方法来做到这一点。是真的如此,还是我错过了什么?
我复杂的工作完成后我希望有的选项:
什么都不做
启动我的低风险更改构建管道:
启动我的高风险更改构建管道:
我还没有找到一个简单的方法来做到这一点。最简单但不易维护的方法是制作三个独立的工作,每个工作都会启动下游构建。这种方法让我害怕有几个原因,包括必须在三个地方而不是一个地方进行变更。此外,许多下游工作也几乎相同。唯一的区别是他们称之为下游工作。工作的激增似乎会导致无法维持的混乱。
我已经考虑过使用几种方法将其作为一项工作,但到目前为止还没有工作:
使作业成为多配置项目(https://wiki.jenkins-ci.org/display/JENKINS/Building+a+matrix+project)。这提供了一种使用参数注入作业的方法。我还没有找到一种方法让“构建其他项目”步骤响应参数。
使用Parameterized-Trigger插件(https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin)。此插件允许您根据特定触发器触发下游作业。但是触发器似乎限制性太强。它们都是基于构建的状态,而不是任意变量。我没有看到任何可用于我的用例的选项。
使用Flexible Publish插件(https://wiki.jenkins-ci.org/display/JENKINS/Flexible+Publish+Plugin)。这个插件与参数化触发器插件有相反的问题。它有许多有用的条件可以检查,但它看起来不像它可以开始构建另一个项目。它的行动仅限于发布类型的活动。
使用Flexible Publish + Any Build Step插件(https://wiki.jenkins-ci.org/display/JENKINS/Any+Build+Step+Plugin)。 Any Build Step插件允许任何构建操作可用于Flexible Publish插件。虽然此插件激活后可以使用更多操作,但这些操作不包括“构建其他项目”。
真的没有一种简单的方法吗?我很惊讶我没有找到它,甚至更惊讶我没有真正看到任何其他人试图这样做?我做的事情不寻常吗?有什么明显的东西我不见了吗?
答案 0 :(得分:30)
如果我理解正确,您应该可以按照以下步骤执行此操作:
为高风险工作做同样的事情
现在您应该进行以下设置:
这就是你想要实现的目标。不是吗?
答案 1 :(得分:6)
您是否看过Conditional Build Plugin? (https://wiki.jenkins.io/display/JENKINS/Conditional+BuildStep+Plugin)
我认为它可以做你想要的。
答案 2 :(得分:2)
如果你想要一个有条件的后期制作步骤,那就有一个插件:
https://wiki.jenkins-ci.org/display/JENKINS/Post+build+task
它将在控制台日志中搜索您指定的RegEx,如果找到,将执行自定义脚本。您可以配置相当复杂的条件,并且可以配置多组标准,每组标准执行不同的后期构建任务。
它没有为您提供通常的“构建步骤”操作,因此您必须在那里编写自己的脚本。您可以使用jenkins支持的标准方式(例如使用curl)触发使用不同参数执行相同作业或使用某些参数执行其他作业
另一个替代方案是Jenkins文本查找器插件:
https://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin
这是一个构建后的步骤,如果在控制台文本(甚至工作区中的某个文件)中找到RegEx,则允许强制将构建标记为“不稳定”。因此,在构建步骤中,根据您的条件,将一个唯一的行回显到控制台日志中,然后为该行执行RegEx。然后,您可以使用“Trigger parameterized buids”并将条件设置为“unstable”。这有一个额外的好处,即在视觉上标记构建不同(使用黄色球),但是这个方法只有1个条件选项,并且从你的OP看起来你需要2个。
尝试这两种方法的组合:
答案 3 :(得分:1)
您是否在构建中使用Ant?
如果是这样,可以通过使用一组环境变量在ant中进行条件构建,构建脚本可以使用这些变量来有条件地构建。在Jenkins中,您的构建将构建所有项目,但您的实际构建将决定它是构建还是仅仅是短路。
答案 4 :(得分:1)
我认为这样做的方法是添加一个你在后期构建步骤中放入的中间作业,并将下游作业可能需要的所有参数传递给它,然后在该作业中为真实的条件构建下游工作。
答案 5 :(得分:0)
我发现最简单的方法是远程触发其他作业,以便您可以使用Conditional Build Plugin或任何其他插件有条件地构建其他作业。