GitLab CI中Allure报告控制台输出间歇性乱码问题求助
GitLab CI环境下Allure报告间歇性乱码问题
在GitLab CI中使用Allure报告时遇到间歇性乱码问题:控制台日志偶尔出现类似「���1�0D�>�����6\��Id��솄�#��D����>���.」的损坏字符,而非可读输出。该问题仅在CI环境中出现,本地IntelliJ运行完全正常。
环境信息
- CI平台:GitLab CI
- 构建工具:Maven 3.9
- Java版本:Eclipse Temurin 17
- 测试框架:Playwright Java v1.49.0
- 报告工具:Allure Maven Plugin
已配置的UTF-8编码设置
已尝试以下编码配置,但问题仍间歇性出现:
- 设置
JAVA_TOOL_OPTIONS包含-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 - 设置
MAVEN_OPTS包含-Dfile.encoding=UTF-8 - 将
LANG和LC_ALL设为en_US.UTF-8
CI流水线配置片段
test_playwright阶段
test_playwright: image: mcr.microsoft.com/playwright/java:v1.49.0-jammy stage: test variables: JAVA_TOOL_OPTIONS: "-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dfile.encoding=UTF-8" LANG: "en_US.UTF-8" LC_ALL: "en_US.UTF-8" before_script: apt-get update && apt-get install -y locales locale-gen en_US.UTF-8 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8
allure-report阶段
allure-report: stage: report image: maven:3.9-eclipse-temurin-17 needs: - job: test_playwright artifacts: true optional: false dependencies: - test_playwright variables: JAVA_TOOL_OPTIONS: "-Dfile.encoding=UTF-8 -Dallure.results.directory=target/allure-results" MAVEN_OPTS: "-Dfile.encoding=UTF-8" before_script: - export LANG=en_US.UTF-8 - export LC_ALL=en_US.UTF-8 - | if [ ! -d "target/allure-results" ]; then mkdir -p target/allure-results echo '{"name":"No tests executed","status":"broken"}' > target/allure-results/dummy.json fi - | find target/allure-results -type f \( -name "*.json" -o -name "*.txt" -o -name "*.log" \) -exec sh -c ' iconv -f UTF-8 -t UTF-8 -c "$1" > "$1.tmp" 2>/dev/null && mv "$1.tmp" "$1" || rm -f "$1.tmp" ' _ {} \; script: - mvn allure:report -Dfile.encoding=UTF-8
疑问解答
1. 导致Allure JSON文件出现字符损坏的原因可能是什么?
- 二进制数据混入文本文件:Playwright自动捕获的截图/视频等二进制附件,可能被错误地以文本模式写入Allure的JSON或日志文件。CI环境中进程IO流编码处理不稳定,导致二进制字节被当作UTF-8文本解析,产生乱码。
- CI环境编码继承不完整:尽管设置了全局变量,但GitLab CI的子进程(比如Playwright底层进程)可能未正确继承
file.encoding参数,导致写入文件时使用非UTF-8默认编码。 - 并发写入冲突:CI环境中测试并发执行时,多线程同时写入Allure结果目录,可能导致文件内容被意外覆盖或二进制数据混入文本文件。
2. 是否有可靠方法防止二进制数据被错误编码到Allure结果文件中?
- 强制附件Base64编码:在测试代码中手动处理截图等附件,将二进制数据转成Base64字符串后再添加到Allure报告,避免直接写入二进制字节到文本文件:
byte[] screenshotBytes = page.screenshot(); Allure.addAttachment("Screenshot", "image/png", new ByteArrayInputStream(screenshotBytes), ".png");
- 过滤二进制文件的编码处理:在
allure-report阶段的before_script中,排除.png/.mp4等二进制文件,不对其执行UTF-8转换:
find target/allure-results -type f \( -name "*.json" -o -name "*.txt" -o -name "*.log" \) ! -name "*.png" ! -name "*.mp4" -exec sh -c ' iconv -f UTF-8 -t UTF-8 -c "$1" > "$1.tmp" 2>/dev/null && mv "$1.tmp" "$1" || rm -f "$1.tmp" ' _ {} \;
- 检查自定义代码:确认没有自定义代码错误地将二进制数据写入Allure的JSON字段,确保二进制附件单独存储在结果目录中。
3. 是否有额外的Maven/Allure配置可帮助在整个流水线中强制使用正确编码?
- Maven全局编码配置:在pom.xml的
<properties>中添加以下配置,确保所有Maven插件(包括Allure)统一使用UTF-8:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties>
- Allure插件显式编码配置:在pom.xml的Allure插件配置中指定编码参数:
<plugin> <groupId>io.qameta.allure</groupId> <artifactId>allure-maven</artifactId> <version>2.12.0</version> <configuration> <encoding>UTF-8</encoding> <resultsDirectory>${project.build.directory}/allure-results</resultsDirectory> </configuration> </plugin>
- Runner系统编码统一:在GitLab CI runner的全局配置中设置默认
LANG和LC_ALL为en_US.UTF-8,避免不同job之间的编码环境差异。
内容的提问来源于stack exchange,提问作者dreamer
相关产品推荐
相关产品推荐

