2个版本
0.1.1 | 2023年4月9日 |
---|---|
0.1.0 | 2023年4月9日 |
在 HTTP服务器 中排名 673
每月下载量 27
61KB
1K SLoC
system-hook
shook
的核心是一个监听来自Github的webhooks的web服务器,然后会自动拉取您仓库的新更改并使用新代码重启您的生产服务器。Shook假定您的服务器是通过 systemd
运行的,并将自动拉取新更改并重启服务。
安装
注意: shook
旨在在运行 systemd
的Linux系统上运行。
cargo-binstall
shook
可以使用 cargo-binstall
安装。
cargo binstall system-hook
Github版本
shook
可以从 Github版本 下载。
从源代码构建
shook
可以使用cargo从源代码构建。
cargo install system-hook
或者,本地
git clone https://github.com/beaconbrigade/system-hook.git
cd system-hook
cargo build --release
用法
shook
有三个主要命令:init
、serve
和 daemon
。要准备 shook
,请导航到您想要监视的仓库,并运行 sudo shook init
。备注: shook
通常需要以root身份运行,因为它与 systemctl
交互或需要将文件写入 /etc/systemd/system/
目录。 shook
将引导您创建配置,并在您的仓库目录和 /etc/systemd/system/shook.service
中生成 shook.toml
。该 shook.toml
文件告诉 shook
如何运行。
在生成一个 shook.toml
文件后,可以使用 shook serve
运行 shook
,这将在您的终端中启动服务器,或者运行 sudo shook daemon start
启动 shook
的 systemd 服务。为了测试 shook
,玩转 shook serve
是个好主意,您可以使用命令行参数来增强 shook.toml
文件中的值。在生产环境中运行时,可能更方便运行 sudo shook daemon enable
以使 shook
在您的计算机启动时启动。注意:shook daemon
在幕后只是运行 systemctl
的 start
、stop
和 enable
,因此如果您想的话,可以绕过 shook
直接运行这些命令。
位于 nginx
之后的示例
如果您的主服务器在 nginx
之后运行,您的 webhook 代理可能看起来像这样
http {
server {
# example route to serve static files
location / {
root /www-data;
}
# proxy `shook` behind nginx
location /webhook {
# remove the '/webhook' part of the url so requests to https://yourserver.com/webhook
# are POSTed to '/' on `shook` (as it expects).
rewrite /webhook(.*) /$1 break;
# pass requests onto `shook`
proxy_pass http://unix://var/run/shook.sock;
}
}
}
测试
作为旁注,测试您的 webhook 服务器是否工作可能非常有用。您可以使用 Github CLI 来帮助完成这项任务。请参阅 此处 设置 webhook 测试。为了测试 shook
,我在 Github 上创建了一个测试仓库,其中包含一个名为 update.sh
的脚本,该脚本将数据追加到 README.md 文件中,然后提交并推送。然后,在一个终端中运行 shook serve --log-level=trace
,在另一个终端中运行 gh webhook ...
,在第三个终端中运行 ./update.sh
,您可以测试您的部署。
详细信息
shook
创建自己的 systemd
服务以开始监听事件。该 shook
服务简单地从正确目录运行 shook serve
,并设置默认日志级别和日志文件为 /var/log/shook.log
。The github-webhook-extract
crate 提供了 Github webhook 事件的路由提取器(注意:github-webhook-extract
目前支持的事件非常少)。The text-completions
crate 为 shook init
命令提供了环境变量和路径自动完成。
shook init
该 init
命令将生成 shook
的 systemd 服务文件以及您仓库的 shook.toml
。每个配置值的值可以通过命令行传递,如果没有提供,则将从 stdin 使用 dialoguer
读取。The init
命令将每个配置值存储在您指定的仓库目录中的 shook.toml
中。由 shook
生成的 shook.service
文件将调用 shook serve
,并将日志文件设置为 /var/log/shook.log
,并将工作目录设置为您的仓库路径。
shook serve
《serve》命令将读取《shook.toml》文件来配置自身。当服务器接收到POST消息时,它将从其中提取GitHub有效载荷,然后检查事件是否与配置中允许的事件匹配。如果匹配,它将使用《git》拉取最新更改,然后使用《systemctl restart》重启服务。每个配置字段都会影响服务器,以下是一个示例:
username = "rcullen"
repo_path = "/home/rcullen/rust/test-webhoks"
remote = "origin"
branch = "master"
system_name = "test-restart"
update_events = ["push"]
socket_group = "www-data"
socket_user = "www-data"
[addr]
type = "Unix"
value = "/var/run/shook.sock"
- 用户名:将使用《shook》用户,并通过《su》切换到该用户来运行《git pull》命令,以便应用正确的《https》或《ssh》验证。
- 仓库路径:将使用此目录作为其工作目录,在此处拉取更改,并在其中查找《shook.toml》。
- 远程:这是《shook》将使用git拉取的远程地址,它是《git pull origin main》中的《origin》。
- 分支:这是《shook》将尝试拉取的分支。
- 系统名称:这是当《shook》收到webhook有效载荷时将重启的系统。
- 更新事件:这是一个GitHub webhook事件列表,当《shook》收到后,将拉取代码。
- 套接字组:如果《shook》配置为监听Unix套接字,则将其套接字更改组为此组。
- 套接字用户:如果《shook》配置为监听Unix套接字,则将其套接字更改用户为此用户。
- 地址:《shook》将监听的地址:可以是Unix套接字(文件路径)或TCP套接字(套接字地址)。
最后注意:如果《shook》通过Unix套接字提供服务,则将套接字权限更改为《0o666》。
shook守护进程
《daemon》命令是在《systemctl》上的简单代理。它可以轻松绕过而不会造成任何伤害。
依赖项
~20–32MB
~434K SLoC