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
关键细节说明
- 创建Release:必须先创建与Tag关联的Release,上传资产API所需的
RELEASE_ID就是该Release的ID,通过github.rest.repos.createRelease接口返回。 - 元数据生成:使用
github.actor变量可直接获取触发workflow_dispatch的用户名,无需额外配置。 - 权限令牌:
${{ secrets.GITHUB_TOKEN }}是GitHub Action自动生成的令牌,默认拥有上传资产的权限,无需手动创建。
内容的提问来源于stack exchange,提问作者Mathew
相关产品推荐
相关产品推荐

