Ubuntu 18.04容器中GitHub Workflow上传Artifact适配方案(V3弃用V4不兼容)
我正在使用Petalinux 2019.1为遗留系统编译程序,因此基于Ubuntu 18.04(Petalinux 2019.1支持的最新Ubuntu版本)构建了Docker容器。此前一直使用GitHub Upload Artifact V3动作上传构建产物,但该版本现已弃用。
无法升级至Upload Artifact V4,因为该版本依赖的NodeJS 20在Ubuntu 18.04上会抛出以下错误:
/__e/node20/bin/node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /__e/node20/bin/node)
我的工作流文件最小示例如下:
name: Build old project on: push: branches: - 'test/**' workflow_dispatch: jobs: host: runs-on: ubuntu-latest container: image: ubuntu:18.04 env: ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - name: Build run: echo "Building stuff with petalinux:2019.1" > result.txt - uses: actions/upload-artifact@v3 with: name: legacy_build path: result.txt
补充需求:
- 希望构建步骤在容器内执行,上传Artifact步骤在容器外执行,但作业似乎只能全局定义容器。
- 当前使用
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION参数维持工作流运行。 - 因是遗留系统,仅需再支持数年,故无法升级Petalinux版本。
请问在不升级Petalinux版本的前提下,上传产物的最佳方式是什么?
1. 拆分构建与上传:容器内构建,主机环境上传
将构建步骤放在Ubuntu 18.04容器中执行,上传步骤在GitHub Actions默认的ubuntu-latest环境中完成(该环境支持Upload Artifact V4)。通过Docker挂载工作区目录,让容器内的构建产物直接同步到主机环境。
示例工作流:
name: Build old project on: push: branches: - 'test/**' workflow_dispatch: jobs: build-and-upload: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Run build in Ubuntu 18.04 container run: | docker run --rm -v $GITHUB_WORKSPACE:/workspace ubuntu:18.04 /bin/bash -c " cd /workspace # 替换为实际的Petalinux构建命令 echo 'Building stuff with petalinux:2019.1' > result.txt " - name: Upload artifact with V4 uses: actions/upload-artifact@v4 with: name: legacy_build path: result.txt
这种方案完全规避了NodeJS版本兼容性问题,同时满足构建在容器内、上传在容器外的需求,且无需依赖弃用的V3版本。
2. 短期继续使用Upload Artifact V3
虽然V3已被弃用,但GitHub会保留其运行能力一段时间(通常为弃用后数月到一年)。如果遗留系统仅需短期支持,可以继续使用V3,配合ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true参数绕过Node版本限制。不过需注意后续GitHub可能彻底移除V3支持,仅建议作为过渡方案。
3. 自定义API上传脚本(不依赖官方Action)
编写bash脚本直接调用GitHub API上传产物,完全不依赖NodeJS,可在Ubuntu 18.04容器内直接执行。
示例工作流:
name: Build old project on: push: branches: - 'test/**' workflow_dispatch: jobs: host: runs-on: ubuntu-latest container: image: ubuntu:18.04 steps: - name: Install dependencies run: apt-get update && apt-get install -y curl jq - name: Build run: echo "Building stuff with petalinux:2019.1" > result.txt - name: Upload artifact via GitHub API env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_API_URL: ${{ github.api_url }} GITHUB_REPOSITORY: ${{ github.repository }} GITHUB_RUN_ID: ${{ github.run_id }} run: | ARTIFACT_NAME="legacy_build" FILE_PATH="result.txt" # 获取上传URL UPLOAD_URL=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/artifacts" | \ jq -r '.upload_url' | sed 's/{?name,expires_in}//') # 上传产物 curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ -H "Content-Type: application/zip" \ "$UPLOAD_URL?name=$ARTIFACT_NAME" \ --data-binary @$FILE_PATH
这种方案完全脱离官方Action的限制,适合长期在Ubuntu 18.04容器内运行。
内容的提问来源于stack exchange,提问作者Fiero

