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

GitHub Actions创建Tag后添加元数据资产及Curl上传文件位置咨询

解决方案

首先明确:GitHub的Tag本身无法直接附加资产,资产属于Release对象,因此你需要先基于已创建的Tag生成关联的Release,再将元数据文件上传为该Release的资产。

关于curl上传文件的参数说明

GitHub的资产上传API要求使用multipart/form-data格式提交请求,在curl中需通过-F参数指定文件信息,具体格式有两种:

方式1:通过--data-binary传递文件内容

curl \
  -X POST \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: token <TOKEN>" \
  -H "Content-Type: application/octet-stream" \
  https://uploads.github.com/repos/OWNER/REPO/releases/RELEASE_ID/assets?name=metadata.txt \
  --data-binary "@./metadata.txt"
  • @./metadata.txt指定本地待上传文件的路径
  • URL中的name=metadata.txt定义资产在Release中显示的文件名

方式2:通过-F参数指定文件和名称(更直观)

curl \
  -X POST \
  -H "Authorization: token <TOKEN>" \
  https://uploads.github.com/repos/OWNER/REPO/releases/RELEASE_ID/assets \
  -F name="metadata.txt" \
  -F file=@./metadata.txt
  • -F name="metadata.txt"设置资产显示名
  • -F file=@./metadata.txt指定本地文件路径,@符号表示读取本地文件内容

结合GitHub Action的完整实现

以下是包含创建Tag、生成Release、写入元数据、上传资产的完整工作流:

name: Create Tag with Metadata Asset
on: workflow_dispatch

env:
  tagname: v1.0.0 # 可根据需求动态配置版本号

jobs:
  build-and-release:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 创建Tag
        uses: actions/github-script@v6.1.0
        with:
          script: |
            await github.rest.git.createRef({
              owner: context.repo.owner,
              repo: context.repo.repo,
              ref: 'refs/tags/${{ env.tagname }}',
              sha: context.sha
            })

      - name: 创建关联Release
        uses: actions/github-script@v6.1.0
        id: create_release
        with:
          script: |
            const release = await github.rest.repos.createRelease({
              owner: context.repo.owner,
              repo: context.repo.repo,
              tag_name: '${{ env.tagname }}',
              name: 'Release ${{ env.tagname }}',
              draft: false,
              prerelease: false
            })
            return { id: release.data.id, upload_url: release.data.upload_url }
        result-encoding: json

      - name: 生成元数据文件
        run: |
          # 将触发Workflow的用户名写入文件
          echo "触发用户: ${{ github.actor }}" > metadata.txt
          echo "Tag版本: ${{ env.tagname }}" >> metadata.txt

      - name: 上传元数据资产(curl方式)
        run: |
          curl \
            -X POST \
            -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            https://uploads.github.com/repos/${{ github.repository }}/releases/${{ steps.create_release.outputs.id }}/assets \
            -F name="metadata.txt" \
            -F file=@./metadata.txt

      # 可选:用官方Action替代curl,代码更简洁
      # - name: 上传元数据资产(官方Action方式)
      #   uses: actions/upload-release-asset@v1
      #   env:
      #     GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      #   with:
      #     upload_url: ${{ steps.create_release.outputs.upload_url }}
      #     asset_path: ./metadata.txt
      #     asset_name: metadata.txt
      #     asset_content_type: text/plain

关键细节说明

  1. 创建Release:必须先创建与Tag关联的Release,上传资产API所需的RELEASE_ID就是该Release的ID,通过github.rest.repos.createRelease接口返回。
  2. 元数据生成:使用github.actor变量可直接获取触发workflow_dispatch的用户名,无需额外配置。
  3. 权限令牌:${{ secrets.GITHUB_TOKEN }}是GitHub Action自动生成的令牌,默认拥有上传资产的权限,无需手动创建。

内容的提问来源于stack exchange,提问作者Mathew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:37:09