部署的 REST API 端点
使用 REST API 创建和删除部署和部署环境。
关于部署
部署是部署特定 ref(分支、SHA、标签)的请求。当创建新的部署时,GitHub 会分派一个 deployment
事件,外部服务可以侦听并对其进行操作。部署使开发人员和组织能够围绕部署构建松耦合的工具,而无需担心交付不同类型的应用程序(例如,Web、原生)的实现细节。
部署状态允许外部服务使用error
、failure
、pending
、in_progress
、queued
或 success
状态标记部署,这些状态可以被侦听 deployment_status
事件 的系统使用。
部署状态还可以包含可选的 description
和 log_url
,强烈建议使用它们,因为它们使部署状态更有用。log_url
是部署输出的完整 URL,description
是部署发生情况的高级摘要。
创建新的部署和部署状态时,GitHub 会分派 deployment
和 deployment_status
事件。这些事件允许第三方集成接收和响应部署请求,并在部署取得进展时更新部署的状态。
以下是这些交互如何工作的简单顺序图。
+---------+ +--------+ +-----------+ +-------------+
| Tooling | | GitHub | | 3rd Party | | Your Server |
+---------+ +--------+ +-----------+ +-------------+
| | | |
| Create Deployment | | |
|--------------------->| | |
| | | |
| Deployment Created | | |
|<---------------------| | |
| | | |
| | Deployment Event | |
| |---------------------->| |
| | | SSH+Deploys |
| | |-------------------->|
| | | |
| | Deployment Status | |
| |<----------------------| |
| | | |
| | | Deploy Completed |
| | |<--------------------|
| | | |
| | Deployment Status | |
| |<----------------------| |
| | | |
请记住,GitHub 永远不会实际访问您的服务器。由您的第三方集成与部署事件交互。多个系统可以侦听部署事件,并且每个系统都需要自行决定它们是否负责将代码推送到您的服务器、构建本地代码等。
请注意,repo_deployment
OAuth 范围 授予对部署和部署状态的目标访问权限,**而无需**授予对代码库代码的访问权限,而 public_repo
和 repo
范围也授予对代码的权限。
非活动部署
当您将部署的状态设置为 success
时,则同一代码库中具有相同环境名称的所有先前的非瞬态、非生产环境部署都将变为 inactive
。为避免这种情况,您可以在创建部署状态时将 auto_inactive
设置为 false
。
您可以通过将瞬态环境的 state
设置为 inactive
来传达该环境不再存在。将 state
设置为 inactive
会在 GitHub 中将部署显示为 destroyed
并删除对其的访问权限。
列出部署
可以通过查询参数进行简单的部署过滤
“列出部署”的细粒度访问令牌
此端点适用于以下细粒度令牌类型:
细粒度令牌必须具有以下权限集
- “部署”代码库权限(读取)
如果仅请求公共资源,则无需身份验证或上述权限即可使用此端点。
“列出部署”的参数
名称、类型、描述 |
---|
accept 字符串建议设置为 |
名称、类型、描述 |
---|
owner 字符串 必需代码库的账户所有者。名称不区分大小写。 |
repo 字符串 必需代码库的名称,不含 |
名称、类型、描述 |
---|
sha 字符串创建时记录的 SHA。 默认值: |
ref 字符串ref 的名称。这可以是分支、标签或 SHA。 默认值: |
task 字符串部署的任务名称(例如, 默认值: |
environment 字符串或 null已部署到的环境的名称(例如, 默认值: |
per_page 整数每页的结果数(最大 100)。有关更多信息,请参阅“在 REST API 中使用分页”。 默认值: |
page 整数要提取的结果的页码。有关更多信息,请参阅“在 REST API 中使用分页”。 默认值: |
“列出部署”的 HTTP 响应状态代码
状态代码 | 描述 |
---|---|
200 | OK |
“列出部署”的代码示例
请求示例
curl -L \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer <YOUR-TOKEN>" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/OWNER/REPO/deployments
响应
状态:200
[ { "url": "https://api.github.com/repos/octocat/example/deployments/1", "id": 1, "node_id": "MDEwOkRlcGxveW1lbnQx", "sha": "a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d", "ref": "topic-branch", "task": "deploy", "payload": {}, "original_environment": "staging", "environment": "production", "description": "Deploy request from hubot", "creator": { "login": "octocat", "id": 1, "node_id": "MDQ6VXNlcjE=", "avatar_url": "https://github.com/images/error/octocat_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octocat", "html_url": "https://github.com/octocat", "followers_url": "https://api.github.com/users/octocat/followers", "following_url": "https://api.github.com/users/octocat/following{/other_user}", "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", "organizations_url": "https://api.github.com/users/octocat/orgs", "repos_url": "https://api.github.com/users/octocat/repos", "events_url": "https://api.github.com/users/octocat/events{/privacy}", "received_events_url": "https://api.github.com/users/octocat/received_events", "type": "User", "site_admin": false }, "created_at": "2012-07-20T01:19:13Z", "updated_at": "2012-07-20T01:19:13Z", "statuses_url": "https://api.github.com/repos/octocat/example/deployments/1/statuses", "repository_url": "https://api.github.com/repos/octocat/example", "transient_environment": false, "production_environment": true } ]
创建部署
部署提供了一些可配置的参数,并带有一些默认值。
ref
参数可以是任何命名分支、标签或 SHA。在 GitHub 上,我们通常会部署分支并在合并拉取请求之前对其进行验证。
environment
参数允许将部署发布到不同的运行时环境。团队通常有多个环境来验证其应用程序,例如 production
、staging
和 qa
。此参数使跟踪哪些环境请求了部署变得更容易。默认环境为 production
。
auto_merge
参数用于确保请求的 ref 不落后于存储库的默认分支。如果 ref 确实落后于存储库的默认分支,我们将尝试为您合并它。如果合并成功,API 将返回一个成功的合并提交。如果合并冲突阻止合并成功,API 将返回失败响应。
默认情况下,每个提交上下文的 提交状态 必须处于 success
状态。required_contexts
参数允许您指定必须为 success
的上下文子集,或指定尚未提交的上下文。您不需要使用提交状态来部署。如果您不需要任何上下文或创建任何提交状态,则部署将始终成功。
payload
参数可用于部署系统可能需要的任何额外信息。它是一个 JSON 文本字段,将在分派部署事件时传递。
task
参数由部署系统用于允许不同的执行路径。在 Web 世界中,这可能是 deploy:migrations
以在系统上运行模式更改。在编译的世界中,这可能是启用调试功能编译应用程序的标志。
合并分支响应
当 GitHub 自动将基分支合并到主题分支而不是创建部署时,您将看到此响应。此自动合并发生在
- 存储库中启用了自动合并选项
- 主题分支不包含基分支上的最新更改,在响应示例中为
master
- 没有合并冲突
如果基分支中没有新的提交,则创建部署的新请求应该会给出成功的响应。
合并冲突响应
当启用 auto_merge
选项并且由于合并冲突无法将默认分支(在本例中为 master
)合并到正在部署的分支(在本例中为 topic-branch
)时,会发生此错误。
提交状态检查失败
当 required_contexts
参数指示一个或多个上下文需要具有 success
状态才能部署提交,但一个或多个必需的上下文的状态不为 success
时,会发生此错误。
OAuth 应用程序令牌和个人访问令牌(经典)需要 repo
或 repo_deployment
范围才能使用此端点。
用于“创建部署”的细粒度访问令牌
此端点适用于以下细粒度令牌类型:
细粒度令牌必须具有以下权限集
- “部署”存储库权限(写入)
“创建部署”的参数
名称、类型、描述 |
---|
accept 字符串建议设置为 |
名称、类型、描述 |
---|
owner 字符串 必需代码库的账户所有者。名称不区分大小写。 |
repo 字符串 必需代码库的名称,不含 |
名称、类型、描述 |
---|
ref 字符串 必需要部署的 ref。这可以是分支、标签或 SHA。 |
task 字符串指定要执行的任务(例如, 默认值: |
auto_merge 布尔值如果请求的 ref 落后于默认分支,则尝试自动将默认分支合并到请求的 ref 中。 默认值: |
required_contexts 字符串数组要针对提交状态检查验证的 状态 上下文。如果您省略此参数,GitHub 会在创建部署之前验证所有唯一上下文。要完全绕过检查,请传递一个空数组。默认为所有唯一上下文。 |
payload 对象或字符串包含有关部署的额外信息的 JSON 有效负载。 |
environment 字符串目标部署环境的名称(例如, 默认值: |
description 字符串或 null部署的简短描述。 默认值: |
transient_environment 布尔值指定给定环境是否特定于部署,并且将来某个时刻将不再存在。默认值: 默认值: |
production_environment 布尔值指定给定环境是否为最终用户直接交互的环境。默认值:当 |
“创建部署”的 HTTP 响应状态代码
状态代码 | 描述 |
---|---|
201 | 已创建 |
202 | 合并分支响应 |
409 | 当存在合并冲突或提交的状态检查失败时发生冲突 |
422 | 验证失败,或端点已被垃圾邮件发送。 |
“创建部署”的代码示例
请求示例
curl -L \ -X POST \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer <YOUR-TOKEN>" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/OWNER/REPO/deployments \ -d '{"ref":"topic-branch","payload":"{ \"deploy\": \"migrate\" }","description":"Deploy request from hubot"}'
简单示例
状态:201
{ "url": "https://api.github.com/repos/octocat/example/deployments/1", "id": 1, "node_id": "MDEwOkRlcGxveW1lbnQx", "sha": "a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d", "ref": "topic-branch", "task": "deploy", "payload": {}, "original_environment": "staging", "environment": "production", "description": "Deploy request from hubot", "creator": { "login": "octocat", "id": 1, "node_id": "MDQ6VXNlcjE=", "avatar_url": "https://github.com/images/error/octocat_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octocat", "html_url": "https://github.com/octocat", "followers_url": "https://api.github.com/users/octocat/followers", "following_url": "https://api.github.com/users/octocat/following{/other_user}", "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", "organizations_url": "https://api.github.com/users/octocat/orgs", "repos_url": "https://api.github.com/users/octocat/repos", "events_url": "https://api.github.com/users/octocat/events{/privacy}", "received_events_url": "https://api.github.com/users/octocat/received_events", "type": "User", "site_admin": false }, "created_at": "2012-07-20T01:19:13Z", "updated_at": "2012-07-20T01:19:13Z", "statuses_url": "https://api.github.com/repos/octocat/example/deployments/1/statuses", "repository_url": "https://api.github.com/repos/octocat/example", "transient_environment": false, "production_environment": true }
获取部署
用于“获取部署”的细粒度访问令牌
此端点适用于以下细粒度令牌类型:
细粒度令牌必须具有以下权限集
- “部署”代码库权限(读取)
如果仅请求公共资源,则无需身份验证或上述权限即可使用此端点。
“获取部署”的参数
名称、类型、描述 |
---|
accept 字符串建议设置为 |
名称、类型、描述 |
---|
owner 字符串 必需代码库的账户所有者。名称不区分大小写。 |
repo 字符串 必需代码库的名称,不含 |
deployment_id 整数 必需deployment_id 参数 |
“获取部署”的 HTTP 响应状态代码
状态代码 | 描述 |
---|---|
200 | OK |
404 | 资源未找到 |
“获取部署”的代码示例
请求示例
curl -L \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer <YOUR-TOKEN>" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/OWNER/REPO/deployments/DEPLOYMENT_ID
响应
状态:200
{ "url": "https://api.github.com/repos/octocat/example/deployments/1", "id": 1, "node_id": "MDEwOkRlcGxveW1lbnQx", "sha": "a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d", "ref": "topic-branch", "task": "deploy", "payload": {}, "original_environment": "staging", "environment": "production", "description": "Deploy request from hubot", "creator": { "login": "octocat", "id": 1, "node_id": "MDQ6VXNlcjE=", "avatar_url": "https://github.com/images/error/octocat_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octocat", "html_url": "https://github.com/octocat", "followers_url": "https://api.github.com/users/octocat/followers", "following_url": "https://api.github.com/users/octocat/following{/other_user}", "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", "organizations_url": "https://api.github.com/users/octocat/orgs", "repos_url": "https://api.github.com/users/octocat/repos", "events_url": "https://api.github.com/users/octocat/events{/privacy}", "received_events_url": "https://api.github.com/users/octocat/received_events", "type": "User", "site_admin": false }, "created_at": "2012-07-20T01:19:13Z", "updated_at": "2012-07-20T01:19:13Z", "statuses_url": "https://api.github.com/repos/octocat/example/deployments/1/statuses", "repository_url": "https://api.github.com/repos/octocat/example", "transient_environment": false, "production_environment": true }
删除部署
如果存储库只有一个部署,则无论其状态如何,您都可以删除该部署。如果存储库有多个部署,则您只能删除非活动部署。这确保了具有多个部署的存储库将始终具有活动部署。
要将部署设置为非活动状态,您必须
- 创建一个新的活动部署,以便系统记录当前状态,然后删除先前活动的部署。
- 通过添加任何非成功的部署状态将活动部署标记为非活动状态。
OAuth 应用程序令牌和个人访问令牌(经典)需要 repo
或 repo_deployment
范围才能使用此端点。
用于“删除部署”的细粒度访问令牌
此端点适用于以下细粒度令牌类型:
细粒度令牌必须具有以下权限集
- “部署”存储库权限(写入)
“删除部署”的参数
名称、类型、描述 |
---|
accept 字符串建议设置为 |
名称、类型、描述 |
---|
owner 字符串 必需代码库的账户所有者。名称不区分大小写。 |
repo 字符串 必需代码库的名称,不含 |
deployment_id 整数 必需deployment_id 参数 |
“删除部署”的 HTTP 响应状态代码
状态代码 | 描述 |
---|---|
204 | 无内容 |
404 | 资源未找到 |
422 | 验证失败,或端点已被垃圾邮件发送。 |
“删除部署”的代码示例
请求示例
curl -L \ -X DELETE \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer <YOUR-TOKEN>" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/OWNER/REPO/deployments/DEPLOYMENT_ID
响应
状态:204