我正在尝试找到一种解决方法,因为第一个问题仍然没有答案。 can't run Start-Job with credentials from Jenkins
我有工作A.工作A在服务器上启动PowerShell脚本并显示一些输出。
此外,我还有一个管道B,它针对不同的服务器运行多个作业A副本。 这是groovy代码
stage 'Copy sources from Git'
build job: 'DeploymentJobs/1_CopySourcesFromGit'
stage 'Deploy to servers'
def servers = env.SERVERLIST.split('\n')
def steps =[:]
for (int i=0; i<servers.size(); i++) {
def server = servers[i]
def stepName = "running ${server}"
steps[stepName] = {->
echo server
build job: 'DeploymentJobs/2_DeployToServer', parameters:
[booleanParam(name: 'REBOOTAFTER', value: Boolean.valueOf(REBOOTAFTER)),
string(name: 'SERVERNAME', value: server)]
}
}
parallel steps
在管道的输出中,我只看到了N个副本的作业A启动但没有输出。 我想在管道B的控制台输出中只看到作业A的所有实例的powershell输出。
我没有iedea如何做到这一点,是否有可能。
答案 0 :(得分:1)
这是一个愚蠢的例子:
$myJobs = @()
$myJobs += Start-job -ScriptBlock { while (1) {Get-Item 'c:\*'; sleep 5}}
$myJobs += Start-job -ScriptBlock { while (1) {Get-Item 'c:\windows\*'; sleep 5}}
try {
while(1)
{
$myJobs | Get-Job -HasMoreData $true | Receive-Job
}
} finally {
$myJobs | Stop-Job
$myJobs | Remove-Job
}
作业管道的任何内容都排队。 -HasMoreData
状态表示作业具有可读取的输出。父级使用Receive-Job
接收输出。默认情况下,它会显示在控制台中,但您可以在父进程中接收输出并进行进一步处理。
如果这不是你想要的,你必须在你的问题中更加具体。提供一些您迄今为止尝试过的代码。
答案 1 :(得分:1)
我通过将其添加到循环中解决了我的问题。我可以将downstrema作业记录到上游,显示它并使用它。
def checkjob = build job: 'job name', parameters: [ any params here]
checklog = Jenkins.getInstance().getItemByFullName('job name').getBuildByNumber(checkjob.getNumber()).log
println checklog
答案 2 :(得分:0)
更短的选择:
def result = build job: 'job_name', wait: true
println result.getRawBuild().getLog()
有必要将这两种方法列入白名单。
编辑:由于您不想等待构建运行,您可以在作业结束时(或者在完成所有触发的构建之后的某个时刻)添加此内容,其中您的案例中的number_of_build将会是servers.size()。
def job = Jenkins.getInstance().getItemByFullName('job_A_name')
def last_build = job.getLastBuild().getNumber()
def first_build = last_build - number_of_builds
(first_build..last_build).each {
println "Log of build $it"
def build = job.getBuildByNumber(it)
println build.log
}
如果你真的想确定你所获得的构建是由你的工作触发的构建,你可以从构建对象中获得构建原因。