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

