我有一个相当复杂的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插件.虽然此插件激活后可以使用更多操作,但这些操作不包括"构建其他项目".
真的没有一个简单的方法吗?我很惊讶我没有找到它,甚至更惊讶我没有真正看到任何其他人试图这样做?我做的事情不寻常吗?有什么明显的东西让我失踪吗?
在可用区域遭受Amazon Web Services/EC2中断的情况下,是否有任何工具或技术可用于在不同的可用区域中自动创建新实例?
我想我了解如何在可用区域(AZ)中断时自动进行故障转移,但是从停机中自动恢复(在新的AZ中创建新实例)怎么办?那可能吗?
此时,ELB将看到丢失的实例不再响应运行状况检查,并将停止将流量路由到该实例.所有请求都将转到剩下的两个健康实例.故障转移成功.
恢复是我不清楚的地方.有没有办法自动(即没有人为干预)替换新AZ中的丢失实例(例如AZ D)?这将避免具有中断(A)的AZ并且不使用已经具有实例的AZ(AZs B和C).
AutoScaling Groups似乎是一个很有前途的开始,但我不知道他们是否可以正确处理这个用例.
在AutoScaling组中,似乎没有办法指定应该在新的AZ中创建替换死/不健康实例的新实例(例如,在AZ D中创建它,而不是在AZ A中创建).这是真的吗?在AutoScaling组中,似乎没有办法告诉ELB删除失败的AZ并自动添加新的AZ.是对的吗?
AutoScaling群组中存在这些真正的缺点,还是我错过了什么?
如果使用AutoScaling组无法完成此操作,是否还有其他工具会自动为我执行此操作?
2011年,FourSquare,Reddit和其他人因依赖单一可用区而陷入困境(http://www.informationweek.com/cloud-computing/infrastructure/amazon-outage-multiple-zones-a-smart-str/240009598) .从那时起,工具似乎已经走过了漫长的道路.缺乏自动恢复解决方案让我感到惊讶.每个公司都只是自己动手解决方案和/或进行恢复吗?或者也许他们只是掷骰子并希望它不会再次发生?
@Steffen欧宝,感谢您的详细解释.自动缩放组看起来更好,但我认为与ELB一起使用时仍存在问题.
假设我创建了一个自动缩放组,其最小值,最大值和期望值设置为3,分布在4个AZ中.自动缩放将在3个不同的AZ中创建1个实例,第4个AZ保留为空.如何配置ELB?如果它转发到所有4个AZ,那将无法工作,因为一个AZ将始终具有零实例,并且ELB仍将路由流量到它.这将导致在流量进入空AZ时返回HTTP 503.我过去经历过这一点.这是我之前看到的一个例子.
这似乎需要手动将ELB的AZ更新为那些在其中运行实例的AZ.每次自动缩放导致不同的AZ混合时,都需要进行此操作.是的,或者我错过了什么?
我有一个发布 - 订阅用例,我想在发布端阻止,直到每个订阅者确认他们已经完成处理发布者发送的消息.
我(错误地?)假设我可以使用RabbitMQ及其Java amqp-client的Channel.waitForConfirmsOrDie方法作为我的解决方案的一部分.问题是我没有找到waitForConfirmsOrDie实际阻止的情况.
根据javadocs,waitForConfirmsOrDie应该:
等到自上次呼叫以来发布的所有消息都被代理确认或者没有.如果任何消息都没有,那么waitForConfirmsOrDie将抛出IOException.在非确认频道上呼叫时,它将立即返回.
为了测试这个方法是否真的有效,我从RabbitMQ网站开始使用这个示例代码.
示例代码创建了一个发布者和一个使用者,每个都在自己独立的线程上.然后,当消费者使用消息时,发布者将消息发送到交换机.似乎发布者应该阻止,直到通过调用waitForConfirmsOrDie()来获取所有消息.
这个示例代码似乎与我尝试做的完全匹配.但是,它似乎没有像我想象的那样工作.实际上,如果在消费者线程中,我关闭了自动执行消息,那么waitForConfirmsOrDie()仍会立即返回.
我通过将一个false更改为true来关闭auto ack:
ch.queueDeclare(QUEUE_NAME, false, false, false, null);
变为
ch.queueDeclare(QUEUE_NAME, true, false, false, null);(2nd arg false而不是true).我相信这意味着消费者不应再发送消息.
那么waitForConfirmsOrDie()实际上做了什么?什么时候会阻止?
如果waitForConfirmsOrDie没有做我想要的,有没有办法让发布者等到所有订阅者在继续之前收到消息?