Chris Bolton
Chris Bolton

Reputation: 2314

How to pass file to Jenkins with Java

I have created a parameterized Jenkins job which I am passing variables to from my Java.

Here is the Java:

final HttpClient client = new HttpClient();
final PostMethod buildMethod = new PostMethod(Constants.SVN2GIT_QA_URL);
buildMethod.setParameter(Constants.GIT_URL_PARAM, gitUrl);
buildMethod.setParameter(Constants.PASSWORD_PARAM, password);
buildMethod.setParameter(Constants.SVN2GIT_COMMAND, svn2gitCommand);
buildMethod.setParameter(Constants.SVN2GIT_EMAIL, email);
buildMethod.setParameter(Constants.REPO_NAME, repoName);
client.executeMethod(buildMethod);

So this is pretty straight forward because I am only passing Strings to the job. However, I would now like to pass A File to the job using the File Parameter in Jenkins.

One thing I see is that the File Parameter in Jenkins has a File Location and a File Description. So not sure even how to set it to the parameter from Java.

Is this possible?

Upvotes: 3

Views: 1713

Answers (1)

Jayan
Jayan

Reputation: 18459

Here is a runnable class. Uses apache-httpclient (4.5.1) and related jars. Key is to use /build/ URL with MultiPart Form submission. Remote API is described here

package my;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.FormBodyPartBuilder;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.HttpClientBuilder;

import java.io.File;
import java.io.IOException;

class JenkinsClientExample {
    void helloJenkins() throws IOException {

        String server = "localhost";
        String jenkinsHost = "http://" + server + ":8080";
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        HttpClient httpClient = httpClientBuilder.build();


        String payLoad="{ \"parameter\": [{\"name\":\"FILE1_PARAM\",\"file\":\"file0\"}, {\"name\":\"FILE2_PARAM\",\"file\":\"file1\"},{\"name\":\"STRING_PARAM\", \"value\":\"2014\"}, " +
                "{\"name\":\"BOOLEAN_PARAM\", \"value\":\"TRUE\"}  ] }";
        File file = new File("c:/dummy.txt");
        File file2 = new File("c:/another.txt");


        FormBodyPartBuilder formBodyPartBuilder3 = FormBodyPartBuilder.create("file0", new FileBody(file, ContentType.TEXT_PLAIN));
        FormBodyPartBuilder formBodyPartBuilder4 = FormBodyPartBuilder.create("file1", new FileBody(file2, ContentType.TEXT_PLAIN));
        FormBodyPartBuilder formBodyPartBuilder1 = FormBodyPartBuilder.create("json", new StringBody(payLoad, ContentType.TEXT_PLAIN));

        HttpEntity entity = MultipartEntityBuilder
                .create()

                .addPart(formBodyPartBuilder3.build())
                .addPart(formBodyPartBuilder4.build())
                .addPart(formBodyPartBuilder1.build())
                .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
                .build();

        //must be the build URL not buildWithParameters
        HttpPost httpPost = new HttpPost(jenkinsHost + "/job/fake.UpdateCQ_VersionFixed/build"); 
        httpPost.setEntity(entity);

        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity result = response.getEntity();
        System.out.println(result);
        System.out.println(response.toString());

    }

    public static void main(String[] args) {
        try {
            new JenkinsClientExample().helloJenkins();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Upvotes: 5

Related Questions