如何使用Webhook实施从GitHub到生产服务器的部署



我长期以来一直在GitHub上创建存储库的习惯。 这比将所有内容都保留在Google云端硬盘上或更糟糕的是将其保存在硬盘上要有效得多。 但是,这里的问题立即出现:如何部署到正常工作的服务器?

大多数搜索使我进入了Jenkins和其他持续部署工具。 但是我想找到一个不同的解决方案。 所以我去了免费的Webhook服务。

Skillbox建议:实用课程“ Mobile Developer PRO”

我们提醒您: 对于所有“ Habr”读者来说,使用“ Habr”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。

Webhook的技术基础是使用Ubuntu 16.04作为生产服务器的全新Digital Ocean Droplet。 为了减少实施计划所需的步骤数,所有操作均由root用户执行。

让我们从github开始


如果您有一个存储库并想使用它,则可以跳过此步骤-仅使用SSH URI就可以了。 如果没有,请创建一个并使用SSH URI。



安装Go和Webhook(数字海洋小滴)。

在开始之前,值得使用全新的Ubuntu 16.04安装程序进行快速更新和升级。

sudo apt update -y && sudo apt upgrade -y 

现在要安装WebHook,您需要安装Go编程语言。 在撰写本文时,版本1.11.4是相关的,因此,如果您使用其他版本,则需要进行更改。

 wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.11.4.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin 

现在该下载最新版本的Webhook。

 go get github.com/adnanh/webhook 

下载过程中没有进度条,因此您只需等待。 该过程完成后,执行〜/ go / bin / webhook。

Webhook已安装,但是您需要创建目录和文件结构,以便一切正常进行。

 mkdir ~/webhooks mkdir ~/webhooks/deployment-tutorial touch ~/webhooks/hooks.json touch ~/webhooks/deployment-tutorial/deploy.sh chmod +x ~/webhooks/deployment-tutorial/deploy.sh 

hooks.json文件负责配置和路由,deploy.sh用作执行从GitHub升级所需命令的工具。

第一步是通过在文本编辑器中打开hooks.json来配置它。 该文件包含在Webhook启动后将创建的端点的配置,并且是对象的数组,每个对象都是唯一的端点。

 [{ "id": "deployment-tutorial", "execute-command": "/root/webhooks/deployment-tutorial/deploy.sh", "command-working-directory": "/root/deployed-site/", "response-message": "Executing deploy script...", "trigger-rule": { "match": { "type": "payload-hash-sha1", "secret": "The Returners", "parameter": { "source": "header", "name": "X-Hub-Signature" } } } }] 

Id是将用于端点URL的唯一名称;
execute- command-激活端点时将执行的脚本;
command-working-directory-执行命令时使用的目录;
trigger-rule-用于信息安全目的的选项,这是端点的秘密短语。

让我提醒您,我是从root执行所有操作的,因此起始地址为/ root。 如果以普通用户身份登录,则需要注册/ home / username,其中username(这是合乎逻辑的)是该用户的名称。 无需使用〜/,路径必须是绝对的,否则会出现错误。

您可能已经注意到我们设置了一个尚不存在的工作文件夹。 在创建它之前,您需要完成deploy.sh。

脚本应始终以“ shebang”开头。 在打开文件之前,您应该运行哪个bash。 好了,然后在脚本中执行以下命令:

 #!/bin/bash git fetch --all git checkout --force "origin/master" 

现在,Go和Webhook均已安装,因此您需要在hooks.json中配置配置并编写负责部署的脚本。 他将使用GitHub存储库的主分支更改目标目录。

最后,是时候使Webhook进入活动模式了,用Doplet的工作IP代替000,000,000,000。

 /root/go/bin/webhook -hooks /root/webhooks/hooks.json -ip "000.000.000.000" -verbose 

在运行时,您可能会注意到结尾处带有{id}的URL输出。 这是已经在hooks.json:部署教程文件中创建的对象的ID。

设置Git(数字海洋液滴)


服务器设置尚未完成。 要完成它,您需要打开一个新的终端窗口,并在第一个窗口运行Webhook时在服务器上再次进行身份验证。 在开始时,我们设置了存储库URI,现在我们需要使用它。

为此,请转到hooks.json中指定的工作目录并编写以下内容:

 git init git remote add origin git@github.com:jhsu98/deployment-tutorial.git 

在这种情况下,您需要用自己的URI代替我所指示的URI。

最后一步是生成SSH密钥,以便在其帮助下连接到GitHub。 在终端窗口中,键入ssh-keygen,然后按Enter确认直到生成密钥。 然后,您需要通过输入cat〜/ .ssh / id_rsa.pub显示公共密钥。 您得到的是这样的:

 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyzJrPVOJqsTqD2R3xirTp3VNMwpmJMyLklzJg4sRQyslTUmbNNmDVO573EbXQQf2PqPQljqKDDlSaELdav4OTi1gPCoDary300yUqC/efLGHflZ6pMNuGsP2zTzerD/TMjzl1FXF1wOGTXqcC4TvGBS1bFyUY5n8wSOJ8ntZ6bBNv0zA2t7X1vH8ahIBJLKCayq9ipobKlHPYqxBt6zAoeh/ILQ0PWhGkmbGqqzqN1jcVWOefLgj4Dl8bZWORS1nkqrVg2wFC2nnibH97kZLsNrdQaeK8jUrkUWkJcUELI02mkkqh2RtBx9EwQEvsm9YuDBD9xF+HyuWoAeqcKerb root@github-webhook-tutorial 

好了,现在剩下的就是建立GitHub存储库并测试部署。

配置部署密钥和Webhook(GitHub)


在浏览器中,转到存储库的设置。 首先,您需要添加部署密钥。



添加密钥时,您需要指定其名称并将其插入上方的密钥输出中。 GitHub允许您仅使用公共密钥,因此,如有必要,您需要指定多个密钥。 一切完成后,Webhook部分就轮到了。



本节中的三个字段需要特别注意。 这些是有效载荷URL,内容类型和机密。 有效负载URL是Webhook侦听的终结点,内容类型是数据格式,secret是hooks.json文件中的自定义行。 在我们的案例中,它是“回归者”。



创建Webhook之后,应在设置中出现一个相应的标记,表明服务器可用。 如果使用正常的Webhook检查终端,则可以看到存储库已在运行。

要检查工作流程,请将存储库复制到本地计算机(如果尚未完成),然后对主分支进行更改。 之后,它们应该显示在服务器上。 做完了

已经完成了所有这些操作的开发人员大约花费了10分钟进行配置。 但这是经过数小时的反复试验。 请记住以下四个重要的自定义功能:

  • 确保对hooks.json使用绝对路径。
  • 不要使deploy.sh可执行。
  • 在GitHub和生产服务器的第一个“联系”期间确认SSH连接。
  • 不要在bash脚本中使用错误的“ shebang”。

Skillbox建议:

Source: https://habr.com/ru/post/zh-CN456018/


All Articles