Jenkins: Trigger build remotely via script using crumb

Python:

import requests
api_proto = 'http'
api_url = 'localhost'
api_port = '8080'
api_job = 'test01'
api_user = 'admin'
api_pass = 'password'

api_crumb = requests.get(api_proto + '://' + api_user + ':' + api_pass + '@' + api_url + ':' + api_port + '/crumbIssuer/api/json')
if api_crumb.status_code == 200 :
    api_crumb = api_crumb.json()['crumb']

resp = requests.post(api_proto + '://' + api_url + ':' + api_port + '/job/' + api_job + '/build', auth=(api_user, api_pass), headers={"Jenkins-Crumb":api_crumb})
if resp.status_code == 201:
    print(api_job + ' was triggered successfuly..')



Powershell:

$API_User = "admin"
$API_Pass = "password"
$API_URL = "localhost"
$API_Port = "8080"
$API_Job = "test01"

$h = @{}
$h.Add('Authorization', 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$(${API_User}):$(${API_Pass})")))

$Params = @{uri = "http://${API_URL}:${API_Port}/crumbIssuer/api/json";
            Method = 'Get';
            Headers = $h;}
$API_Crumb = Invoke-RestMethod @Params

$h.Add('Jenkins-Crumb', $API_Crumb.crumb)
$Params['uri'] = "http://${API_URL}:${API_Port}/job/${API_Job}/build"
$Params['Method'] = 'Post'
$Params['Headers'] = $h

Invoke-RestMethod @Params



Perl:

use strict;
use warnings;
use autodie;
use REST::Client;
use MIME::Base64;
use JSON;

my $api_proto = 'http';            #HTTP/HTTPS
my $api_url = 'localhost';        #Server IP
my $api_port = '8080';            #Port number
my $api_job = 'test01';            #Jenkins job name
my $api_user = 'admin';            #Jenkins account username
my $api_pass = 'password';        #Jenkins account password

my $client = REST::Client->new();
$client->addHeader('Authorization', 'Basic '.encode_base64($api_user . ':' . $api_pass));
$client->GET($api_proto.'://'.$api_url.':'.$api_port.'/crumbIssuer/api/json');

if($client->responseCode() == 200)
{
    my $data = decode_json($client->responseContent());
    $client->addHeader('Jenkins-Crumb', $data->{'crumb'});
    $client->POST($api_proto.'://'.$api_url.':'.$api_port.'/job/'.$api_job.'/build');
    print("$api_job was triggered successfully..\n");
}



PHP:

<?php

$api_url = 'localhost';
$api_port = '8080';
$api_user = 'admin';
$api_pass = 'password';
$api_job = 'test01';

$opts = array(
  'http' => array(
    'method' => 'GET'
  )
);
$context = stream_context_create($opts);
$domain = 'http://'.$api_user.':'.$api_pass.'@'.$api_url.':'.$api_port.'/crumbIssuer/api/json';
$file = file_get_contents($domain, false, $context);

if(!$file) {
    echo 'Something went wrong..Try again!';
} else {
    $file = json_decode($file);
}

$opts = array(
  'http' => array(
    'method' => 'POST',
    'header' => 'Jenkins-Crumb:'.$file->{'crumb'}
  )
);
$context = stream_context_create($opts);
$domain = 'http://'.$api_user.':'.$api_pass.'@'.$api_url.':'.$api_port.'/job/'.$api_job.'/build';
$handle = fopen($domain, 'r', false, $context);

if($handle) {
    echo $api_job.' was triggered successfully...';
}

fclose($handle);

?>



Curl/Wget: https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained

This example triggers a Jenkins build from Python while satisfying crumb based protection against cross site request forgery. It first fetches a crumb token, then includes it with the build request.

When this protection is enabled, requests without a valid crumb are rejected, so scripted triggers must request one first. It is the hardened counterpart to the simpler token based trigger.

Comments

Popular posts from this blog

The 2026 AI Cheat Sheet: Best Tool for Every Task

[Solved] Error: No such keg: /usr/local/Cellar/gcc