Add signed, notarized releases with the server inside the app

This commit is contained in:
Ian Gulliver
2026-10-18 15:19:57 -07:00
parent 10a80ccb22
commit 6b86a7d5a9
20 changed files with 388 additions and 66 deletions
+101
View File
@@ -0,0 +1,101 @@
package main
import (
"context"
"encoding/xml"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"g.fc.run/misc/byre/internal/tailscale"
)
const serviceLabel = "run.fc.byre"
const plistTemplate = `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>%s</string>
<key>ProgramArguments</key>
<array>
<string>%s</string>
<string>serve</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>%s</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>%s</string>
<key>StandardErrorPath</key>
<string>%s</string>
</dict>
</plist>
`
func installCmd() {
exe, err := os.Executable()
if err != nil {
fatal("find executable", "err", err)
}
exe, err = filepath.EvalSymlinks(exe)
if err != nil {
fatal("resolve executable", "err", err)
}
home, err := os.UserHomeDir()
if err != nil {
fatal("home dir", "err", err)
}
plistPath := filepath.Join(home, "Library", "LaunchAgents", serviceLabel+".plist")
logPath := filepath.Join(home, "Library", "Logs", "byre.log")
plist := fmt.Sprintf(plistTemplate, xmlText(serviceLabel), xmlText(exe), xmlText(filepath.Dir(exe)+":"+os.Getenv("PATH")), xmlText(logPath), xmlText(logPath))
err = os.MkdirAll(filepath.Dir(plistPath), 0o755)
if err != nil {
fatal("create launch agents dir", "err", err)
}
err = os.WriteFile(plistPath, []byte(plist), 0o644)
if err != nil {
fatal("write launch agent", "err", err)
}
fmt.Println("wrote", plistPath)
domain := fmt.Sprintf("gui/%d", os.Getuid())
service := domain + "/" + serviceLabel
if exec.Command("launchctl", "print", service).Run() == nil {
run("launchctl", "bootout", service)
}
run("launchctl", "bootstrap", domain, plistPath)
fmt.Println("started", service, "running", exe)
url, err := tailscale.ServeRoot(context.Background(), "http://"+defaultListen)
if err != nil {
fatal("tailscale serve", "err", err)
}
fmt.Println("byre is at", url)
}
func run(name string, args ...string) {
cmd := exec.Command(name, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fatal("run "+name, "args", args, "err", err)
}
}
func xmlText(s string) string {
var b strings.Builder
xml.EscapeText(&b, []byte(s))
return b.String()
}
+3 -1
View File
@@ -14,6 +14,8 @@ func main() {
switch os.Args[1] {
case "serve":
serveCmd(os.Args[2:])
case "install":
installCmd()
case "run":
runCmd(os.Args[2:])
default:
@@ -22,7 +24,7 @@ func main() {
}
func usage() {
fmt.Fprintln(os.Stderr, "usage: byre serve | byre run [--resume ID]")
fmt.Fprintln(os.Stderr, "usage: byre serve | byre install | byre run [--resume ID]")
os.Exit(2)
}
+3 -1
View File
@@ -17,6 +17,8 @@ import (
"g.fc.run/misc/byre/internal/store"
)
const defaultListen = "127.0.0.1:8270"
func serveCmd(args []string) {
configDir, err := os.UserConfigDir()
if err != nil {
@@ -25,7 +27,7 @@ func serveCmd(args []string) {
flags := flag.NewFlagSet("serve", flag.ExitOnError)
dataDir := flags.String("data", filepath.Join(configDir, "byre"), "directory holding byre's database, worktrees, leads and blobs")
listenAddr := flags.String("listen", "127.0.0.1:8270", "address to listen on")
listenAddr := flags.String("listen", defaultListen, "address to listen on")
ports := flags.Int("ports", store.DefaultPortFirst, "first port of the tasks' port blocks")
flags.Parse(args)