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

如何将GitLab CI脚本中各命令的标准输出保存为Artifact?

保存GitLab CI作业日志为Artifact的两种方法

方法1:捕获完整作业日志(推荐)

在脚本块开头添加日志重定向命令,既能保留GitLab界面的实时日志输出,又能把所有标准输出、错误输出写入日志文件,最后将该文件加入artifact即可。

修改后的完整配置如下:

build:
  tags:
    - $RUNNER_TAG
  artifacts:
    paths:
      - docs/
      - job_log.txt  # 新增日志文件路径
    expire_in: 1 week
  image:
    name: gcr.io/kaniko-project/executor:v1.23.2-debug
    entrypoint: [""]
  script:
    # 新增:将所有输出重定向到日志文件,同时保留终端输出
    - exec > >(tee job_log.txt) 2>&1
    - mkdir -p /kaniko/.docker
    - mkdir docs
    - echo "Build completed" > docs/build.txt
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --cache --cache-repo $CI_REGISTRY_IMAGE --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $IMAGE_NAME
    - /kaniko/executor --cache --cache-repo $CI_REGISTRY_IMAGE --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $IMAGE_NAME_LATEST

exec > >(tee job_log.txt) 2>&1 会把当前shell的所有输出(包括标准输出和错误)通过tee写入job_log.txt,同时输出到终端,兼顾实时查看和日志留存需求。

方法2:单独捕获每个命令的输出

如果需要为每个命令单独保存日志,可给每个命令添加重定向,生成独立日志文件:

build:
  tags:
    - $RUNNER_TAG
  artifacts:
    paths:
      - docs/
      - command_logs/  # 新增日志目录
    expire_in: 1 week
  image:
    name: gcr.io/kaniko-project/executor:v1.23.2-debug
    entrypoint: [""]
  script:
    - mkdir -p command_logs  # 创建日志目录
    - mkdir -p /kaniko/.docker >> command_logs/mkdir_kaniko.log 2>&1
    - mkdir docs >> command_logs/mkdir_docs.log 2>&1
    - echo "Build completed" > docs/build.txt >> command_logs/write_build.log 2>&1
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json >> command_logs/write_config.log 2>&1
    - /kaniko/executor --cache --cache-repo $CI_REGISTRY_IMAGE --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $IMAGE_NAME >> command_logs/kaniko_build.log 2>&1
    - /kaniko/executor --cache --cache-repo $CI_REGISTRY_IMAGE --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $IMAGE_NAME_LATEST >> command_logs/kaniko_build_latest.log 2>&1

这种方式会为每个命令生成单独的日志文件,存放在command_logs目录下,适合单独排查某个命令输出的场景。

注意事项

  • 必须在artifacts.paths中声明日志文件/目录的路径,否则无法被上传为artifact。
  • 确保日志文件生成在容器的默认工作目录$CI_PROJECT_DIR下,避免GitLab无法捕获日志文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:45:07