This post provides a summary of the possibilities to perform HTTP requests from a Jenkins pipeline.

Overview

There are the following possibilities

  • Just doing a curl in a shell
  • Using Groovy URL object
  • Using plain old Java networking methods
  • Using a Jenkins plugin like http_request

Also security wise to properly handle the Jenkins sandboxing/script approval the call might want to be done

  • inline (with code inside the pipeline)
  • in a global shared libary

Sandboxing and Script Approval

In a properly configured Jenkins setup you usually have explicit script approval active and to use non-default libraries you need to extend the signature whitelist. Alternatively you can provide the required HTTP request functionality via plugin or global shared library, both of which are not subject to the script approval/signature whitelisting.

Variant Impact when used inline Impact when used in plugin/global shared library
curl none none
Groovy URL signature approval needed none
Java networking signature approval needed none
Plugin none n.a.

While using curl or a plugin have no security impact on pipeline development, they both have to be provided in terms of setup: curl needs to be installed on Jenkins agents and the plugin has to be installed and maintained in Jenkins setup, both of which is usually a ITOps/DevOps tasks.

In terms of actively and continuously developing required functionality I believe a global shared library is the way to go. This is both because it can be easily configured and development can happen by testing pipelines against new feature branches of the library.

Examples Snippets

Below you find example snippets for the HTTP request mechanism mentioned above.

curl

 sh 'curl https://google.com'

Groovy

From https://stackoverflow.com/questions/34682099/how-to-call-rest-from-jenkins-workflow

 def get = new URL("https://httpbin.org/get").openConnection();
 def getRC = get.getResponseCode();
 println(getRC);
 if(getRC.equals(200)) {
    println(get.getInputStream().getText()); 
 }

Using Java base libraries

Copied from

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.net.URL
import java.net.URLConnection

def sendPostRequest(urlString, paramString) {
    def url = new URL(urlString)
    def conn = url.openConnection()
    conn.setDoOutput(true)
    def writer = new OutputStreamWriter(conn.getOutputStream())

    writer.write(paramString)
    writer.flush()
    String line
    def reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))
    while ((line = reader.readLine()) != null) {
      println line
    }
    writer.close()
    reader.close()
}

sendPostRequest("https://google.com", "")

http_request plugin

 def response = httpRequest 'http://localhost:8080/jenkins/api/json?pretty=true'
 println("Status: "+response.status)
 println("Content: "+response.content)