30个稳定版本

1.6.1041 2024年4月22日
1.6.826 2023年8月15日
1.6.652 2023年2月7日
1.6.607 2022年11月14日
1.5.71 2020年3月19日

#21 in #restart

2,588 stars & 83 watchers

69KB
1.5K SLoC

启动器

Habitat 的启动器是 Supervisor 的伴随进程,它为 Supervisor 提供了一种代表 Supervisor 启动进程的机制。它是运行 Supervisor 的入口点,也是 Supervisor 的 Supervisor。它设计为以进程 1 运行;它极为简约,尽可能地包含最少的依赖和最少的 unsafe Rust 代码。它的职责包括

  • 启动 Habitat Supervisor
  • 在关闭时重启 Habitat Supervisor(Supervisor 的 Supervisor)
  • 代表 Supervisor 启动、停止和重启进程

启动器专门设计为允许 Supervisor 在不关闭或重新父化其监督的服务的情况下进行自我更新。它与 Supervisor 独立版本化,并且应该很少更新,因为如果它作为进程 1 运行,则启动器的更新可能需要系统重启。

如何

监督器始终由启动器启动。启动器将始终尝试启动主机上安装的最新版本的监督器包。当启动器启动监督器时,将通过特定平台的IPC通道进行握手。监督器通过二进制协议通过启动器客户端与启动器进行通信。

当监督器需要启动一个长时间运行的过程时,它向启动器发送一个Spawn消息,并接收到一个包含运行进程的PID或错误消息的回复。监督器将监视此进程,并根据需要请求启动器停止或重启它。如果监督器由于自动更新而崩溃或重启,它将重新连接到所有正在运行的服务并正常继续操作。

开发说明

由于启动器相对于habitat生态系统中的其余部分更新较少,它有一个独立的构建和发布流程。要本地构建,请在此目录下运行

cargo build

。要为发布构建,请在工作室中对此目录运行build命令。

测试

由于监督器需要启动器启动,并且它始终尝试启动主机上打包和安装的最新版本监督器,您可能发现启动您的开发版本监督器很困难。您可以通过将HAB_SUP_BINARY环境变量设置为要启动的期望监督器二进制文件的文件路径来强制监督器启动特定的监督器版本。

构建Windows发布版

启动器可以可选地以通过svc_user声明的替代身份启动Windows进程。Windows要求为此身份提供密码。我们在加载服务时加密该身份,并在启动器启动新进程时解密密码。我们使用一个秘密密钥“复杂化”这个加密。此密钥存储在1password中,并在构建hablauncher时必须在HAB_CRYPTO_KEY环境变量中设置。hab构建从秘密appveyor密钥中获取此密钥,但每次手动构建启动器时都必须手动设置密钥。

我们有一个appveyor构建,当代码更改合并到launcher组件时,将构建和推广Windows启动器。为了使新的启动器包含在Habitat Windows服务中,并构建到Docker化的Windows Studio中,需要调用windows-service存储库的新Appveyor构建。这构建、上传并推广了windows-service Habitat包。最好的方法是使用其rest API。首先,您将需要一个访问令牌进行身份验证。您可以通过在Appveyor网站上登录并在api-keys页面上操作来获取此令牌。从账户下拉菜单中选择“chef”,然后复制您的访问令牌。有了这个,以下PowerShell脚本将调用构建

$token = 'MY_BEARER_TOKEN'
$headers = @{
  "Authorization" = "Bearer $token"
  "Content-type" = "application/json"
}
$body = @"
{
    "accountName": "chef",
    "projectSlug": "windows-service",
    "branch": "master"
}
"@
curl -H  -Uri 'https://ci.appveyor.com/api/builds' -Headers $headers -Method Post -Body $body

在bash中

token=MY_BEARER_TOKEN
curl -H "Content-type: application/json" -H "Authorization: Bearer ${token}"  https://ci.appveyor.com/api/builds -X POST --data "{'accountName': 'chef','projectSlug': 'windows-service','branch': 'master'}"

您必须在开始Windows发布构建之前调用此构建。

构建x86_64-linux-kernel2发布版

如果您正在推广针对x86_64-linux和x86_64-windows的启动器,您还需要手动构建一个针对x86_64-linux-kernel2的启动器。您可以通过创建一个CentOS-6虚拟机来实现,这个虚拟机可以是在您的笔记本电脑上或者云实例中。所有后续的指令都在这个虚拟机环境中执行。一旦虚拟机启动,您需要获取一个x86_64-linux-kernel2 hab二进制文件,可以通过传递install.sh脚本的-t参数来下载:curl https://raw.githubusercontent.com/habitat-sh/habitat/master/components/hab/install.sh | sudo bash -s -- -t x86_64-linux-kernel2。然后,您需要获取核心原点签名密钥并将它们安装。接下来,您需要克隆此仓库。完成后,进入创建的目录并运行env HAB_ORIGIN=core hab pkg build components/launcher。生成的hart文件应上传到构建者的unstable频道。注意$pkg_ident,以便在管道中使用。

发布

要发布新的supervisor版本,上传新的.hart文件,然后在构建者中将它提升到稳定版。如果新版本包含重要功能或错误修复,必须将其通知社区并手动安装。由于启动器的特性,这将在生产环境中需要停机,但这应该是一个极其罕见的事件。

依赖

~10–21MB
~342K SLoC