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
问题排查与修复方案
核心问题分析
- 主机挂载目录未提前创建:Docker绑定挂载时,若主机路径不存在会自动创建目录,但权限可能与容器用户不匹配,导致文件写入失败。
- 工件打包无存在性校验:
if: always()会强制执行打包步骤,即使result.txt不存在,生成的空tar包或不存在的文件会导致上传步骤无有效工件。 - 命令执行无错误捕获:
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
相关产品推荐
相关产品推荐

