Chrome 没有为 Jenkins 上发布的 CSS 文件发送 Session-Cookie
Posted
技术标签:
【中文标题】Chrome 没有为 Jenkins 上发布的 CSS 文件发送 Session-Cookie【英文标题】:Chrome not sending Session-Cookie for CSS Files published on Jenkins 【发布时间】:2021-12-23 22:23:27 【问题描述】:我有一个创建 html 和 CSS 文件的 jenkins 管道。使用 Firefox 时一切正常。使用最新的 Chrome (95.0.4638.69) 时,不会加载 css 文件。
问题似乎是Chrome在加载HTML文件并请求CSS文件时没有发送Session-Cookie(使用开发者工具检查,当Chrome请求CSS时,我在network-tab中看到403 Forbidden ,请求 HTML 文件时正确发送 cookie)。 当我直接在 chrome 中访问 CSS URL 时,会发送 cookie 并得到响应。
HTML 页面上唯一的特殊之处: Jenkins 设置了以下标题:
Content-Security-Policy: sandbox; default-src 'none'; img-src 'self'; style-src 'self';
X-Content-Security-Policy: sandbox; default-src 'none'; img-src 'self'; style-src 'self';
X-Content-Type-Options: nosniff
X-WebKit-CSP: sandbox; default-src 'none'; img-src 'self'; style-src 'self';
但据我了解 style-src 'self' 意味着允许来自同一服务器的 CSS。在我的示例中,HTML 位于 http://localhost:8080/job/aaa/4/artifact/result.html
,CSS 位于 http://localhost:8080/job/aaa/4/artifact/styles.css
。
我创建了一个简单的 Jenkinsfile 用于测试:
pipeline
agent any
stages
stage('Create HTML')
steps
createHtml()
def createHtml()
createHtmlPage();
createStylesheetFile();
archive (includes: '*.html,*.css')
publishHTML([allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: '.',
reportFiles: 'result.html',
reportName: 'Test'
])
private void createHtmlPage()
String result = """<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Test</h1>
</body>
</html>
"""
writeFile file: 'result.html', text: result
private String createStylesheetFile()
String styles = """
body
font-family: Arial, Helvetica, sans-serif;
color: blue;
background: green;
"""
writeFile file: 'styles.css', text: styles
我也尝试在 Jenkins 中禁用 CSP 设置,但得到了相同的结果。
通过进一步搜索和点击,我发现 Chrome 没有发送 cookie,因为 Jenkins 创建它时没有“SameSite”属性。因此 chrome 将其设置为“Lax”,这意味着“Cookie 不会在正常的跨站点子请求上发送”。
所以我尝试找出如何在 Jenkins 中设置 SameSite。
【问题讨论】:
【参考方案1】:经过一番搜索,我找到了一些资源和答案:
-
Jenkins 会话 Cookie 是在没有“SameSite”属性的情况下创建的。所以它被设置为'Lax'。这不允许在子请求上发送 Cookie。见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
通过 Admin-GUI 更改 Jenkins 中的 CSP 设置后,您需要注销/登录。这里描述了更改设置的过程:Jenkins - HTML Publisher Plugin - No CSS is displayed when report is viewed in Jenkins Server
我发现 Jenkins 问题解决了一些变通办法:https://issues.jenkins.io/browse/JENKINS-61925?attachmentViewMode=list - 我将内容安全策略更改为“沙盒允许相同的来源;default-src 'none'; img-src 'self'; style- src‘自我’;”现在它可以工作了
我希望 Jenkins 更改 Session-Cookie 的 cookie 设置。在那之前,我不知道任何其他解决方案。
【讨论】:
以上是关于Chrome 没有为 Jenkins 上发布的 CSS 文件发送 Session-Cookie的主要内容,如果未能解决你的问题,请参考以下文章
部署到生产以进行角度测试覆盖时如何在 jenkins 中设置 CHROME_BIN
jenkins运行python脚本,失败,以在jenlins配置python变量?