如何通过命令行在GitHub上发布版本?

21

GitHub网站有一个功能特性,允许您将代码库的特定快照标记为软件发布版本。示例URL:https://github.com/github/orchestrator/releases

是否有一种方法可以通过命令行进行此操作,而不必登录并使用界面?我知道这个功能不是git的一部分,但我希望有一些其他人使用的API或解决方案可以使这个过程自动化。


我发现现在更容易的选择是使用hub - filype
1
可能是如何使用脚本在GitHub上发布构建工件?的重复问题。 - Ciro Santilli OurBigBook.com
9个回答

12

这里有许多项目提供此功能,下面的顺序仅为了索引而排序:

  1. Node(JS)中 cheton 的github-release-cli
  2. Go 中 c4milo 的github-release(旨在简化操作)
  3. Go 中 aktau 的 github-release

甚至可以直接使用 curl 进行操作:

OWNER=
REPOSITORY=
ACCESS_TOKEN=
VERSION=
curl --data '{"tag_name": "v$VERSION",
                "target_commitish": "master",
                "name": "v$VERSION",
                "body": "Release of version $VERSION",
                "draft": false,
                "prerelease": false}' \
    https://api.github.com/repos/$OWNER/$REPOSITORY/releases?access_token=$ACCESS_TOKEN

来自Barry Kooij的通过命令行创建Github发布

如果您想在StackOverflow上获得完整的答案:在Github上发布构建工件


我建议用户使用hub代替,因为该工具也是用Go编写的,但由GitHub官方维护:https://dev59.com/fmEi5IYBdhLWcg3wfsfI#52353299 - Ciro Santilli OurBigBook.com

9

您可以使用Github CLI完成此操作

gh release create <tagname> --target <branchname>

Github CLI

如果出现400错误,请检查分支名称是否有错别字


5
你可以使用GitHub V3 API"创建发布版"API
POST /repos/:owner/:repo/releases

例如,这个由Mathias Lafeldt (mlafeldt)编写的ruby脚本 "create-release.rb":

require "net/https"
require "json"

gh_token     = ENV.fetch("GITHUB_TOKEN")
gh_user      = ARGV.fetch(0)
gh_repo      = ARGV.fetch(1)
release_name = ARGV.fetch(2)
release_desc = ARGV[3]

uri = URI("https://api.github.com")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new("/repos/#{gh_user}/#{gh_repo}/releases")
request["Accept"] = "application/vnd.github.manifold-preview"
request["Authorization"] = "token #{gh_token}"
request.body = {
  "tag_name"         => release_name,
  "target_commitish" => "master",
  "name"             => release_name,
  "body"             => release_desc,
  "draft"            => false,
  "prerelease"       => false,
}.to_json

response = http.request(request)
abort response.body unless response.is_a?(Net::HTTPSuccess)

release = JSON.parse(response.body)
puts release

这是一个Python版本,还可以上传文件:https://dev59.com/cJjga4cB1Zd3GeqPL5Dv#52354681 - Ciro Santilli OurBigBook.com

4

hub 官方基于 Go 的 GitHub CLI 工具

https://github.com/github/hub

从19.04开始,添加了一个Ubuntu软件包:https://packages.ubuntu.com/search?keywords=hub | https://github.com/github/hub/issues/718

sudo apt install hub

否则,对于较旧版本的Ubuntu,请先安装Go。在Ubuntu上:https://askubuntu.com/questions/959932/installation-instructions-for-golang-1-9-into-ubuntu-16-04/1075726#1075726 然后安装hub
go get github.com/github/hub

一旦安装了 hub,从您的仓库内部开始:
hub release create -a prebuilt.zip -m 'release title' tag-name

这个操作:

  • 第一次提示您输入密码,然后自动在本地创建和存储API令牌
  • 在远程创建一个未注释的标签,名称为tag-name
  • 创建与该标签相关联的发布
  • prebuilt.zip作为附件上传

您还可以使用GITHUB_TOKEN环境变量提供现有的API令牌。

有关其他release操作,请参见:

hub release --help

hub de684cb613c47572cc9ec90d4fd73eef80aef09c 上进行了测试。

Python示例,不需要任何依赖项

如果您和我一样不想安装另一种语言:

有人可以提供一个在github上上传发布资产的python请求示例吗?


1
你可以从许多包管理器中获取预编译的仓库,无需安装Go :) 但还是感谢您的帖子。 - The Unfun Cat
@TheUnfunCat 你好,谢谢你的提醒。一个新的软件包已经发布适用于19.04版本,所以我更新了答案。不过,如果有“按语言包管理”的选项可用,我通常会使用那个;-) - Ciro Santilli OurBigBook.com

1

您可以使用GitHub CLI来完成此操作

要从带注释的git标签创建发布,请先在本地使用git创建一个标签,将标签推送到GitHub,然后运行此命令。

gh release create <tag> [<files>...] --target <branchname>

选项

-d, --draft 将发布保存为草稿而不是发布它

-n, --notes string 发布说明

-F, --notes-file file 从文件中读取发布说明

-p, --prerelease 将发布标记为预发布

, --target branch 目标分支或完整提交SHA(默认值: 主分支)

-t, --title string 发布标题


0
$version = 'v1.0.0'
$data='{"tag_name": "${version}", "target_commitish": "master", "name": "${version}", "body": "Release of version ${version}", "draft": false, "prerelease": false}'
curl -X POST -H "Authorization: token $(git_token)" -d $ExecutionContext.InvokeCommand.ExpandString($data) https://api.github.com/repos/$OWNER/$REPOSITORY/releases

我正在使用Azure DevOps中的Powershell。git_token 是我构建管道中定义的一个变量。希望能帮助到其他人。


0

可以使用简单的curl命令来完成:

curl -X POST -u YOURGITUSERNAME:YOURTOKEN --data '{"tag_name": "YOURTAGNAME","target_commitish": "YOURREPO","name": "YOURTAGNAME","body": "YOUR TAG DESCRIPTION","draft": false,"prerelease": false}' https://api.github.com/repos/YOURGITSITE/YOURREPO/releases

0
使用 gh release create 命令时,请确保使用新的 --verify-tag 选项,该选项需要 gh 2.21.0 (2022年12月) 或更高版本,并且需要从 PR 6632 中修复 issue 6566

运行 gh release create <tag> --verify-tag 命令时,我们会通过 GitHub API 在存储库标签中查询,如果未找到标签,则会终止命令。

错误信息:

tag %s doesn't exist in the repo %s, aborting due to --verify-tag flag

-1
假设你已经从 GitHub 仓库(origin)上检出了正确的分支并与之同步,例如自动化地创建版本 2.5.0 发布,请执行以下操作:
git tag -a -m 'your comment' v2.5.0
git push origin v2.5.0

这将创建一个标签,而不是发布。 - Megan Hardy
当然,这会创建一个标签,直到微软接管并将其推送到GitHub时,才会实际创建发布。你显然错过了“-a”选项。 - jelmd
-a 选项创建的是一个带注释的标签,它与发布版本不同。 - Megan Hardy
通过创建一个带有适当版本字符串的注释标签并将其推送到Github,可以导致Github创建一个发布。 - jelmd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接