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
相关产品推荐
相关产品推荐

