This script shows how to use PowerShell to invoke a Jenkins workflow and retrieve the result.
Finding the results is depenent on each request being submitted with a unique request ID that may be filtered for. It also assumes that a unique API token for the workflow being called is known.
Unfortunately, the best that can be retrieved at the completion of a Jenkins job is the text based log file. This resides in a known folder on the jenkins server to the workflow can be hacked to replace the log with something a little more workable like JSON output.
$jobparams = @{} $RequestId = ([string]([guid]::NewGuid())).Replace('-','').trim() # Global Details $UserName = "admin" $JenkinsAPIToken = "3998abba419dd62796175bc1c98c3" $JENKINS_URL = "http://jenkinsserver:8080" $JOB_URL = "http://jenkinsserver:8080/job/myworkflow/" # Workflow Parameters $jobparams.Add("MachineIP", "SomeString1") $jobparams.Add("RequestID", $RequestId) # Load Assemblies [Reflection.Assembly]::LoadFile( ` 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll')` | out-null <# Retrieve Crumbs (needed for POST Requets) #> $headers = $null $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization","Basic "+ [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($UserName):$JenkinsAPIToken"))) $url = "$($JENKINS_URL)/crumbIssuer/api/xml" [xml]$crumbs = Invoke-WebRequest $url -Method GET -Headers $headers # set the CSRF token in the headers #$webclient.Headers.Add($crumbs.defaultCrumbIssuer.crumbRequestField, $crumbs.defaultCrumbIssuer.crumb) $reqparm = new-object System.Collections.Specialized.NameValueCollection # set the CSRF token in the headers $headers.Add($crumbs.defaultCrumbIssuer.crumbRequestField, $crumbs.defaultCrumbIssuer.crumb) $headers.Add("Accept", "application/xml") <# Construct URL for Build Request #> $url = "$($JOB_URL)buildWithParameters?" $count = 0 foreach ($h in $jobparams.GetEnumerator()) { $h $count = $count + 1 $url = $url + "$($h.Name)=$([System.Web.HttpUtility]::UrlEncode($h.Value))" if (!($count -eq $jobparams.Count)){ $url = $url + "&" } } $result = $null $jobsubmit = Invoke-WebRequest $url -Method POST -Headers $headers -ContentType "application/json" #hack to get output $linearray = $null $linearray = ($jobsubmit.RawContent).Split() foreach ($line in $linearray) { if ($line -match "http://"){ write-output "queue address = $($line)" $queueaddress = "$($line)api/xml" } } $output = $null #Search for the job with unique ID $url = "$($JOB_URL)api/xml?tree=builds[actions[parameters[name,value]],number]&xpath=//build[action[parameter[name=`"RequestID`"][value=`"$($RequestId)`"]]]/number&wrapper=job_names" $jobnumber = $null $val = $null Do { $val++ Start-Sleep -s 2 $output = Invoke-WebRequest $url -Method GET -Headers $headers if (!($output.Content -match "")){ [xml]$jobdetails=$output.Content $jobnumber = $jobdetails.job_names.number $val = 10 } } while($val -ne 10) $url = "$($JOB_URL)$($jobnumber)/consoleText" $output = Invoke-WebRequest $url -Method GET -Headers $headers $output.Content [[/csharp]]
- Log in to post comments