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

GitHub Actions工作流未生成工件?求助排查问题原因

GitHub Actions无输出工件排查与修复

问题描述

GitHub Actions项目运行状态显示成功,但始终没有生成预期的输出工件。流程逻辑如下:

  • 使用Docker容器部署安装了iproute2工具的Debian系统
  • 在容器内执行/bin/ss -tulpn命令获取开放端口列表,将结果写入文件
  • 文件通过容器挂载目录同步到主机,计划打包为tar或deb格式作为构建工件

相关配置文件

build.yml

name: Build and Package

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build and run Docker container
      run: |
        docker build -t mycontainer .
        docker run -v $(pwd)/output:/output mycontainer
        
    - name: Change permissions
      run: |
        sudo chmod -R 777 output/
        
    - name: Create artifact
      run: |
        cd output
        tar -cvzf result.tar.gz result.txt
        mv result.txt result.deb
      if: always()

    - name: Upload artifact
      uses: actions/upload-artifact@v2
      with:
        name: result-artifact
        path: output/result.tar.gz

docker.yml

name: Example Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build and run Docker container
      run: |
        docker build -t mycontainer .
        docker run -v $(pwd)/output:/output mycontainer

Dockerfile

FROM debian

RUN apt-get update && apt-get install -y iproute2

RUN mkdir /output

CMD /bin/ss -tulpn > /output/result.txt

问题排查与修复方案

核心问题分析

  1. 主机挂载目录未提前创建:Docker绑定挂载时,若主机路径不存在会自动创建目录,但权限可能与容器用户不匹配,导致文件写入失败。
  2. 工件打包无存在性校验:if: always()会强制执行打包步骤,即使result.txt不存在,生成的空tar包或不存在的文件会导致上传步骤无有效工件。
  3. 命令执行无错误捕获:ss命令的错误输出未被记录,无法判断是否因权限或环境问题导致未生成文件。

修复步骤

1. 提前创建主机挂载目录

在构建容器前添加步骤创建output目录,确保权限匹配:

- name: Create output directory
  run: mkdir -p output

2. 增加文件存在性校验

在打包前检查result.txt是否存在,避免无效打包:

- name: Verify result file exists
  run: |
    if [ ! -f output/result.txt ]; then
      echo "ERROR: result.txt not found in output directory"
      exit 1
    fi

3. 捕获容器命令错误输出

修改Dockerfile的CMD,将错误输出也写入文件,方便排查:

CMD /bin/ss -tulpn 2>&1 > /output/result.txt

4. 优化打包与上传逻辑

移除if: always(),仅在文件存在时执行打包;同时可上传deb和tar两种工件:

- name: Create artifact
  run: |
    cd output
    tar -cvzf result.tar.gz result.txt
    # 注意:此处仅重命名后缀,若需生成标准deb包需使用dpkg-deb工具
    mv result.txt result.deb

- name: Upload artifact
  uses: actions/upload-artifact@v2
  with:
    name: result-artifact
    path: |
      output/result.tar.gz
      output/result.deb

完整修复后的build.yml

name: Build and Package

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Create output directory
      run: mkdir -p output

    - name: Build and run Docker container
      run: |
        docker build -t mycontainer .
        docker run -v $(pwd)/output:/output mycontainer
        # 查看容器日志确认命令执行状态
        docker logs mycontainer
        
    - name: Verify result file exists
      run: |
        if [ ! -f output/result.txt ]; then
          echo "ERROR: result.txt not generated"
          exit 1
        fi
        
    - name: Adjust permissions
      run: sudo chmod -R 777 output/
        
    - name: Create artifacts
      run: |
        cd output
        tar -cvzf result.tar.gz result.txt
        mv result.txt result.deb

    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: result-artifact
        path: |
          output/result.tar.gz
          output/result.deb

内容的提问来源于stack exchange,提问作者Someone-from-somewhere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:52