You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu Server 20.04下Jenkins运行Cypress+Chromium时下载文件无法读取问题求助

解决Ubuntu Server 20.04下Jenkins运行Cypress下载文件找不到的问题

我之前也碰到过类似的场景,结合你的描述,问题核心集中在工作目录不一致、无头浏览器下载配置缺失和权限限制这几个点上,下面给你具体的解决步骤:

1. 改用绝对路径配置downloadsFolder

你当前在cypress.json里配置的是相对路径xmlfiles,但Jenkins运行时的工作目录未必是你的项目根目录(比如Jenkins可能把代码拉到/var/lib/jenkins/workspace/your-project下),这就导致Cypress找不到预期的目录。

如果你的Cypress版本是10+,建议换成cypress.config.js(比静态的cypress.json更灵活),通过path.resolve生成绝对路径:

const { defineConfig } = require('cypress')
const path = require('path')

module.exports = defineConfig({
  downloadsFolder: path.resolve(__dirname, 'xmlfiles'), // 基于配置文件所在目录生成绝对路径
  e2e: {
    // 其他项目配置...
  }
})

如果是旧版本Cypress(仍用cypress.json),可以在plugins/index.js里动态覆盖配置:

const path = require('path')

module.exports = (on, config) => {
  // 从plugins目录往上跳一级到项目根目录,拼接xmlfiles路径
  config.downloadsFolder = path.resolve(__dirname, '../xmlfiles')
  return config
}

2. 配置Chromium无头模式的下载偏好

Ubuntu Server上运行的是无头Chromium,默认下载行为和桌面版有差异,需要显式指定下载路径,确保和Cypress的downloadsFolder完全一致。

在cypress.config.js的setupNodeEvents里添加浏览器配置:

module.exports = defineConfig({
  downloadsFolder: path.resolve(__dirname, 'xmlfiles'),
  e2e: {
    setupNodeEvents(on, config) {
      on('before:browser:launch', (browser = {}, launchOptions) => {
        // 只针对Chromium浏览器配置
        if (browser.family === 'chromium' && browser.name !== 'electron') {
          launchOptions.preferences.default.download.default_directory = config.downloadsFolder
          launchOptions.preferences.default.download.prompt_for_download = false // 禁用下载提示
          launchOptions.preferences.default.directory_upgrade = true // 允许替换已存在的目录
        }
        return launchOptions
      })
    },
  },
})

旧版本则在plugins/index.js里配置:

module.exports = (on, config) => {
  config.downloadsFolder = path.resolve(__dirname, '../xmlfiles')
  
  on('before:browser:launch', (browser, launchOptions) => {
    if (browser.family === 'chromium') {
      launchOptions.preferences.default.download.default_directory = config.downloadsFolder
      launchOptions.preferences.default.download.prompt_for_download = false
      launchOptions.preferences.default.directory_upgrade = true
    }
    return launchOptions
  })
  
  return config
}

3. 确保Jenkins有目录读写权限

Jenkins默认用jenkins用户运行,可能没有权限创建或写入你的xmlfiles目录。可以在Jenkins的构建步骤里先添加命令:

mkdir -p xmlfiles && chown -R jenkins:jenkins xmlfiles

如果是测试环境,也可以用更宽松的权限(不推荐生产环境):

mkdir -p xmlfiles && chmod 775 xmlfiles

4. 验证实际下载路径

在你的测试代码里添加一行打印,确认Cypress使用的下载路径是否正确:

cy.log(`实际下载目录:${Cypress.config('downloadsFolder')}`)

然后查看Jenkins的构建日志,确认路径是你预期的绝对路径,避免出现路径拼接错误。

5. 处理Ubuntu Server无默认Downloads目录的情况

Ubuntu Server默认没有用户的Downloads文件夹,而Cypress在未显式指定downloadsFolder时,会尝试使用系统默认的下载目录,这就会导致找不到目录的问题。所以必须显式配置绝对路径的downloadsFolder,彻底避免这个 fallback 行为。


内容的提问来源于stack exchange,提问作者IFThenElse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:48:11