GitHub Release发布后自动转草稿,如何正确触发Rust发布脚本?
问题描述
我在GitHub项目中通过GitHub Action在Release时发布Rust crate。创建并“发布”新Release后,Release会先保持published状态数秒,随后自动变为draft状态。CI执行正常且已正确完成发布,但Release始终处于draft状态。再次点击“发布”会重新触发相同的Action,导致执行失败(因为同一版本无法两次推送到crates.io)。当前Workflow触发配置如下:
on: push: branches: [ main ] pull_request: branches: [ main ] release: types: [ published ] workflow_dispatch:
请问是否存在正确的方式,能在Release创建时运行发布脚本?
解决方案
调整Workflow触发事件
核心问题是published触发会和Release状态回退的行为冲突,导致重复触发。推荐改用created事件:
on: push: branches: [ main ] pull_request: branches: [ main ] release: types: [ created ] # 替换原published为created workflow_dispatch:
created会在Release首次创建时触发一次,不管初始是草稿还是已发布状态,彻底避免后续状态变更重复触发Workflow。
增加版本校验避免发布失败
即使误触发,也可以在发布步骤前先检查crates.io上是否已有对应版本,跳过重复发布:
# 在cargo publish前添加校验逻辑 if cargo search sqlite-compressions | grep -q "^sqlite-compressions = \"${{ github.event.release.tag_name }}\""; then echo "该版本已在crates.io存在,跳过发布" exit 0 fi cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
优化Release流程(可选)
如果需要更严谨的流程,可以先创建草稿Release,待CI验证通过后再自动发布Release:
- name: 完成Release发布 uses: eregon/publish-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: release_id: ${{ github.event.release.id }} draft: false
这个步骤会将草稿状态的Release自动转为已发布,无需手动操作。
内容的提问来源于stack exchange,提问作者Yuri Astrakhan
相关产品推荐
相关产品推荐

