使用GITLAB的API自动更新部署代码

对于一些小项目而言,在 Gitlab 上开发完成并部署到服务器上后,出于修改或者增加功能的需要,常常要更新服务器中的程序代码,我们当然可以手动将更新的代码上传到服务器中,但是这样无疑要增加很多繁琐的操作步骤。对于使用 Gitlab 托管代码的应用程序而言,我们完全可以使用 Gitlab 的 API 和服务器中的脚本来实现代码的自动更新。

实现自动更新的基本方法是,通过 Gitlab 项目的 Webhook 功能,在每次发生了可以触发 Hook 的事件后,Gitlab 会向一个我们填写的 URL 发送包含项目和事件信息的 JSON 数据。接收到数据后,服务器上的脚本就可以通过数据判断需要更新哪些文件,再删除或者通过 Gitlab 的 API 来更新这些文件即可。

下面来记录一下如何操作。

一、为项目设置 Webhook

首先登陆 Gitlab 并进入项目的 Settings -> Integrations 选项中,在 URL 一栏中填写想要发送数据的 URL,下面的 Secret Token 用于验证 Gitlab 的身份,填写的字符会被在名为 X-Gitlab-Token 的 HTTP Header 中和数据一起被发送,这样服务器就能确认这是从 Gitlab 发送的数据而不是其它假冒的来源。

Webhook URL 和 Secret Token

在这一栏的下方,有一些可以选择的能够触发 Webhook 的项目事件,关于这些事件的信息都会被一起发送到指定的 URL 中。设置好了之后就可以在服务器上写一个测试脚本来测试能否收到 Webhook 的数据,Gitlab 会在 Webhook 的 Events 页面中显示服务器返回的数据,可以以此来检测工作状态。

二、解析 Webhook 发送的数据

关于 Webhook 发送的数据格式的帮助可以在它的官网上找到,更新项目的代码至少需要获取的数据有(括号里为将 JSON 数据转换为 PHP 对象后的结构,JSON 数据对象用“data”代替):

  • 项目的 ID(data->project_id)
  • 项目中被更改的文件路径(data->commits[0]->added/modified/removed[0])

在将 JSON 转换为 PHP 对象后,其中 commits[0] 是指 commits 数组里的第一个 commit,这个 commit 是一个对象,其中的 added、modified 和 removed 是三个数组,里面分别存放着被添加的、被修改的和被移除的文件在项目中的路径。

三、使用 Gitlab 的 API 进行代码的更新

有了以上的数据,我们就能够知道要从 Gitlab 获取什么内容了,我的操作是将添加的(added)和修改的(modified)都下载到服务器上并覆盖原来的文件(无论原来文件是否存在),将移除的(removed)文件从服务器上删掉。

然而,要从 Gitlab 获取更新后的代码,只有这些文件的路径和项目 ID 是不够的。还需要拥有权限的 Gitlab 用户的 Personal Access Token 来调用 API,接下来我们就设置 Token。

打开对项目有查看权限的用户的 Settings 页面,选择 Access Tokens 选项,进入这个页,会看到 Personal Access Token 一栏。

Persional Access Token 页面

在 Name 一栏中填写这个 Token 的标识名字(主要是为了帮自己查看),可以在下面的 Expires at 一栏中设置有效时长,也可以不填即为永久有效。在下面有几个选项,这是 Token 可以被授权的功能,要更新代码只需要获取文件内容的 API 即可,所以我们可以选择只选择 api。

填写好后,点击 Create personal access token 按钮创建 Token 即可。然后将显示的 Token 记下,它将不被 Gitlab 保存记录,也就是说 Token 只显示这一次,以后无法查看,所以要将它保管好。

Token 要被放在 API 请求的 HTTP Header 中,名为 PRIVATE-TOKEN,这样才能被 Gitlab 识别。

四、使用 API 自动更新代码

有了 Token,Project ID 和被更改文件的项目路径,我们就可以实现自动更新代码的功能了。

我们可以在 Webhook 指向的 URL 处写一个脚本来实现这一功能:

  1. 获取 Webhook 发送的信息;
  2. 使用 Personal access token 通过 Gitlab 的 API 获取更新文件的内容;
  3. 更新或删除服务器上的代码。

以 PHP 为例,我们可以使用 curl 函数来调用 API,需要注意的是,Gitlab 的 API 调用 URL 中,要获取的项目中文件的路径需要使用 URL 转码过的字符串,这些使用说明可以在这里找到。

以上。


使用GITLAB的API自动更新部署代码
https://maphical.cn/2018/01/auto-update-repo-using-gitlab-api/
作者
MaphicalYng
发布于
2018年1月13日
许可协议