詹金斯:403 请求中未包含有效的碎屑
Jenkins: 403 No valid crumb was included in the request
我按如下方式在 spinnaker 中配置了 jenkins 并设置了 spinnaker 管道。
jenkins:
# If you are integrating Jenkins, set its location here using the baseUrl
# field and provide the username/password credentials.
# You must also enable the "igor" service listed separately.
#
# If you have multiple jenkins servers, you will need to list
# them in an igor-local.yml. See jenkins.masters in config/igor.yml.
#
# Note that jenkins is not installed with Spinnaker so you must obtain this
# on your own if you are interested.
enabled: ${services.igor.enabled:false}
defaultMaster:
name: default
baseUrl: http://server:8080
username: spinnaker
password: password
但是我在尝试 运行 spinnaker 管道时看到以下错误。
Exception ( Start Jenkins Job )
403 No valid crumb was included in the request
Crumb 只不过是访问令牌。下面是 api 获取面包屑
https://jenkins.xxx.xxx.xxx/crumbIssuer/api/json
// 用你的 jenkins url 替换它并在你的邮递员或 rest-api 调用者中进行 GET 调用。
这将生成如下输出:
{
"_class": "hudson.security.csrf.DefaultCrumbIssuer",
"crumb": "ba4742b9d92606f4236456568a",
"crumbRequestField": "Jenkins-Crumb"
}
以下是更多详细信息以及与之相关的 link:
How to request for Crumb issuer for jenkins
詹金斯维基页面:
https://wiki.jenkins-ci.org/display/jenkins/remote+access+api
如果您通过 rest-api 调用相同的调用,请查看下面的 link,其中解释了如何使用 jenkins-crumb
调用 rest 调用
https://blog.dahanne.net/2016/05/17/how-to-update-a-jenkins-job-posting-config-xml/
示例:
curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -data ".crumb=6bbabc426436b72ec35e5ad4a4344687"
为了解决这个问题,我在 jenkins.com/configureSecurity 部分取消选中 "Prevent Cross Site Request Forgery exploits",它开始工作了。
最后,这个 post 帮助我解决了面包屑问题,但仍然保护 Jenkins 免受 CSRF 攻击。
Solution for no-valid crumb included in the request issue
基本上,我们需要先请求带有身份验证的 crumb,然后发出 POST api 调用带有 crumb 作为 header 并再次进行身份验证。
我就是这样做的,
curl -v -X GET http://jenkins-url:8080/crumbIssuer/api/json --user <username>:<password>
回复是,
{
"_class":"hudson.security.csrf.DefaultCrumbIssuer",
"crumb":"0db38413bd7ec9e98974f5213f7ead8b",
"crumbRequestField":"Jenkins-Crumb"
}
然后是 POST api 上面的面包屑信息。
curl -X POST http://jenkins-url:8080/job/<job-name>/build --user <username>:<password> -H 'Jenkins-Crumb: 0db38413bd7ec9e98974f5213f7ead8b'
This solution is SAFE to use
当我们将 jenkins 更改为可通过反向代理访问时,出现了这个问题。
“配置全局安全性”中有一个选项“启用代理兼容性”
这有助于解决我的问题。
Other Solution
在 Github 有效负载 URL 中使你的 url 看起来像这样
https://jenkins:8080/github-webhook/
最后别忘了提一下 /
前往管理 Jenkins => 配置全局安全性。
然后取消选中“防止跨站请求伪造利用”
当我使用 jenkins-client 库从 java 程序创建 jenkins 作业时,我确实遇到了相同的“403 请求中没有包含有效的碎屑”错误,即 com.offbytwo.jenkins。然后我在下面的代码中使用了 jenkins api 令牌而不是密码。现在,问题已解决。
JenkinsServer jServer = new JenkinsServer(new URI(jenkins_url), jnkn_username, jnkn_password);
我们可以从 Jenkins 控制台生成 API 令牌。配置文件 > 配置 > API 令牌(添加新令牌)
也可以使用相同的 API 令牌代替带有 curl 的密码。
curl -v -X POST http://jenkins-url:port/job/<job-name>/buildWithParameters?param=value --user <jen_username>:<jenkins_api_token>
我 运行 遇到了同样的问题。我只刷新了我的浏览器,重新登录到 Jenkins,执行相同的过程,一切正常。
对于新版本的 Jenkins,您应该遵循以下解决方案:
https://jenkins.io/doc/upgrade-guide/2.176/#upgrading-to-jenkins-lts-2-176-3
Upgrading to Jenkins 2.176.2 Improved CSRF protection
SECURITY-626
CSRF tokens (crumbs) are now only valid for the web session they were
created in to limit the impact of attackers obtaining them. Scripts
that obtain a crumb using the /crumbIssuer/api URL will now fail to
perform actions protected from CSRF unless the scripts retain the web
session ID in subsequent requests. Scripts could instead use an API
token, which has not required a CSRF token (crumb) since Jenkins 2.96.
To disable this improvement you can set the system property
hudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_ID to true.
Alternatively, you can install the Strict Crumb Issuer Plugin which
provides more options to customize the crumb validation. It allows
excluding the web session ID from the validation criteria, and instead
e.g. replacing it with time-based expiration for similar (or even
better) protection from CSRF
就我而言,帮助安装了 Strict Crumb Issuer 插件,
重新启动 jenkins 并按照供应商网站上的建议对 Jenkins 的 Web 界面应用不太严格的策略。
因为这个问题是在Google中搜索"No valid crumb was included in the request"时的第一个SO link,我认为值得一提的是如果你omit/forget也会产生同样的错误授权 HTTP header 或使用空白 username/password:
而且,是的,第一个屏幕截图中传递的面包屑实际上是有效的;一切都适用于正确的 username/password:
所以,不确定这是否是错误,但 "No valid crumb was included in the request" 也可能意味着您不小心忘记了授权 header。
Jenkins 2.222.3,Ubuntu 服务器 20.04,Java 运行时 1.8。0_252-8u252-b09-1ubuntu1-b09
根据Jenkins Directive
首先,如果版本 < 2.176.2,则必须检查 Jenkins 版本,然后根据 Jenkins 指南,CSRF 令牌(面包屑)现在仅对创建它们的 Web 会话有效,以限制攻击者获取它们的影响。使用 /crumbIssuer/api URL 获取面包屑的脚本现在将无法执行受 CSRF 保护的操作,除非脚本在后续请求中保留 Web 会话 ID。
或者,您可以安装 Strict Crumb Issuer 插件,它提供更多选项来自定义 crumb 验证。它允许从验证标准中排除网络会话 ID,而不是例如将其替换为基于时间的过期,以获得类似(甚至更好)的 CSRF 保护。
步骤:
- 您必须安装名为“Strict Crumb Issuer”的插件
- 安装完成后重启 jenkins 服务
- 进入“管理 Jenkins”-->“配置全局安全”--> 在 CSRF 保护下,select 从下拉列表中选择“严格的面包屑问题”--> 点击高级并取消选中所有内容但是 select“防止破坏攻击”选项。 --> 应用并保存。
- 现在 运行 你弄碎了脚本。
现在应该可以了。
Check this image for your reference
我花了很多时间来弄清楚这个问题。最后我只是安装了这个插件 https://plugins.jenkins.io/build-token-root/ and enabled build permission to anonymous users. At the end doesn't really mather because the jenkins instance is behind a VPN and I'm using https://smee.io 来将 webhook 转发到 Jenkins 实例。此外,Jenkins 实例位于反向代理之后,因此还选中了“启用代理兼容性”选项,并且在服务器级别的 Nginx 配置中将“ignore_invalid_headers”设置设置为关闭。分享我的解决方案,以防其他人也遇到困难。我敢肯定有更好的方法来做到这一点,但这是一种选择。
请注意,使用此插件构建 url 设置为 buildByToken/build?job=JobName&token=TokenValue 并且在作业设置中生成令牌.
这是在 Jenkins 2.235.2 中,它没有禁用 CSRF 的选项。
我通过使用 API TOKEN 作为基本身份验证密码解决了这个问题。方法如下
curl -v -X POST http://jenkins-url:8080/job/<job-name>/buildWithParameters?param=value --user <username>:<token>
注意:在帐户图标下创建 API 令牌 -> 配置 -> API 令牌-> 添加新令牌
我是 运行 nginx 的反向代理。将“配置全局安全性”中的 jenkins 选项更改为“启用代理兼容性”这解决了我的问题。
对于 java 访问 Jenkins 的代码 API 我会提出建议。
@Santhosh () 的回答确实解决了这个问题,包括将 password 更改为 token ,但据我所知,令牌现在是一种传统方式。
所以我尝试了其他方法,并在 java 代码中找到了解决方案。
我是怎么做到的。
在我的 java 代码中,我使用“com.offbytwo.jenkins” package 并且我使用的 class 是“ JenkinsServer".
我的问题是在 jenkins 中创建一个作业,因为我收到错误:“403 请求 中没有包含有效的碎屑”
然后我找到了一个名为 crumbFlag 的布尔参数,并在其上传递了“true”,一切正常。
我的代码是这样的:
jenkins.createJob(job.getName(), config);
然后,我改变了这个 ans 非常有效:
jenkins.createJob(job.getName(), config, true);
这个参数几乎在这个包的所有方法里面,例如:
- createJob(String jobName, String jobXml, Boolean crumbFlag)
- updateJob(String jobName, String jobXml, boolean crumbFlag)
- renameJob(String oldJobName, String newJobName, Boolean crumbFlag)
- 其他。
代码里面的技术文档是:
@param crumbFlag true
to add crumbIssuer
* false
otherwise.
我知道如果你为这个参数传递“true”它会自动发出一个面包屑。
嗯,官方文档有这个详细信息,如果你想看这里:
首先创建一个用户API令牌,方法是转到用户-->API令牌-->添加新令牌。
然后使用下面的脚本触发。
import jenkins,requests
job_name='sleep_job'
jenkins_url = "http://10.10.10.294:8080"
auth = ("jenkins","1143e7efc9371dde2e4f312345bec")
request_url = "{0:s}/job/{1:s}/buildWithParameters".format(jenkins_url,
job_name, )
crumb_data = requests.get("{0:s}/crumbIssuer/api/json".format(jenkins_url),
auth=auth, ).json()
headers = {'Jenkins-Crumb': crumb_data['crumb']}
jenkins_job_params={}
jenkins_job_params['NODE_NAME']='10_10_1_29'
jenkins_job_params['SLEEP_TIME']='1h'
response = requests.post(request_url, data=jenkins_job_params, auth=auth, )
response.raise_for_status()
此 guide 解释了如何生成 Jenkins crumb、保存 cookie 以及在需要身份验证的后续请求中同时使用 crumb 和保存的 cookie。这是Jenkins V2.176.2之后的必备
我在尝试使用 GitHub Pull Request Builder 设置 GitHub 项目时遇到了同样的问题插件
- 这是我从 Jenkins 服务器
获得的响应示例
- 回复内容
问题的发生是因为我的 有效负载 URL 在末尾缺少正斜杠 /
.
在url末尾添加正斜杠解决问题
你的负载 url 应该是这样的 https://jenkins.host.com/ghprbhook/
添加正斜杠后的示例
这是我对这个问题的解决方案(git 钩子在反向代理后面启动 jenkins 作业)
#从第一次调用中获取 CRUMB 并将 sessionid 存储在 cookie jar 中:
CRUMB=$(/usr/bin/curl --cookie-jar ./cookie -sX GET https://******.net/crumbIssuer/api/json|cut -d'"' -f8)
#启动任务:
/usr/bin/curl --cookie ./cookie -X POST https://******.net/job/PROJECTNAME/build -H "Jenkins-Crumb: $CRUMB"
您需要一个 2 步程序来首先从服务器获取面包屑然后使用它。
我正在使用这个 bash 脚本并为此卷曲:
#!/bin/bash
# buildme.sh Runs a build Jenkins build job that requires a crumb
# e.g.
# $ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
# Replace with your admin credentials, build job name and Jenkins URL
#
# More background:
# https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained
USERPASSWORD=
JOB=
SERVER=
# File where web session cookie is saved
COOKIEJAR="$(mktemp)"
CRUMB=$(curl -f -u "$USERPASSWORD" --cookie-jar "$COOKIEJAR" "$SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
status=$?
if [[ $status -eq 0 ]] ; then
curl -f -X POST -u "$USERPASSWORD" --cookie "$COOKIEJAR" -H "$CRUMB" "$SERVER"/job/"$JOB"/build
status=$?
fi
rm "$COOKIEJAR"
exit $status
以下是使用您需要的参数执行此脚本的示例:
$ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
如果其中一个 curl 命令因任何原因失败,此脚本将 return 一个错误代码。
可以从cloudbees
中找到更多详细信息
对我来说,解决方案是通过 X-Forwarded-Host
和 X-Forwarded-Port
headers
按照手册 reverse-proxy-configuration-troubleshooting 章节中的建议。
HaProxy 配置,在 frontend
部分内:
http-request set-header X-Forwarded-Host %[hdr(host)]
http-request set-header X-Forwarded-Port %[dst_port]
我也遇到了类似的问题,我使用的是密码而不是 token
。
更新后解决了我的问题,无需取消选中任何内容并使其不安全。以下是我让 jenkins CLI 工作所遵循的完整步骤-
步骤-1:-准备环境变量
export JENKINS_URL=http://localhost:8080/
export JENKINS_USER=admin
export JENKINS_PASSWORD=b7f04f4efe5ee117912a1.....
export JENKINS_CRUMB=f360....
export FOLDER=test
获取令牌为-
获取 CRUMB 作为-
http://localhost:8080/crumbIssuer/api/json
step-2 :-准备XML文件,文件名creds.xml
<com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
<scope>GLOBAL</scope>
<id>TEST-CLI</id>
<username>test</username>
<password>test123</password>
<description>this secret if created confirms that jenkins-cli is working</description>
</com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
步骤 3:- POST 使用 curl
curl -X POST -u $JENKINS_USER:$JENKINS_PASSWORD -H "Jenkins-Crumb:${JENKINS_CRUMB}" -H 'content-type:application/xml' -d @creds.xml "$JENKINS_URL/job/$FOLDER/credentials/store/folder/domain/_/createCredentials"
用 https://...
而不是 http://...
访问 jenkins 解决了我的问题
对我来说,以下解决方案适用于 bitbucket:
已将 URL 更新为:
http://jenkinsurl:8080/bitbucket-hook/
Bitbucket 网络钩子:
就我而言,我能够通过直接使用远程桌面进入 Jenkins 服务器并使用基于本地主机 URL 而不是尝试从我的计算机通过公司代理来绕过错误。
我按如下方式在 spinnaker 中配置了 jenkins 并设置了 spinnaker 管道。
jenkins:
# If you are integrating Jenkins, set its location here using the baseUrl
# field and provide the username/password credentials.
# You must also enable the "igor" service listed separately.
#
# If you have multiple jenkins servers, you will need to list
# them in an igor-local.yml. See jenkins.masters in config/igor.yml.
#
# Note that jenkins is not installed with Spinnaker so you must obtain this
# on your own if you are interested.
enabled: ${services.igor.enabled:false}
defaultMaster:
name: default
baseUrl: http://server:8080
username: spinnaker
password: password
但是我在尝试 运行 spinnaker 管道时看到以下错误。
Exception ( Start Jenkins Job ) 403 No valid crumb was included in the request
Crumb 只不过是访问令牌。下面是 api 获取面包屑
https://jenkins.xxx.xxx.xxx/crumbIssuer/api/json
// 用你的 jenkins url 替换它并在你的邮递员或 rest-api 调用者中进行 GET 调用。
这将生成如下输出:
{
"_class": "hudson.security.csrf.DefaultCrumbIssuer",
"crumb": "ba4742b9d92606f4236456568a",
"crumbRequestField": "Jenkins-Crumb"
}
以下是更多详细信息以及与之相关的 link: How to request for Crumb issuer for jenkins 詹金斯维基页面: https://wiki.jenkins-ci.org/display/jenkins/remote+access+api
如果您通过 rest-api 调用相同的调用,请查看下面的 link,其中解释了如何使用 jenkins-crumb
调用 rest 调用https://blog.dahanne.net/2016/05/17/how-to-update-a-jenkins-job-posting-config-xml/
示例:
curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -data ".crumb=6bbabc426436b72ec35e5ad4a4344687"
为了解决这个问题,我在 jenkins.com/configureSecurity 部分取消选中 "Prevent Cross Site Request Forgery exploits",它开始工作了。
最后,这个 post 帮助我解决了面包屑问题,但仍然保护 Jenkins 免受 CSRF 攻击。
Solution for no-valid crumb included in the request issue
基本上,我们需要先请求带有身份验证的 crumb,然后发出 POST api 调用带有 crumb 作为 header 并再次进行身份验证。
我就是这样做的,
curl -v -X GET http://jenkins-url:8080/crumbIssuer/api/json --user <username>:<password>
回复是,
{
"_class":"hudson.security.csrf.DefaultCrumbIssuer",
"crumb":"0db38413bd7ec9e98974f5213f7ead8b",
"crumbRequestField":"Jenkins-Crumb"
}
然后是 POST api 上面的面包屑信息。
curl -X POST http://jenkins-url:8080/job/<job-name>/build --user <username>:<password> -H 'Jenkins-Crumb: 0db38413bd7ec9e98974f5213f7ead8b'
This solution is SAFE to use
当我们将 jenkins 更改为可通过反向代理访问时,出现了这个问题。
“配置全局安全性”中有一个选项“启用代理兼容性” 这有助于解决我的问题。
Other Solution
在 Github 有效负载 URL 中使你的 url 看起来像这样
https://jenkins:8080/github-webhook/
最后别忘了提一下 /
前往管理 Jenkins => 配置全局安全性。
然后取消选中“防止跨站请求伪造利用”
当我使用 jenkins-client 库从 java 程序创建 jenkins 作业时,我确实遇到了相同的“403 请求中没有包含有效的碎屑”错误,即 com.offbytwo.jenkins。然后我在下面的代码中使用了 jenkins api 令牌而不是密码。现在,问题已解决。
JenkinsServer jServer = new JenkinsServer(new URI(jenkins_url), jnkn_username, jnkn_password);
我们可以从 Jenkins 控制台生成 API 令牌。配置文件 > 配置 > API 令牌(添加新令牌)
也可以使用相同的 API 令牌代替带有 curl 的密码。
curl -v -X POST http://jenkins-url:port/job/<job-name>/buildWithParameters?param=value --user <jen_username>:<jenkins_api_token>
我 运行 遇到了同样的问题。我只刷新了我的浏览器,重新登录到 Jenkins,执行相同的过程,一切正常。
对于新版本的 Jenkins,您应该遵循以下解决方案:
https://jenkins.io/doc/upgrade-guide/2.176/#upgrading-to-jenkins-lts-2-176-3
Upgrading to Jenkins 2.176.2 Improved CSRF protection
SECURITY-626
CSRF tokens (crumbs) are now only valid for the web session they were created in to limit the impact of attackers obtaining them. Scripts that obtain a crumb using the /crumbIssuer/api URL will now fail to perform actions protected from CSRF unless the scripts retain the web session ID in subsequent requests. Scripts could instead use an API token, which has not required a CSRF token (crumb) since Jenkins 2.96.
To disable this improvement you can set the system property hudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_ID to true. Alternatively, you can install the Strict Crumb Issuer Plugin which provides more options to customize the crumb validation. It allows excluding the web session ID from the validation criteria, and instead e.g. replacing it with time-based expiration for similar (or even better) protection from CSRF
就我而言,帮助安装了 Strict Crumb Issuer 插件, 重新启动 jenkins 并按照供应商网站上的建议对 Jenkins 的 Web 界面应用不太严格的策略。
因为这个问题是在Google中搜索"No valid crumb was included in the request"时的第一个SO link,我认为值得一提的是如果你omit/forget也会产生同样的错误授权 HTTP header 或使用空白 username/password:
而且,是的,第一个屏幕截图中传递的面包屑实际上是有效的;一切都适用于正确的 username/password:
所以,不确定这是否是错误,但 "No valid crumb was included in the request" 也可能意味着您不小心忘记了授权 header。
Jenkins 2.222.3,Ubuntu 服务器 20.04,Java 运行时 1.8。0_252-8u252-b09-1ubuntu1-b09
根据Jenkins Directive 首先,如果版本 < 2.176.2,则必须检查 Jenkins 版本,然后根据 Jenkins 指南,CSRF 令牌(面包屑)现在仅对创建它们的 Web 会话有效,以限制攻击者获取它们的影响。使用 /crumbIssuer/api URL 获取面包屑的脚本现在将无法执行受 CSRF 保护的操作,除非脚本在后续请求中保留 Web 会话 ID。
或者,您可以安装 Strict Crumb Issuer 插件,它提供更多选项来自定义 crumb 验证。它允许从验证标准中排除网络会话 ID,而不是例如将其替换为基于时间的过期,以获得类似(甚至更好)的 CSRF 保护。
步骤:
- 您必须安装名为“Strict Crumb Issuer”的插件
- 安装完成后重启 jenkins 服务
- 进入“管理 Jenkins”-->“配置全局安全”--> 在 CSRF 保护下,select 从下拉列表中选择“严格的面包屑问题”--> 点击高级并取消选中所有内容但是 select“防止破坏攻击”选项。 --> 应用并保存。
- 现在 运行 你弄碎了脚本。
现在应该可以了。
Check this image for your reference
我花了很多时间来弄清楚这个问题。最后我只是安装了这个插件 https://plugins.jenkins.io/build-token-root/ and enabled build permission to anonymous users. At the end doesn't really mather because the jenkins instance is behind a VPN and I'm using https://smee.io 来将 webhook 转发到 Jenkins 实例。此外,Jenkins 实例位于反向代理之后,因此还选中了“启用代理兼容性”选项,并且在服务器级别的 Nginx 配置中将“ignore_invalid_headers”设置设置为关闭。分享我的解决方案,以防其他人也遇到困难。我敢肯定有更好的方法来做到这一点,但这是一种选择。
请注意,使用此插件构建 url 设置为 buildByToken/build?job=JobName&token=TokenValue 并且在作业设置中生成令牌.
这是在 Jenkins 2.235.2 中,它没有禁用 CSRF 的选项。
我通过使用 API TOKEN 作为基本身份验证密码解决了这个问题。方法如下
curl -v -X POST http://jenkins-url:8080/job/<job-name>/buildWithParameters?param=value --user <username>:<token>
注意:在帐户图标下创建 API 令牌 -> 配置 -> API 令牌-> 添加新令牌
我是 运行 nginx 的反向代理。将“配置全局安全性”中的 jenkins 选项更改为“启用代理兼容性”这解决了我的问题。
对于 java 访问 Jenkins 的代码 API 我会提出建议。
@Santhosh (
我是怎么做到的。 在我的 java 代码中,我使用“com.offbytwo.jenkins” package 并且我使用的 class 是“ JenkinsServer".
我的问题是在 jenkins 中创建一个作业,因为我收到错误:“403 请求 中没有包含有效的碎屑”
然后我找到了一个名为 crumbFlag 的布尔参数,并在其上传递了“true”,一切正常。
我的代码是这样的:
jenkins.createJob(job.getName(), config);
然后,我改变了这个 ans 非常有效:
jenkins.createJob(job.getName(), config, true);
这个参数几乎在这个包的所有方法里面,例如:
- createJob(String jobName, String jobXml, Boolean crumbFlag)
- updateJob(String jobName, String jobXml, boolean crumbFlag)
- renameJob(String oldJobName, String newJobName, Boolean crumbFlag)
- 其他。
代码里面的技术文档是:
@param crumbFlag
true
to add crumbIssuer *false
otherwise.
我知道如果你为这个参数传递“true”它会自动发出一个面包屑。
嗯,官方文档有这个详细信息,如果你想看这里:
首先创建一个用户API令牌,方法是转到用户-->API令牌-->添加新令牌。
然后使用下面的脚本触发。
import jenkins,requests
job_name='sleep_job'
jenkins_url = "http://10.10.10.294:8080"
auth = ("jenkins","1143e7efc9371dde2e4f312345bec")
request_url = "{0:s}/job/{1:s}/buildWithParameters".format(jenkins_url,
job_name, )
crumb_data = requests.get("{0:s}/crumbIssuer/api/json".format(jenkins_url),
auth=auth, ).json()
headers = {'Jenkins-Crumb': crumb_data['crumb']}
jenkins_job_params={}
jenkins_job_params['NODE_NAME']='10_10_1_29'
jenkins_job_params['SLEEP_TIME']='1h'
response = requests.post(request_url, data=jenkins_job_params, auth=auth, )
response.raise_for_status()
此 guide 解释了如何生成 Jenkins crumb、保存 cookie 以及在需要身份验证的后续请求中同时使用 crumb 和保存的 cookie。这是Jenkins V2.176.2之后的必备
我在尝试使用 GitHub Pull Request Builder 设置 GitHub 项目时遇到了同样的问题插件
- 这是我从 Jenkins 服务器 获得的响应示例
- 回复内容
问题的发生是因为我的 有效负载 URL 在末尾缺少正斜杠
/
.在url末尾添加正斜杠解决问题
你的负载 url 应该是这样的
https://jenkins.host.com/ghprbhook/
添加正斜杠后的示例
这是我对这个问题的解决方案(git 钩子在反向代理后面启动 jenkins 作业)
#从第一次调用中获取 CRUMB 并将 sessionid 存储在 cookie jar 中:
CRUMB=$(/usr/bin/curl --cookie-jar ./cookie -sX GET https://******.net/crumbIssuer/api/json|cut -d'"' -f8)
#启动任务:
/usr/bin/curl --cookie ./cookie -X POST https://******.net/job/PROJECTNAME/build -H "Jenkins-Crumb: $CRUMB"
您需要一个 2 步程序来首先从服务器获取面包屑然后使用它。 我正在使用这个 bash 脚本并为此卷曲:
#!/bin/bash
# buildme.sh Runs a build Jenkins build job that requires a crumb
# e.g.
# $ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
# Replace with your admin credentials, build job name and Jenkins URL
#
# More background:
# https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained
USERPASSWORD=
JOB=
SERVER=
# File where web session cookie is saved
COOKIEJAR="$(mktemp)"
CRUMB=$(curl -f -u "$USERPASSWORD" --cookie-jar "$COOKIEJAR" "$SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
status=$?
if [[ $status -eq 0 ]] ; then
curl -f -X POST -u "$USERPASSWORD" --cookie "$COOKIEJAR" -H "$CRUMB" "$SERVER"/job/"$JOB"/build
status=$?
fi
rm "$COOKIEJAR"
exit $status
以下是使用您需要的参数执行此脚本的示例:
$ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
如果其中一个 curl 命令因任何原因失败,此脚本将 return 一个错误代码。
可以从cloudbees
中找到更多详细信息对我来说,解决方案是通过 X-Forwarded-Host
和 X-Forwarded-Port
headers
按照手册 reverse-proxy-configuration-troubleshooting 章节中的建议。
HaProxy 配置,在 frontend
部分内:
http-request set-header X-Forwarded-Host %[hdr(host)]
http-request set-header X-Forwarded-Port %[dst_port]
我也遇到了类似的问题,我使用的是密码而不是 token
。
更新后解决了我的问题,无需取消选中任何内容并使其不安全。以下是我让 jenkins CLI 工作所遵循的完整步骤-
步骤-1:-准备环境变量
export JENKINS_URL=http://localhost:8080/
export JENKINS_USER=admin
export JENKINS_PASSWORD=b7f04f4efe5ee117912a1.....
export JENKINS_CRUMB=f360....
export FOLDER=test
获取令牌为-
获取 CRUMB 作为- http://localhost:8080/crumbIssuer/api/json
step-2 :-准备XML文件,文件名creds.xml
<com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
<scope>GLOBAL</scope>
<id>TEST-CLI</id>
<username>test</username>
<password>test123</password>
<description>this secret if created confirms that jenkins-cli is working</description>
</com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
步骤 3:- POST 使用 curl
curl -X POST -u $JENKINS_USER:$JENKINS_PASSWORD -H "Jenkins-Crumb:${JENKINS_CRUMB}" -H 'content-type:application/xml' -d @creds.xml "$JENKINS_URL/job/$FOLDER/credentials/store/folder/domain/_/createCredentials"
用 https://...
而不是 http://...
访问 jenkins 解决了我的问题
对我来说,以下解决方案适用于 bitbucket:
已将 URL 更新为:
http://jenkinsurl:8080/bitbucket-hook/
Bitbucket 网络钩子:
就我而言,我能够通过直接使用远程桌面进入 Jenkins 服务器并使用基于本地主机 URL 而不是尝试从我的计算机通过公司代理来绕过错误。