@appforge-ci/代理服务器
将Mac迷你变成舰队成员的建设者守护进程. 它会:
- 一次性在控制平面上注册 入学人数 符号 由仪表板(Fleet- 添加Mac迷你)生成.
- 每15秒发送一个心跳(CPU/mem/disk,当前构建, Tailscale) 如果安装了主机名) 并抓取任何待办事宜 远程管理 命令 (排水、恢复、重启、重新启动、运行命名维护) 脚本),在同一反应中.
- 长波
POST /agents/lease-job- 从来没有入境港口 在麦克迷你机上打开了. - 一次运行一个或多个构建( N)
resolveMaxConcurrentBuilds()内src/lib/config.ts—— 说APPFORGE_MAX_CONCURRENT_BUILDS编号 :AgentConfig.maxConcurrentBuilds,或从 CPU 自动检测出默认值 核心计数,上限为 4),每个计数器都在自己的任务范围目录中:克隆 复出,读取appforge.yaml,运行工作流程scripts顺序 通过bash -lc,溪流逐行记录,上传匹配 文物通过预先签名的 URL 直通 Cloudflare R2 然后报告 成功/失败。 见docs/fleet-management.md'同时期建筑' 用于全景。 受管制的VPN建筑(承载sandbox)是例外:它单独运行,而代理本身拒绝 与它共享 Mac (src/lib/exclusive-builds.ts, (中文(简体) ),docs/vpn.md, (中文(简体) ), "规范模式".
在Mac迷你电脑上设置
如果这回波已经克隆在机器上(对于你自己的笔记本电脑来说,
或任何迷你的东西 git cloned直接,有一个命令路径——看
docs/self-hosting.md'""添加一款Mac迷你"一节:
appforge-admin login --api-url <url> --admin-api-url <url> # once
appforge-admin agents add-mac --name "mac-mini-1"
这要求入学证 读这台机器自己的信息,
注册并安装一个 launchd 服务( 无) sudo在一个步骤。 然后结束
登录它需要的(在服务器上撤销了符号并删除文件); --keep-login
保留它:登录是一个长寿的
表示房客们能用这个Mac来读
cli-credentials-off-build-mac 在那里检查失败; docs/security.md,"一个CLI登录
永远不要留在一个建Mac"。 下方的从擦出路径不需要登录 Mac .
对于一个完全没有这种再现克隆的从碎纸盒——没有
git clone,没有 pnpm install 实际安装两个CLI
需要从 npm 改为:
# 1. Prerequisites (once per machine) — see infra/mac-mini-setup/bootstrap.sh
# for the full list (Homebrew, Xcode CLT, Node, CocoaPods, fastlane,
# Android SDK/adb if you also build Android/Flutter/RN apps), or run
# `appforge-admin agents bootstrap` once it's installed below (skips
# the sudo/system-setting parts unless you pass --full).
npm install -g @appforge-ci/admin-cli @appforge-ci/agent
# ^ needs a version actually published first (tag-triggered
# .github/workflows/publish.yml, gated on an NPM_TOKEN secret that
# isn't set up on this instance yet) — 404s until then. See
# packages/admin-cli/README.md's "Install" section for the
# `npm link`-from-a-checkout path that works today.
# 2. Enroll — get a token with `appforge-admin agents enroll`:
appforge-agent enroll \
--api-url https://your-admin-api-instance.example \
--token afe_xxx \
--name "mac-mini-1"
# Already enrolled? `enroll` refuses unless you pass --force. The control
# plane dedupes on this Mac's hardware UUID, so a re-enroll rotates the
# agent token and keeps the same fleet record — it can't make a duplicate.
# 3. Run it directly to sanity-check...
appforge-agent run
# 4. ...then Ctrl-C and install as a launchd service so it survives
# reboots/logouts — no sudo, no copying files, points straight at
# wherever npm just installed this binary:
appforge-agent install-service
# If another account is this Mac's auto-login account (a Mac that also hosts a
# GitHub Actions runner, say), a LaunchAgent would wait for a manual login after
# every reboot. Install the agent as a boot-time LaunchDaemon instead (asks for
# sudo; runs as your account; `--dry-run` previews every step):
appforge-agent install-service --daemon
install-service 旗帜 : --daemon (启动时间启动守护进程,见上文), --dry-run (与 --daemon数字 :
打印步骤和列表,不更改任何内容), --force (尽管运行的代理报告)
活动构建; 重新启动取消它们), --drop-env (让新的 plist drop 操作员按键, 如
APPFORGE_SANDBOX_MONITOR 列表被替换的套件和此 shell 不导出; 没有它,则
守护进程安装拒绝). 没有重新运行 --daemon 保留已安装的窗体.
细节、回滚和限制: docs/fleet-management.md,"代理服务表".
这个Mac会自己回来吗? appforge-agent doctor
只读检查,运行于Mac本身作为运行代理的用户. 它会回答什么
docs/datacenter-readiness.md 结束(拉起电源,代理机在
在不拉动电源的情况下:
appforge-agent doctor # human-readable; exit 1 if anything fails
appforge-agent doctor --json # the same, machine-readable, with a `rebootRecovery` roll-up
appforge-agent doctor --strict # exit 1 on warnings too
| 组 | 检查 |
|---|---|
| 重新启动恢复 | FileVault 关闭; 代理服务器的服务启动时没有登录( 启动守护进程, 或启动代理服务器) 自动登录 gitHub跑腿的服务也一样; autorestart 开始 |
| 服务 | 每个安装 com.appforge.* 启动的任务是装入而不是冲洗;每个已建的应用程序( )packages/agent, (中文(简体) ), apps/*)可以解决其依赖性;服务不给一个版本贴上标签 node; 代理设备被安装为一个启动的任务( 不是一次启动守护进程和一个启动代理设备) ; 在服务配置(# 902) 中无法读取控制- 飞机密钥 ; 没有 CLI 登录令牌 ~/.appforge-admin 或者说 ~/.appforge (单位:千美元)cli-credentials-off-build-mac, # 904: 租户的建置像这个用户一样运行并且可以读取; 跳过没有代理的机器, 如操作员的笔记本电脑; 运行代理的心跳是新鲜的 |
| 东道主 | 从不睡在AC电源上;稳定的主机名(macOS) HostName 设置; 如果使用, 缩放为守护进程; 远程登录; 无密码 shutdown -r now 页:1 REBOOT_HOST; 免费磁盘 |
| 网络 | 默认的路由不是Wi-Fi; Wi-Fi 不与有线链接相接(一个Mac上的两个局域网地址); 当Wi-Fi 实值 链接,它最多损失了20平方英尺的2%到网关(a) tart pull (不恢复) 相机迷你机没有Wi-Fi,所以悄悄依赖它的迷你机在移动中无法幸存;跳过笔记本电脑,当VPN是默认路线时 |
一台笔记本电脑(battery present)跳过仅对无人看管的Mac重要的检查. install-service
财务报告和审定财务报表 appforge-admin agents add-mac 完成后打印重新启动恢复判决.
沙盒自试( 规范建筑)
当工作要求时,代理商可以在macOS Seatbelt sandbox 下运行一个建筑的脚本 (还没有问) 要检查这个 Mac:
appforge-agent sandbox-selftest # the matrix, against this Mac's real home; exit 0 pass / 1 fail / 2 inconclusive
appforge-agent sandbox-run --proxy-port 18888 -- /bin/bash -lc 'flutter pub get' # one command under the same profile
代理在每次规范构建之前运行相同的矩阵,并且只有在操作员选择
显示器与 APPFORGE_SANDBOX_MONITOR=1 (默认关闭;金丝雀 Mac 第一位),开始和每10次
还有几分钟 报告 enforcementLevel: sandbox 只有当它通过。 这是绕行的回归套件
上面列出的是课堂,而不是监禁的证据. APPFORGE_SANDBOX_DISABLED=1 是操作员杀死
切换: 设置在您运行的外壳中 appforge-agent install-service 从(被烤入)
启动列表 APPFORGE_MAX_CONCURRENT_BUILDS; 下一张列表的手编辑被删除
(原始内容存档于2018-10-21). Snock. 矩阵的无框控件简短地写到 /opt/homebrew/bin 财务报告和审定财务报表
~/Library/LaunchAgents一个丢弃的首选项域, 并提交一个启动的工作, 在每次运行。 程序和说明: docs/manual-sandbox-validation.md。 。 。 .
如何是建筑克隆人
每个 https 创建克隆(并获取其 commitSha) 带有 hermetic git : 没有系统或 global git 配置, 是空的 $HOME,没有
麻烦你,不急,不急,不急 GIT_*编号 :SSH_* 变量。 私人 GitHub 寄存器获得 GitHub App 的 1 小时代号
只在这种环境下; 所有其他的克隆都是匿名的, 所以Mac自己的登录(gh钥匙链, ~/.netrc从来没有什么
克隆租户的仓库(appforge-ci#893). 一个ssh遥控器没有改变。 一个自负者,他的Mac服务 一个值得信赖的Ong和谁
使用该登录的克隆私有寄存器可选择返回 APPFORGE_AMBIENT_GIT_CREDENTIALS=1 运行在外壳中
install-service (像上面的把手一样被压入名单); 从来没有在运行其他兽人建筑的Mac上. docs/github-app.md。 。 。 .
远程管理,为什么它是一个许可列表
仪表盘只能发出八种命令之一
(单位:千美元)DRAIN, (中文(简体) ), RESUME, (中文(简体) ), REBOOT_HOST, (中文(简体) ), RESTART_AGENT, (中文(简体) ),
RUN_MAINTENANCE_SCRIPT, (中文(简体) ), UPDATE_AGENT, (中文(简体) ), CANCEL_BUILD, (中文(简体) ), TEST_TUNNEL) -- -- 有:
故意没有"运行任意的外壳命令"终点. UPDATE_AGENT
排出毒剂,等待 每一个在飞行中,然后自我更新和
重新执行; CANCEL_BUILD 杀死一个完全命名的建筑进程组
在这个代理的并行槽中 见 docs/fleet-management.md是因为
命令表格. RUN_MAINTENANCE_SCRIPT 进一步
要求脚本名称已经存在于此机器的本地
~/.appforge-agent/config.json 下级 maintenanceScripts,例如:
{
"...": "... (written by `enroll`)",
"maintenanceScripts": {
"clear-derived-data": "rm -rf ~/Library/Developer/Xcode/DerivedData/*",
"update-cocoapods": "sudo gem install cocoapods",
"prune-simulators": "xcrun simctl delete unavailable"
}
}
REBOOT_HOST 弹壳向外 sudo /sbin/shutdown -r now; 给代理人的
使用精确范围为该命令的顺从者条目(见
infra/mac-mini-setup/bootstrap.sh),不是被子苏道.
对于此许可列表以外的任何内容——交互式调试,安装一个
新 Xcode 版本, 监视一个被卡住的建筑的屏幕—— 使用真正的远程
桌面工具( Tailscale SSH, 苹果远程桌面, 或 tailscale funnel(原始内容存档于2019-09-25). /VNC. AppForge故意不重新执行远程外壳或
屏幕共享 主机; 见Docs/fleet-management.md. (本节)
浏览器中的“测试浏览器”特性不同:
模拟/模拟屏幕 用于制造的应用程序,而不是Mac迷你机自己的
桌面 — 见应用程序/设备流/README.md.)