GitHub Actions中Cypress E2E测试无法读取环境变量的问题求助
问题原因分析
本地运行正常是因为你的系统环境里已经存在CYPRESS_UAM_BASE_URL、CYPRESS_UAM_BASIC_AUTH这些变量,Node进程启动时能直接读取到。但GitHub Actions的CI环境是全新的,这些变量默认不会自动出现在nx命令的运行环境中,导致Cypress配置里的process.env拿不到值。
优化解决方案
方案1:在GitHub Actions workflow中直接注入环境变量
在执行npx nx run的步骤里,通过env字段声明需要传递的变量,让Node进程能直接读取到这些变量:
- name: Run Cypress E2E Tests env: CYPRESS_UAM_BASE_URL: ${{ secrets.UAM_BASE_URL }} # 敏感变量用secrets,非敏感可直接写值或用workflow变量 CYPRESS_UAM_BASIC_AUTH: ${{ secrets.UAM_BASIC_AUTH }} run: npx nx run ${{ inputs.repo_project_name }}:e2e
这种方式无需修改Cypress配置,和本地运行逻辑完全一致。
方案2:用.env文件统一管理变量
Cypress会自动加载项目根目录的.env文件,你可以在CI步骤中生成该文件并写入变量:
- name: Create .env file run: | echo "CYPRESS_UAM_BASE_URL=${{ secrets.UAM_BASE_URL }}" >> .env echo "CYPRESS_UAM_BASIC_AUTH=${{ secrets.UAM_BASIC_AUTH }}" >> .env - name: Run Cypress E2E Tests run: npx nx run ${{ inputs.repo_project_name }}:e2e
同时可以简化Cypress配置,因为Cypress会自动把.env里带CYPRESS_前缀的变量加入到自身环境中:
// 简化后的Cypress e2e配置 e2e: { ...nxE2EPreset(__filename, { cypressDir: 'cypress' }), baseUrl: 'http://localhost:4201', pageLoadTimeout: 100000, env: { JDC_ALIAS: 'http://localhost:4201', // 可移除CYPRESS_开头的变量,Cypress会自动加载 }, },
方案3:通过Nx的project.json配置注入变量
找到对应项目的project.json文件,在e2e目标的options里添加env占位符配置:
{ "targets": { "e2e": { "executor": "@nx/cypress:cypress", "options": { "cypressConfig": "apps/your-project/cypress.config.ts", "devServerTarget": "your-project:serve", "env": { "CYPRESS_UAM_BASE_URL": "${UAM_BASE_URL}", "CYPRESS_UAM_BASIC_AUTH": "${UAM_BASIC_AUTH}" } } } } }
然后在GitHub Actions步骤中传入对应环境变量,Nx会自动替换占位符:
- name: Run Cypress E2E Tests env: UAM_BASE_URL: ${{ secrets.UAM_BASE_URL }} UAM_BASIC_AUTH: ${{ secrets.UAM_BASIC_AUTH }} run: npx nx run ${{ inputs.repo_project_name }}:e2e
以上方案都比用--env传递大量变量更简洁,可根据变量的敏感程度和项目管理习惯选择合适的方式。
内容的提问来源于stack exchange,提问作者Shivam Srivastava
相关产品推荐
相关产品推荐

