管理依赖项
有时你需要比简单的阶段和作业管道更复杂的触发器。特别是,你可能希望根据另一个管道中的阶段的结果来触发一个管道。这可以通过将管道作为材料添加来实现。
创建依赖项
假设我们有两个管道 -upstream1和downstream_pipeline。我们希望在upstream1管道中的stage阶段成功完成后,自动触发downstream_pipeline。以下是我们如何实现这一点:
- 导航到管理部分。
- 在管道屏幕上,找到downstream_pipeline管道并编辑它。
- 点击材料标签页。
- 通过点击添加材料并选择管道 .
- 添加一个新的管道依赖材料。添加材料弹出窗口。
- 在upstream1。管道字段中选择
- 在stage。阶段字段中选择
高级用户还可以通过配置XML管理部分的标签页(配置参考是在这里)进行配置的方法。
<pipeline name="downstream_pipeline">
<materials>
<pipeline pipelineName="upstream1" stageName="stage"/>
</materials>
...
</pipeline>
现在,当“upstream1”的“stage”阶段完成时,“downstream_pipeline”管道将开始构建。
如果你想查看与“downstream_pipeline”相关的材料,特定实例的下游管道的管道详细信息页面将显示所有这些信息。
从上游管道获取工件
GoCD可以自动从前一个阶段的当前管道或它所依赖的任何祖先管道中获取工件。当一个管道依赖于管道早期生成的二进制文件时,这非常有用。
注意,你不能为同一个上游管道指定两个(或更多)依赖项。
例如,在以下配置中,当“upstream1”管道的“stage”阶段通过时,“downstream_pipeline”管道开始,并且工件从“downstream_pipeline”的‘Stage’阶段中的上游管道获取。你可以在阶段详细信息页面的“材料”子标签中看到触发此操作的确切管道和阶段。
你可以通过相应管道的管理屏幕来执行此操作。首先需要在“upstream1”的作业级别定义工件:
然后,你将希望在“downstream_pipeline”中检索(获取)该工件。可以通过在该管道中的作业内创建一个“获取工件”任务来实现。由于你已经将“upstream1”定义为依赖材料,因此可以在此管道中访问来自该管道的工件。
获取任务还可以被指示从祖先管道获取(获取)工件。例如,假设在此示例中使用的“upstream1”依赖于另一个管道“topmost”。那么你可以通过定义这些管道的层次结构来定义一个“获取工件”任务以从“topmost”获取工件。必须用/
分隔管道来指定层次结构。例如:“topmost/upstream1”。
对于高级用户,这是如何通过配置XML管理部分的标签页(配置参考是在这里)进行配置的方法。
<pipeline name="topmost">
<materials>
<svn url="...."/>
</materials>
...
<stage name="TopStage1">
<jobs>
<job name="topJob">
<tasks>
<nant />
</tasks>
<artifacts>
<artifact src="target/mylib.dll" dest="lib"/>
</artifacts>
</job>
</jobs>
</stage>
</pipeline>
<pipeline name="upstream1">
<materials>
<svn url="...."/>
<pipeline pipelineName="topmost" stageName="TopStage1"/>
</materials>
...
<stage name="stage">
<jobs>
<job name="firstJob">
<tasks>
<nant />
</tasks>
<artifacts>
<artifact src="target/commonlib.dll" dest="pkg"/>
</artifacts>
</job>
</jobs>
</stage>
</pipeline>
<pipeline name="downstream_pipeline">
<materials>
<pipeline pipelineName="upstream1" stageName="stage"/>
</materials>
<stage name="Stage">
<jobs>
<job name="fetchFromParentJob">
<tasks>
<fetchartifact pipeline="upstream1" stage="stage" job="firstJob" srcfile="pkg/commonlib.dll" dest="libs"/>
</tasks>
</job>
<job name="fetchFromAncestorJob">
<tasks>
<fetchartifact pipeline="topmost/upstream1" stage="TopStage1" job="topJob" srcfile="lib/mylib.dll" dest="libs"/>
</tasks>
</job>
<jobs>
</stage>
...
</pipeline>