无法将提交信息与作者信息传递至Cypress Cloud的问题排查
问题
配置了向Cypress Cloud记录测试结果的GitHub Actions工作流,但提交信息无法正常传递至Cypress Cloud。当前工作流配置如下:
name: Cypress Tests on: [push, deployment_status] jobs: cypress-run: if: github.event_name == 'deployment_status' && github.event.deployment_status.state == 'success' runs-on: ubuntu-latest env: COMMIT_INFO_MESSAGE: ${{ toJson(github.event.head_commit.message) }} (by ${{ toJson(github.event.head_commit.author) }}) COMMIT_INFO_AUTHOR: ${{ toJson(github.event.head_commit.author) }} container: cypress/included:cypress-12.7.0-node-18.14.1-chrome-110.0.5481.96-1-ff-109.0-edge-110.0.1587.41-1 steps: - name: Checkout 🛎 uses: actions/checkout@v3 - name: Cypress run uses: cypress-io/github-action@v6.6.0 with: install-command: npm install start: npm run cypress:run:dev --verbose project: apps/game-zone-e2e browser: chrome record: true parallel: true env: # DEBUG: 'cypress:*' CYPRESS_PROJECT_ID: ${{ vars.CYPRESS_PROJECT_ID }} CYPRESS_BASE_URL: ${{ github.event.deployment_status.target_url }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} COMMIT_INFO_AUTHOR: ${{ env.COMMIT_INFO_AUTHOR }}
已在job级别通过echo验证COMMIT_INFO_MESSAGE和COMMIT_INFO_AUTHOR变量能获取到值,但在Cypress中该变量显示为“null (by null)”。奇怪的是github.event.deployment_status.target_url环境变量能正常生效,请问哪里配置出错了?
解决方案
问题根源
github.event.head_commit是仅在push事件中存在的属性,而你的job仅在deployment_status事件触发(通过if条件限制),所以实际运行时COMMIT_INFO_MESSAGE和COMMIT_INFO_AUTHOR获取到的是null。你之前用echo验证能拿到值,大概率是测试时用了push事件触发,而非实际的deployment_status事件。
而github.event.deployment_status.target_url能正常生效,是因为这个属性是deployment_status事件本身自带的字段,不存在获取不到的问题。
修复方法
方法一:手动通过Git命令提取提交信息
在checkout步骤后新增一个步骤,通过提交哈希从Git历史中提取信息并设置环境变量:
- name: 获取提交信息 run: | # 从deployment事件中拿到提交哈希 COMMIT_SHA=${{ github.event.deployment.sha }} # 提取提交信息和作者 COMMIT_MESSAGE=$(git log --format=%B -n 1 $COMMIT_SHA) COMMIT_AUTHOR=$(git log --format=%an -n 1 $COMMIT_SHA) # 将信息写入环境变量,供后续步骤使用 echo "COMMIT_INFO_MESSAGE=$COMMIT_MESSAGE (by $COMMIT_AUTHOR)" >> $GITHUB_ENV echo "COMMIT_INFO_AUTHOR=$COMMIT_AUTHOR" >> $GITHUB_ENV
同时删除job级别的env定义(因为现在是动态生成这些变量)。
方法二:利用Cypress Action自动收集提交信息
Cypress GitHub Action本身可以自动从Git历史中提取提交信息,只需确保:
- 拉取完整的Git历史(默认checkout的
fetch-depth为1,无法获取完整提交信息) - 切换到部署对应的提交哈希
修改checkout步骤:
- name: Checkout 🛎 uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取完整Git历史 ref: ${{ github.event.deployment.sha }} # 切换到部署对应的提交
之后可以直接删除job级和Cypress步骤中的COMMIT_INFO_*变量,Cypress Action会自动将提交信息同步到Cypress Cloud。
内容的提问来源于stack exchange,提问作者John williams

