Недавно я хотел обновить несколько заданий (не определенных DSL) в Cloudbees, добавив к каждому из них несколько свойств.
Ну, у меня были некоторые проблемы с его работой, вот мои заметки (я использовал Jenkins 1.651.2.1, но есть вероятность, что он должен работать со старыми и более свежими версиями, такими как jenkins 2)
Нет безопасности / нет аутентификации
Это самая простая часть: получить и повторно опубликовать конфигурацию
|
1
2
|
$ curl http://localhost:8080/jenkins/job/pof/config.xml -o config.xml$ curl -X POST http://localhost:8080/jenkins/job/pof/config.xml --data-binary @config.xml |
Простая безопасность: используя имя пользователя и пароль
Теперь я предполагаю, что в вашей настройке Jenkins настроена защита ( http: // localhost: 8080 / jenkins / configureSecurity / -> enable security)
Это означает, что теперь нам нужно аутентифицировать оба наших запроса:
|
1
2
|
curl -X GET http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml -o config.xmlcurl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" |
Простая безопасность: с включенной CSRF (крошка)
Вы также хотели бы защитить свой экземпляр jenkins от CSRF-атак ( http: // localhost: 8080 / jenkins / configureSecurity / -> enable csrf crumb)

Теперь это также означает, что ваши запросы должны отправить значение крошки, либо в качестве параметра, либо через заголовок
Если вы этого не сделаете:
|
1
|
curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" |
Вы получите такие ошибки:
|
1
2
3
|
<body><h2>HTTP ERROR 403</h2><p>Problem accessing /jenkins/job/pof/config.xml. Reason:<pre> No valid crumb was included in the request</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/> |
или даже :
|
01
02
03
04
05
06
07
08
09
10
11
|
<body><h1>HTTP Status 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error () that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>java.io.IOException: Failed to persist config.xmlhudson.model.AbstractItem.updateByXml(AbstractItem.java:677)hudson.model.AbstractItem.doConfigDotXml(AbstractItem.java:617)…..</pre></p><p><b>root cause</b> <pre>javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:755)com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:357) jenkins.util.xml.XMLUtils._transform(XMLUtils.java:96) jenkins.util.xml.XMLUtils.safeTransform(XMLUtils.java:63) hudson.model.AbstractItem.updateByXml(AbstractItem.java:674) hudson.model.AbstractItem.doConfigDotXml(AbstractItem.java:617) |
Получите значение крошки:
Вы можете использовать значение crumb, используя страницу настройки задания:
|
1
|
curl http://anthony:anthony@localhost:8080/jenkins/job/pof/configure | sed -n 's/.*\.crumb", "\(.*\)").*/\1/p' > crumb.txt |
Но есть также сервис, посвященный этому:
|
1
|
curl http://anthony:anthony@localhost:8080/jenkins/crumbIssuer/api/xml | sed -n 's/.*\(.*\)<\/crumb>.*/\1/p' > crumb.txt |
Используйте значение крошки
|
1
|
curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -data ".crumb=6bbabc426436b72ec35e5ad4a4344687" |
Упс, это не сработало
|
1
2
3
4
|
Caused by: java.lang.IllegalStateException: STREAMED at org.eclipse.jetty.server.Request.getReader(Request.java:803) at javax.servlet.ServletRequestWrapper.getReader(ServletRequestWrapper.java:256) at hudson.model.AbstractItem.doConfigDotXml(AbstractItem.java:610) |
Я предлагаю вам отправить крошку, используя заголовки:
|
1
|
curl -v -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -H ".crumb: 6bbabc426436b72ec35e5ad4a4344687" |
Безопасность, основанная на куки (нет пользователя / пароля)
В некоторых установках, таких как cloubees, вы не можете передавать имя пользователя и пароль в своих запросах; Я предлагаю вам использовать куки вместо этого.
Чтобы получить их, проверьте файлы cookie, отправленные вашим аутентифицированным браузером, например, в chrome:

А затем вставьте этот URL в вашу оболочку:
|
1
|
curl 'http://localhost:8080/jenkins/job/pof/config.xml' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,fr;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://localhost:8080/jenkins/login?from=%2Fjenkins%2Fjob%2Fpof%2Fconfig.xml' -H 'Cookie: screenResolution=1440x900; JSESSIONID=XXXXX; JSESSIONID.XX=XXXX; screenResolution=1440x900' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' --compressed |
Конечно, вам все равно нужно получить значение крошки:
|
1
|
curl 'http://localhost:8080/jenkins/crumbIssuer/api/xml' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,fr;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://localhost:8080/jenkins/login?from=%2Fjenkins%2Fjob%2Fpof%2Fconfig.xml' -H 'Cookie: screenResolution=1440x900; JSESSIONID=XXXXX; JSESSIONID.XX=XXXXX; screenResolution=1440x900' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' --compressed | sed -n 's/.*<crumb>\(.*\)<\/crumb>.*/\1/p' > crumb.txt |
И теперь вы готовы опубликовать обновленный файл config.xml:
|
1
|
curl -X POST 'http://localhost:8080/jenkins/job/pof/config.xml' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,fr;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://localhost:8080/jenkins/login?from=%2Fjenkins%2Fjob%2Fpof%2Fconfig.xml' -H 'Cookie: screenResolution=1440x900; JSESSIONID=XXXX; JSESSIONID.XX=XXXX; screenResolution=1440x900' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' --compressed --data-binary "@config.xml" -H ".crumb: 6bbabc426436b72ec35e5ad4a4344687" |
связи
- https://benkiew.wordpress.com/2012/01/12/automating-hudsonjenkins-via-rest-and-curl-a-very-small-cookbook/
- https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API
| Ссылка: | Как обновить публикацию вакансии в Jenkins config.xml от нашего партнера JCG |
