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变量?

如何在 Jenkins env 变量中为 Headless Chrome 配置 CHROME_BIN 路径

如何在 Mac 上获取 jenkins 的初始管理员密码?

如何将 NodeJs 与 Jenkins 集成?

chromedriver 在前台运行的 windows jenkins slave 上失败