Sandeep Dvs
Sandeep Dvs

Reputation: 147

Jenkins REST API to get job and job console log

How to get the details of the job along with it console output using Jenkins REST API

example of builds

Builds

console output:

console Output for the build

I am using following commands to get the path of console log

echo $JENKINS_HOME/jobs/$JOB_NAME/builds/${BUILD_NUMBER}/log

echo $BUILD_URL/consoleText

It would provide the path to console log

http://localhost:8080/job/Echo/25//consoleText

but if i try to get the data from it using c#.net it would through me a exception

I am using following code to get the data

 public string Download_Contents(string URI)
    {
        string Data = string.Empty;
        try
        {
            using (var wc = new System.Net.WebClient())
                Data = wc.DownloadString(URI);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return Data;
    }

Exception:

Exception

Upvotes: 10

Views: 33171

Answers (5)

Jay Yang
Jay Yang

Reputation: 413

Python example over here:

import requests

# create your own jenkins cred from jenkins setting page
USER = '***'
PASS = '***'
AUTH = (USER, PASS)

URL = "https://$JENKINS_URL/job/$JOB_NAME/$BUILD_ID/consoleText"

response = requests.get(URL, auth=AUTH)
open("my_log.txt", "wb").write(response.content)

Upvotes: 0

Emerson Cardoso
Emerson Cardoso

Reputation: 394

You can try to use Jenkins API to obtain the crumbs based on the authentication (user/pass or user/token).

I'll paste below some code illustrating how to do that (it's powershell but the idea is the same and it's straight-forward to translate it to C#):


$user = 'user'
$pass = 'password'

# The header is the username and password concatenated together
$pair = "$($user):$($pass)"
# The combined credentials are converted to Base 64
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
# The base 64 credentials are then prefixed with "Basic"
$basicAuthValue = "Basic $encodedCreds"
# This is passed in the "Authorization" header
$Headers = @{
    Authorization = $basicAuthValue
}
# Make a request to get a crumb. This will be returned as JSON
$json = Invoke-WebRequest -Uri 'http://jenkinsserver/jenkins/crumbIssuer/api/json' -Headers $Headers
# Parse the JSON so we can get the value we need
$parsedJson = $json | ConvertFrom-Json
# See the value of the crumb
Write-Host "The Jenkins crumb is $($parsedJson.crumb)"
# Extract the crumb filed from the returned json, and assign it to the "Jenkins-Crumb" header
$BuildHeaders = @{
    "Jenkins-Crumb" = $parsedJson.crumb
    Authorization = $basicAuthValue
}
Invoke-WebRequest -Uri "http://jenkinsserver/jenkins/job/Run%20a%20script/build" -Headers $BuildHeaders -Method Post

Source: https://octopus.com/blog/jenkins-rest-api

Upvotes: 1

KIRAN KUMAR MATAM
KIRAN KUMAR MATAM

Reputation: 370

we can get console log with Above URL mentioned http://localhost:8080/job/Echo/25//consoleText

URL urls = new URL("http://localhost:8080/job/Echo/25//consoleText"); 
HttpURLConnection connection = (HttpURLConnection) urls.openConnection(); 
connection.setDoOutput(true); 
//connection.setRequestProperty("User-Agent", "Mozilla/5.0");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36");

System.setProperty("http.agent", "Chrome");
connection.setInstanceFollowRedirects(false); 
connection.setRequestMethod("GET"); 
connection.setRequestProperty("Content-Type", "application/json");

// Convert to a JSON object to print data
/*HttpServletRequest request;*/
BufferedReader br = new BufferedReader(new InputStreamReader(
        (connection.getInputStream())));

it worked for me if any queries please ping me

Upvotes: 3

dsaydon
dsaydon

Reputation: 4769

So for using the consoleFull i'm getting very dirty output using curl

example:

curl -s -S  -u "user":"password" "http://jenkins.domain.com/job/my_job_name/1077/consoleFull"

output: many lines wrapped with html stuff:

 <span class="timestamp"><b>09:04:32</b> </span><span style="color: #00CD00;">ok:</span>

so my solution is to use:

curl -s -S  -u "user":"password" "http://jenkins.domain.com/job/my_job_name/1077/logText/progressiveText?start=0"

and you will get the same console log output without the html,span stuff

Upvotes: 20

Ori Marko
Ori Marko

Reputation: 58772

To make scripted clients (such as wget) invoke operations that require authorization (such as scheduling a build), use HTTP BASIC authentication to specify the user name and the API token.

See Authentication with samples

Upvotes: 0

Related Questions