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

GitLab CI/CD中使用Earthly无法保存lcov.info制品的问题

问题分析与解决

你遇到的核心问题是Earthly在GitLab CI环境中生成的lcov.info文件无法被runner检测到,根源在于Earthly容器与GitLab CI runner的目录挂载、环境变量传递,以及SAVE ARTIFACT指令的路径逻辑这几个环节的配置缺失。

以下是具体解决步骤:

1. 确保Earthly能访问GitLab CI的环境变量

Earthly默认不会将CI环境变量(比如CI_PROJECT_DIR)传递到构建容器内部,直接在Earthfile中使用${CI_PROJECT_DIR}会得到空值或错误路径。

调整Earthfile:

在tests目标中添加ARG指令导入环境变量:

tests:
    # 导入GitLab CI的环境变量
    ARG CI_PROJECT_DIR
    # 你的测试命令,假设生成lcov.info到当前构建目录
    RUN go test -coverprofile=lcov.info ./...
    # 将生成的文件保存到指定路径
    SAVE ARTIFACT ./lcov.info $CI_PROJECT_DIR/lcov.info

调整GitLab CI脚本:

运行Earthly时加上--pass-env CI_PROJECT_DIR参数,将变量传递给Earthly:

unit_tests:
  image: earthly/earthly:latest
  script:
    # 传递CI_PROJECT_DIR变量给Earthly,并执行测试目标
    - earthly --ci --pass-env CI_PROJECT_DIR +tests
  before_script:
    # 确保目标目录存在,避免写入失败
    - mkdir -p $CI_PROJECT_DIR

2. 简化路径:直接保存到runner工作目录

如果不想依赖CI_PROJECT_DIR,可以让Earthly将artifact直接保存到runner的当前工作目录(默认就是CI_PROJECT_DIR),无需绝对路径:

修改Earthfile:

tests:
    RUN go test -coverprofile=lcov.info ./...
    # AS LOCAL 表示将文件保存到Earthly运行时的当前目录(即GitLab CI工作目录)
    SAVE ARTIFACT ./lcov.info AS LOCAL ./lcov.info

GitLab CI脚本无需额外变量传递:

unit_tests:
  image: earthly/earthly:latest
  script:
    - earthly --ci +tests

3. 解决权限问题

GitLab CI runner的用户与Earthly容器内的用户UID/GID不一致时,会导致文件无法写入或读取。可以让Earthly以runner的用户身份运行:

unit_tests:
  image: earthly/earthly:latest
  script:
    # 以当前runner用户的UID/GID运行Earthly,避免权限冲突
    - earthly --ci --user $(id -u):$(id -g) +tests

4. 验证与调试

如果问题仍存在,添加日志排查:

  • 在GitLab CI脚本中,测试命令后添加ls -la $CI_PROJECT_DIR查看目录内容
  • 运行Earthly时加上--verbose参数,查看SAVE ARTIFACT步骤的执行日志,确认文件是否被正确写入目标路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:57:32