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

GitLab CI中变量嵌套传递测试状态至Slack失败求助

问题原因

GitLab CI/CD 中,variables 块的变量会在Job启动前完成解析,而 before_script 里的 source test_stats.env 是在Job运行过程中才执行的。这就导致解析 CUSTOM_INPUT 时,TESTS_PASSED 和 TESTS_FAILED 还未被加载到环境变量中,因此Slack消息里显示为空值。

解决方法

方法1:使用dotenv artifact自动加载变量(推荐)

GitLab支持dotenv类型的产物,会自动将文件中的环境变量注入到后续Job中,无需手动执行source命令。

修改allure阶段配置

allure:
  stage: allure
  tags: 
    - testrunner
  needs:
    - combine-results #this is a previous stage
  image:
    name: mycomp.io/test-allure:latest
    pull_policy: always
  before_script:
    - apk update
    - apk add jq
    - apk add curl
    - apk upgrade
  script:
    - TESTS_PASSED=$(curl --header PRIVATE-TOKEN:" "ab $PIPELINE_URL | jq .total.success)
    - TESTS_FAILED=$(curl --header PRIVATE-TOKEN:" "ab $PIPELINE_URL | jq .total.failed)
    - echo "TESTS_PASSED=$TESTS_PASSED" >> test_stats.env
    - echo "TESTS_FAILED=$TESTS_FAILED" >> test_stats.env
    - python /allure_report.py
  artifacts:
    paths:
      - test_stats.env
    reports:
      dotenv: test_stats.env # 新增该行,指定为dotenv类型产物

修改send-slack-message阶段配置

此时无需手动source变量,GitLab会自动加载test_stats.env中的内容,variables块里的CUSTOM_INPUT就能正确引用测试统计值:

send-slack-message:
  extends:
    - .slack-send-message-custom
  stage: alert-slack
  when: on_success
  needs:
    - job: allure
      artifacts: true
  tags:
    - testrunner
  variables:
    CUSTOM_INPUT: ":gitlab:\n 
                                - Tests Branch: `$CI_COMMIT_REF_NAME` \n
                                - *App*: $values__app__tag \n 
                                  - *Applite*: $values__applite__image__tag \n
                                  - *Url*: <$CI_PIPELINE_URL|*here*> \n
                                  - *Passed Tests*: '${TESTS_PASSED}'\n
                                  - *Failed Tests*: ${TESTS_FAILED}\n
                                  - *Results URL*: <$CI_PIPELINE_URL/test_report|*here*> \n "

方法2:将CUSTOM_INPUT移至script中定义

若无法使用dotenv产物,可把CUSTOM_INPUT的定义从variables块移到script中执行,因为script是在before_script之后运行的,此时环境变量已加载完成。

修改后的send-slack-message阶段配置:

send-slack-message:
  extends:
    - .slack-send-message-custom
  stage: alert-slack
  when: on_success
  needs:
    - job: allure
      artifacts: true
  tags:
    - testrunner
  before_script:
    - source test_stats.env  # 加载环境变量
    - echo "Tests passed count-" $TESTS_PASSED # 此时能正常输出
  script:
    - |
      export CUSTOM_INPUT=":gitlab:\n 
                                - Tests Branch: `$CI_COMMIT_REF_NAME` \n
                                - *App*: $values__app__tag \n 
                                  - *Applite*: $values__applite__image__tag \n
                                  - *Url*: <$CI_PIPELINE_URL|*here*> \n
                                  - *Passed Tests*: '${TESTS_PASSED}'\n
                                  - *Failed Tests*: ${TESTS_FAILED}\n
                                  - *Results URL*: <$CI_PIPELINE_URL/test_report|*here*> \n "
    # 调用发送Slack消息的命令(需与.slack-send-message-custom模板逻辑匹配)
    - your-slack-send-command "$CUSTOM_INPUT"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:15:08