我正在尝试编写一个Spinnaker管道表达式,该表达式根据当前阶段及其祖先确定一些条件。根据文档,您可以使用the #root
helper获取当前阶段 context ;但是,似乎没有任何方法可以获取当前的 stage 。
例如,如果您想确定当前阶段是否有任何处于失败状态的祖先,那么现在您必须知道阶段名称,考虑到#root
的存在,这似乎是违反直觉的。
${ #stage("My Stage").ancestors().?[status.isFailure() && name != "My Stage"] }
我想将#stage("My Stage")
替换为 #root
,但是#root
还是上下文对象在舞台内部,而不是舞台本身。
请注意,the Stage.ancestorsOnly()
method目前还处于私有状态,因此,如果您要查找仅祖先失败(或具有其他条件),则需要手动排除当前阶段。这就是为什么我在那里有额外的name
比较。
答案 0 :(得分:0)
这里也许正确的做法是向我们根据https://github.com/spinnaker/orca/blob/7de225679cf19cbcbfcfdbdcd08dc1962247f0fe/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ContextParameterProcessor.java#L90评估SPEL的增强上下文中添加一些其他值,以包括诸如阶段ID之类的值,以便添加诸如#currentStage()或#ancestorStaget()在https://github.com/spinnaker/orca/blob/fc87a8e99ec59a4e129646026987aa5adbde2d31/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/expressions/ExpressionsSupport.java#L60
这里存在一些细微的问题,因为阶段表达式是在阶段运行之前进行求值的,因此对于诸如祖先之类的静态值应该没问题,但是对于诸如status之类的值,您得到的值将不会更新