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