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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 02:54:50