Send HTTP request with file to submit "Input request" in Jenkins Pipeline

Hello, community!

I have a question about automatically loading a file in the “input request step”

I have the following Jenkins Pipeline:


pipeline {

  agent any
    stages {
      stage('Pipeline init') {
        steps {
          input id: 'CUSTOM_ID', message: 'Upload file', parameters: [base64File('file')]
        }
      }
   }
}

How to send a file via HTTP Request and click “Submit”. I tried the following CURLs but they were unsuccessful:


$ curl -v -XPOST http://<my_jenkins_instance>/job/InputTest/1/input?inputId=CUSTOM_ID \
-u "<username:token>" \
-F "CUSTOM_ID=@<path_to_file_from_my_file_system>"

$ curl -v -XPOST http://<my_jenkins_instance>/job/InputTest/2/inputSubmit?inputId=CUSTOM_ID \
-u "<username:token>" \
-F "CUSTOM_ID=@<path_to_file_from_my_file_system>"

$ curl -v -XPOST http://<my_jenkins_instance>/job/InputTest/3/inputId=CUSTOM_ID/submit \
-u "<username:token>" \
-F "CUSTOM_ID=@<path_to_file_from_my_file_system>"

$ curl -v -XPOST 'http://<my_jenkins_instance>/job/InputTest/3/input/CUSTOM_ID/submit' \
-u "<username:token>" \
-F "job_configs=@<path_to_file_from_my_file_system>"

In last case I got in Console Output:

Rejected by user
org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: f7676799-287f-49d3-936d-a2129d8c8702
Finished: ABORTED

In the remaining cases I get:


< HTTP/1.1 302 Found
< Server: Jetty(12.0.13)
< Date: Tue, 03 Dec 2024 11:57:15 GMT
< Vary: Accept-Encoding
< X-Content-Type-Options: nosniff
< Location: /job/InputTest/3/input/?inputId=CUSTOM_ID
< Content-Length: 0

My environment:


Jenkins: 2.479.2

OS: Linux - 5.15.0-126-generic

Java: 17.0.13 - Eclipse Adoptium (OpenJDK 64-Bit Server VM)

---

ansicolor:1.0.5

ant:511.v0a_a_1a_334f41b_

antisamy-markup-formatter:162.v0e6ec0fcfcf6

apache-httpcomponents-client-4-api:4.5.14-208.v438351942757

asm-api:9.7.1-97.v4cc844130d97

bootstrap5-api:5.3.3-1

bouncycastle-api:2.30.1.78.1-248.ve27176eb_46cb_

branch-api:2.1200.v4b_a_3da_2eb_db_4

build-timeout:1.33

caffeine-api:3.1.8-133.v17b_1ff2e0599

checks-api:2.2.1

cloudbees-folder:6.959.v4ed5cc9e2dd4

commons-lang3-api:3.17.0-84.vb_b_938040b_078

commons-text-api:1.12.0-129.v99a_50df237f7

credentials:1389.vd7a_b_f5fa_50a_2

credentials-binding:687.v619cb_15e923f

dark-theme:479.v661b_1b_911c01

display-url-api:2.209.v582ed814ff2f

durable-task:581.v299a_5609d767

echarts-api:5.5.1-4

eddsa-api:0.3.0-4.v84c6f0f4969e

email-ext:1861.vdb_d991590994

file-parameters:339.v4b_cc83e11455

font-awesome-api:6.6.0-2

git:5.6.0

git-client:6.1.0

github:1.40.0

github-api:1.321-478.vc9ce627ce001

github-branch-source:1807.v50351eb_7dd13

gradle:2.13.1

gson-api:2.11.0-85.v1f4e87273c33

http_request:1.19

instance-identity:201.vd2a_b_5a_468a_a_6

ionicons-api:74.v93d5eb_813d5f

jackson2-api:2.17.0-379.v02de8ec9f64c

jakarta-activation-api:2.1.3-1

jakarta-mail-api:2.1.3-1

javax-activation-api:1.2.0-7

jaxb:2.3.9-1

jjwt-api:0.11.5-112.ve82dfb_224b_a_d

joda-time-api:2.13.0-93.v9934da_29b_a_e9

jquery3-api:3.7.1-2

json-api:20240303-101.v7a_8666713110

json-path-api:2.9.0-118.v7f23ed82a_8b_8

junit:1309.v0078b_fecd6ed

ldap:770.vb_455e934581a_

mailer:489.vd4b_25144138f

matrix-auth:3.2.3

matrix-project:840.v812f627cb_578

metrics:4.2.21-458.vcf496cb_839e4

mina-sshd-api-common:2.14.0-133.vcc091215a_358

mina-sshd-api-core:2.14.0-133.vcc091215a_358

okhttp-api:4.11.0-181.v1de5b_83857df

pam-auth:1.11

pipeline-build-step:540.vb_e8849e1a_b_d8

pipeline-github-lib:61.v629f2cc41d83

pipeline-graph-analysis:216.vfd8b_ece330ca_

pipeline-graph-view:382.vb_9a_27b_7b_ea_71

pipeline-groovy-lib:744.v5b_556ee7c253

pipeline-input-step:495.ve9c153f6067b_

pipeline-milestone-step:119.vdfdc43fc3b_9a_

pipeline-model-api:2.2218.v56d0cda_37c72

pipeline-model-definition:2.2218.v56d0cda_37c72

pipeline-model-extensions:2.2218.v56d0cda_37c72

pipeline-rest-api:2.34

pipeline-stage-step:312.v8cd10304c27a_

pipeline-stage-tags-metadata:2.2218.v56d0cda_37c72

pipeline-stage-view:2.34

plain-credentials:183.va_de8f1dd5a_2b_

plugin-util-api:5.1.0

resource-disposer:0.25

scm-api:698.v8e3b_c788f0a_6

script-security:1369.v9b_98a_4e95b_2d

snakeyaml-api:2.3-123.v13484c65210a_

ssh-credentials:349.vb_8b_6b_9709f5b_

ssh-slaves:2.973.v0fa_8c0dea_f9f

structs:338.v848422169819

theme-manager:262.vc57ee4a_eda_5d

timestamper:1.28

token-macro:400.v35420b_922dcb_

trilead-api:2.147.vb_73cc728a_32e

variant:60.v7290fc0eb_b_cd

workflow-aggregator:600.vb_57cdd26fdd7

workflow-api:1336.vee415d95c521

workflow-basic-steps:1058.vcb_fc1e3a_21a_9

workflow-cps:3996.va_f5c1799f978

workflow-durable-task-step:1398.vf6c9e89e5988

workflow-job:1468.vcf4f5ee92395

workflow-multibranch:795.ve0cb_1f45ca_9a_

workflow-scm-step:427.v4ca_6512e7df1

workflow-step-api:678.v3ee58b_469476

workflow-support:936.v9fa_77211ca_e1

ws-cleanup:0.48

a response with 302 means a redirect. In the output you see the new location
/job/InputTest/3/input/?inputId=CUSTOM_ID
See the additional / before ?
So ideally you directly use this url or you tell curl to follow the redirect.

Thanks for the quick reply! I added the --location parameter to curl to follow redirects.

My request looks like:

curl -v --location -XPOST http://192.168.3.33:32734/job/InputTest/10/input/CUSTOM_ID/submit \
-u "admin:token" \
-F "CUSTOM_ID=@file.b64"

I get a response:

< HTTP/1.1 200 OK
< Server: Jetty(12.0.13)
< Date: Tue, 03 Dec 2024 19:00:35 GMT
< Vary: Accept-Encoding
< X-Content-Type-Options: nosniff
< Content-Type: text/html;charset=utf-8
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< Cache-Control: no-cache,no-store,must-revalidate
< X-Hudson-Theme: default
< Referrer-Policy: same-origin
< Cross-Origin-Opener-Policy: same-origin
< Set-Cookie: JSESSIONID.f0459c76=node014kvxlgm9j1wm1cnsi73fkzfpd4.node0; Path=/; HttpOnly
< X-Hudson: 1.395
< X-Jenkins: 2.479.2
< X-Jenkins-Session: 4826e2ef
< X-Frame-Options: sameorigin
< X-Instance-Identity: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn5XfQ8B5CtUQU1lgLwJyurwWIHrGMARtah3JT1LTjb7te2n9hJc952 acxImRbESrVT8Xpg85Yu0crJJh+uNvBJnnAhhGtQkHwy0QDN2Ejan5UOZ8W0G3ao5DmVWEH/qxPh3laY+WJxnxB7JRWIcw2W/l8 yPZaXlYXIlXsWRsZ2XdFs4SC5vBkd4jYC0mhdcY8ZXbdqltq6oPDQ1VKdZGmdWO3UDaVWzFG3zt17DjWVhYl9Yd+yG2CQ0o9x GhC1QspV5HO7wJOF66VK12gnC0XKLyrInMIukxUEDO5GD7YnlIxwMfB1z8B+M3N9ueDCcMfwwuwXtYHlGy7eVdkQqkQwIDAQAB
< Transfer-Encoding: chunked

After sending this request I see in Console Output:

Rejected by admin
org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: dc49d19c-3e28-4d01-abb9-16de44b398db
Finished: ABORTED

The request reaches Jenkins, but the behavior is similar to if I pressed the abort button in the UI.


I want to simulate pressing the Proceed button and interact with the uploaded file inside the Pipeline.

I understand that there are more conventional ways to upload a file to the Pipeline, but in this case I need to simulate pressing Submit in the input step