如何在上游作业中获取下游作业的控制台输出?

时间:2018-01-26 11:27:12

标签: powershell jenkins groovy jenkins-pipeline pipeline

我正在尝试找到一种解决方法,因为第一个问题仍然没有答案。 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如何做到这一点,是否有可能。

3 个答案:

答案 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
}

如果你真的想确定你所获得的构建是由你的工作触发的构建,你可以从构建对象中获得构建原因。