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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:13:15