更新GitHub Release资产后发布时间戳未更新的原因及解决方法
问题描述
我在GitHub上开发了一款应用,通过GitHub Actions实现二进制文件的自动化构建,对应Workflow配置如下:
name: build stable version on: push: branches: - master jobs: release-linux-amd64: name: release linux/amd64 runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: wangyoucao577/go-release-action@v1.34 with: github_token: ${{ secrets.REPO_TOKEN }} goos: linux goarch: amd64 compress_assets: OFF overwrite: TRUE release-windows-amd64: name: release linux/amd64 runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: wangyoucao577/go-release-action@v1.34 with: github_token: ${{ secrets.REPO_TOKEN }} goos: windows goarch: amd64 compress_assets: OFF overwrite: TRUE
我设置了两个Release:stable version和development,分别在master分支和dev分支推送时更新对应二进制文件。目前自动化构建工作正常,但二进制文件已更新的情况下,Release的时间戳仍显示为创建时的旧时间,并未同步更新。
原因分析
GitHub的Release时间戳(包括发布时间和更新时间)是基于Release本身的创建/修改动作,而非资产(Assets)的更新动作。当前使用的wangyoucao577/go-release-action仅覆盖了Release中的二进制资产,但没有触发Release本身的元数据更新,因此页面上显示的还是Release最初创建或最后一次修改元数据的时间,而非资产更新的时间。
解决方法
要让Release时间戳随资产更新同步刷新,需要在更新资产的同时,触发Release本身的更新动作。可以通过以下两种方式实现:
方式1:修改现有Action的配置
检查wangyoucao577/go-release-action的文档,确认是否有更新Release元数据的参数。部分版本的该Action支持通过设置release_name或body参数,在每次构建时更新Release的标题或描述,从而触发Release的时间戳更新。例如,在with中添加动态生成的描述:
with: # 保留原有参数 github_token: ${{ secrets.REPO_TOKEN }} goos: linux goarch: amd64 compress_assets: OFF overwrite: TRUE # 添加动态描述 body: "Automatically built on ${{ github.event.head_commit.timestamp }}"
每次构建时,这个动态生成的描述会覆盖旧的Release描述,触发Release的更新,时间戳也会同步刷新。
方式2:添加单独的Release更新步骤
如果当前Action不支持更新元数据,可以在资产更新步骤后,添加一个调用GitHub API的步骤,手动更新Release的元数据(比如更新描述)。示例步骤如下:
# 在现有资产更新步骤后添加 - name: Get current UTC time id: current-time run: echo "time=$(date -u +'%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_OUTPUT - name: Update Release metadata to refresh timestamp uses: octokit/request-action@v2.x with: route: PATCH /repos/${{ github.repository }}/releases/tags/master body: | { "body": "Last updated: ${{ steps.current-time.outputs.time }}" } env: GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }}
这个步骤会调用GitHub API修改对应Release的描述,将其更新为当前UTC时间,从而触发Release的时间戳刷新。
额外提示
当前Workflow中的release-windows-amd64任务的name字段写错了,应该是release windows/amd64,建议修正避免任务名称混淆。
内容的提问来源于Stack Exchange,提问作者WoJ

