GithubReleaseHook 开发笔记

项目地址:richard1122/GithubReleaseHook

项目背景

目前的项目部署方式基本使用 Git Hook 部署源码,本地编译后运行的方式。但有些项目编译依赖复杂,如果在服务器上编译成本较高。

可以选择使用 CI 服务(如 Travis-CI)做编译,生成 Github Release 后直接由服务器运行,服务器不负责编译工作。

技术细节

本工具使用 .NET Core 跨平台运行,在 Windows 上开发,同时提供 Linux 下所需的 Docker 环境。

在 Windows 上使用 Git Bash 作为脚本的运行环境。推荐安装 Git For Windows 并将里面的 sh.exe 加入 Path 环境变量。

工作流程

GithubReleaseHook 开启一个 HTTP 服务器,收到 Github Release Hook 的 event 通知后,将下载 Release 附带的资源文件,执行自行配置的脚本进行部署、重启服务等操作。

Repo.yml

以博客为例, Github Release 上包含一份 Release.tar.gz 文件,是博客编译生成的全部静态文件。

1
2
3
4
5
6
7
repo: richard1122/blog.hlyue.com
file:
- release.tar.gz
script:
- tar xavf $f0
secret: sec
workingDir: /blog

其中 file 段接受多个文件,将会自动下载 Release 中对应的文件。

在 script 段中使用 $f[0-9] 如 $f0 表示前面 file 中的第一个文件,在运行脚本前会自动替换为下载的本地临时文件地址。

secret 是 Github Webhook 中填写的 secret key, Github 会在每个 event 通知中使用这个 secret 对请求 payload 做 HMAC-SHA1 签名,程序通过检查签名来判定这个请求来自 Github,因此需要妥善保管 Secret Key。

workingDir 是脚本的工作路径,如对于本博客来说会将 tar 自动解压缩到 /blog 目录

使用样例

本博客使用了 GithubReleaseHook 做自动部署操作。

博客使用 Hexo 静态博客生成器生成器,因此需要将源码(markdown等)编译到对应的 html 文件。

编译

使用 Travis-CI 做 hexo 编译工作,并且自动在编译完成后将编译后的全部网站文件提交 Github Release。 具体脚本可以参考 .travis.yml

Webhook

/richard1122/blog.hlyue.com 项目中添加 Webhook, Content-Type 选择 application/json, secret 务必使用唯一、随机生成的安全的 key ,以防止别人伪造 http 请求部署服务。 Webhook 类型选择 Release。

配置

由于博客本身是纯静态内容,使用主机中的 Nginx 做服务,因此博客自身的 Docker 只需要运行 Release Hook 这一个服务。

配置文件如下:

1
2
3
4
5
6
7
repo: richard1122/blog.hlyue.com
file:
- release.tar.gz
script:
- tar xavf $f0
secret: udih6n0lhYfaggtA
workingDir: /blog

Dockerfile:

1
2
3
4
FROM richard1122/githubreleasehook
RUN mkdir /blog
VOLUME /blog
COPY repo.yml /usr/src/app/

/usr/src/app 是项目的代码路径, /blog 是博客的静态文件路径。

将 repo.yml 文件复制到代码目录,docker 启动时会自动启动 Hook 解析配置文件。

release.tar.gz 是某个release 中由 travis 编译生成的静态网页文件。

因此脚本只需要将网页内容解压缩到对应的 Docker Volume 位置即可。

启动 Docker

docker run -p 8081:8081 --name blog -v /usr/share/nginx/blog:/blog blog

这里将 8081 端口映射了进去,因此在上面创建 Github Webhook 时候也需要使用 8081 端口