#github-webhook #webhook #systemd #ci #command-line

app system-hook

shook:用于自动更新生产服务器的webhook服务器

2个版本

0.1.1 2023年4月9日
0.1.0 2023年4月9日

HTTP服务器 中排名 673

每月下载量 27

MIT 许可证

61KB
1K SLoC

system-hook

Crates.io Docs.rs

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 有三个主要命令:initservedaemon。要准备 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 在幕后只是运行 systemctlstartstopenable,因此如果您想的话,可以绕过 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