From d59a8a041543f4b8804084e52eeae1d113f24d10 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Fri, 13 Mar 2026 11:18:51 +0800 Subject: [PATCH 1/3] fix(accountsvc): guard nil agent registry on startup --- api/api.go | 17 +++++++++++++++++ api/api_test.go | 11 +++++++++++ cmd/accountsvc/main.go | 10 ++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/api/api.go b/api/api.go index a9c18d0..7fe2895 100644 --- a/api/api.go +++ b/api/api.go @@ -13,6 +13,7 @@ import ( "math/big" "net/http" "net/url" + "reflect" "strings" "sync" "time" @@ -220,10 +221,26 @@ func WithOAuthFrontendURL(url string) Option { // WithAgentRegistry configures the handler with the provided agent registry. func WithAgentRegistry(registry agentRegistry) Option { return func(h *handler) { + if isNilAgentRegistry(registry) { + return + } h.agentRegistry = registry } } +func isNilAgentRegistry(registry agentRegistry) bool { + if registry == nil { + return true + } + value := reflect.ValueOf(registry) + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice: + return value.IsNil() + default: + return false + } +} + // WithGormDB configures the handler with the provided GORM database for admin settings. func WithGormDB(db *gorm.DB) Option { return func(h *handler) { diff --git a/api/api_test.go b/api/api_test.go index 3724e6d..b09ea9f 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -113,6 +113,17 @@ func extractVerificationCodeFromMessage(t *testing.T, msg capturedEmail) string return "" } +func TestWithAgentRegistry_IgnoresTypedNil(t *testing.T) { + var registry *agentserver.Registry + h := &handler{} + + WithAgentRegistry(registry)(h) + + if h.agentRegistry != nil { + t.Fatalf("expected nil agent registry, got %T", h.agentRegistry) + } +} + func decodeResponse(t *testing.T, rr *httptest.ResponseRecorder) apiResponse { t.Helper() var resp apiResponse diff --git a/cmd/accountsvc/main.go b/cmd/accountsvc/main.go index 9973682..ecb2f3d 100644 --- a/cmd/accountsvc/main.go +++ b/cmd/accountsvc/main.go @@ -841,10 +841,12 @@ func runServer(ctx context.Context, cfg *config.Config, logger *slog.Logger) err options = append(options, api.WithGormDB(gormDB)) // Pre-load sandbox bindings from database into the registry - var sandboxBindings []model.SandboxBinding - if err := gormDB.Find(&sandboxBindings).Error; err == nil { - for _, b := range sandboxBindings { - agentRegistry.SetSandboxAgent(b.AgentID, true) + if agentRegistry != nil { + var sandboxBindings []model.SandboxBinding + if err := gormDB.Find(&sandboxBindings).Error; err == nil { + for _, b := range sandboxBindings { + agentRegistry.SetSandboxAgent(b.AgentID, true) + } } } From 7a5e9fda080937051a29222558ffc56de038a065 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Sun, 15 Mar 2026 16:56:55 +0800 Subject: [PATCH 2/3] Add deploy and uninstall flows for process and docker modes --- README.md | 19 +++- docs/getting-started/installation.md | 19 +++- docs/usage/deployment.md | 21 +++- scripts/install-docker.sh | 155 +++++++++++++++++++++++++ scripts/install-process.sh | 163 +++++++++++++++++++++++++++ scripts/setup.sh | 148 +++++++++++++++++++----- scripts/uninstall-docker.sh | 42 +++++++ scripts/uninstall-process.sh | 36 ++++++ 8 files changed, 570 insertions(+), 33 deletions(-) create mode 100644 scripts/install-docker.sh create mode 100644 scripts/install-process.sh create mode 100644 scripts/uninstall-docker.sh create mode 100644 scripts/uninstall-process.sh diff --git a/README.md b/README.md index 3ed91fe..58ef713 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,25 @@ Cloud Neutral Toolkit 的账号与身份服务 (Account Service). ```bash curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ - | bash -s -- accounts.svc.plus + | bash -s -- accounts.svc.plus --mode process --deploy ``` +Docker 部署模式: + +```bash +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode docker --deploy +``` + +Cloud Run 部署模式: + +```bash +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode cloudrun +``` + +单机 `process` / `docker` 模式默认会写入 Caddy 站点配置到 `/etc/caddy/conf.d/accounts.svc.plus.conf`,并反向代理到本机 `127.0.0.1:8080`。 + ### 本地运行 (Local Dev) ```bash @@ -54,4 +70,3 @@ make dev - API 参考:`docs/api/overview.md` - 运维:`docs/operations/monitoring.md`, `docs/operations/troubleshooting.md` - Runbooks:`docs/Runbook/README.md` - diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 8bee115..b9df7b5 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -2,6 +2,22 @@ 本项目支持本地编译运行、Docker 容器运行,以及 Cloud Run 部署。以下步骤基于仓库现有脚本与配置。 +一键初始化脚本支持按部署模式选择: + +```bash +# 进程部署模式 +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode process + +# Docker 部署模式 +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode docker + +# Cloud Run 部署模式 +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode cloudrun +``` + ## 本地安装(Go) 前置条件: @@ -41,7 +57,8 @@ docker run --rm -p 8080:8080 \ ## Cloud Run 参考文件: -- `deploy/gcp/cloud-run/service.yaml` +- `deploy/gcp/cloud-run/prod-service.yaml` +- `deploy/gcp/cloud-run/preview-service.yaml` - `deploy/gcp/cloud-run/stunnel.conf` - `config/account.cloudrun.yaml` diff --git a/docs/usage/deployment.md b/docs/usage/deployment.md index a9b6213..fc426eb 100644 --- a/docs/usage/deployment.md +++ b/docs/usage/deployment.md @@ -5,23 +5,42 @@ 推荐通过 Makefile 与脚本执行: ```bash +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode process --deploy + make init-db make build make start ``` 默认启动脚本 `scripts/start.sh` 使用 `config/account.yaml`。 +单机部署脚本 `scripts/install-process.sh` 默认写入 Caddy 配置到 `/etc/caddy/conf.d/accounts.svc.plus.conf`。 ## Docker 详见 `getting-started/installation.md`。 +初始化命令: + +```bash +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode docker --deploy +``` + ## Cloud Run 仓库内的 Cloud Run 配置: -- `deploy/gcp/cloud-run/service.yaml` +- `deploy/gcp/cloud-run/prod-service.yaml` +- `deploy/gcp/cloud-run/preview-service.yaml` - `config/account.cloudrun.yaml` +初始化命令: + +```bash +curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit/accounts.svc.plus/main/scripts/setup.sh?$(date +%s)" \ + | bash -s -- accounts.svc.plus --mode cloudrun +``` + 特点: - 通过 `entrypoint.sh` + `CONFIG_TEMPLATE` 注入配置 - 附带 stunnel sidecar,用于安全连接数据库 diff --git a/scripts/install-docker.sh b/scripts/install-docker.sh new file mode 100644 index 0000000..fdf8631 --- /dev/null +++ b/scripts/install-docker.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +set -euo pipefail + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/_common.sh" + +if [[ "$(uname -s)" != "Linux" ]]; then + echo "docker deployment is only supported on Linux" >&2 + exit 1 +fi + +if [[ "${EUID}" -ne 0 ]]; then + echo "docker deployment must run as root" >&2 + exit 1 +fi + +need_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + echo "missing required command: $1" >&2 + exit 1 + fi +} + +need_cmd docker +need_cmd systemctl +need_cmd install +need_cmd curl + +SERVICE_NAME="${SERVICE_NAME:-accounts-svc-plus-docker}" +CONTAINER_NAME="${CONTAINER_NAME:-accounts-svc-plus}" +IMAGE_TAG="${IMAGE_TAG:-accounts-svc-plus:local}" +DOMAIN="${ACCOUNT_DOMAIN:-accounts.svc.plus}" +LISTEN_ADDR="${ACCOUNT_LISTEN_ADDR:-127.0.0.1:8080}" +PUBLIC_URL="${ACCOUNT_PUBLIC_URL:-https://${DOMAIN}}" +CONFIG_DIR="${CONFIG_DIR:-/etc/accounts.svc.plus}" +CONFIG_PATH="${CONFIG_PATH:-${CONFIG_DIR}/account.standalone.yaml}" +SYSTEMD_UNIT_PATH="${SYSTEMD_UNIT_PATH:-/etc/systemd/system/${SERVICE_NAME}.service}" +CADDY_CONF_DIR="${CADDY_CONF_DIR:-/etc/caddy/conf.d}" +CADDY_CONF_PATH="${CADDY_CONF_PATH:-${CADDY_CONF_DIR}/${DOMAIN}.conf}" +DOCKER_BIN="$(command -v docker)" + +install -d -m 0755 "${CONFIG_DIR}" "${CADDY_CONF_DIR}" + +cat > "${CONFIG_PATH}" < "${SYSTEMD_UNIT_PATH}" < "${CADDY_CONF_PATH}" </dev/null + +echo "docker deployment complete" +echo "service: ${SERVICE_NAME}.service" +echo "image: ${IMAGE_TAG}" +echo "caddy: ${CADDY_CONF_PATH}" diff --git a/scripts/install-process.sh b/scripts/install-process.sh new file mode 100644 index 0000000..9a56a67 --- /dev/null +++ b/scripts/install-process.sh @@ -0,0 +1,163 @@ +#!/usr/bin/env bash +set -euo pipefail + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/_common.sh" + +if [[ "$(uname -s)" != "Linux" ]]; then + echo "process deployment is only supported on Linux" >&2 + exit 1 +fi + +if [[ "${EUID}" -ne 0 ]]; then + echo "process deployment must run as root" >&2 + exit 1 +fi + +need_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + echo "missing required command: $1" >&2 + exit 1 + fi +} + +need_cmd systemctl +need_cmd install +need_cmd curl + +if ! command -v go >/dev/null 2>&1; then + bash scripts/init-go.sh +fi +need_cmd go + +SERVICE_NAME="${SERVICE_NAME:-accounts-svc-plus}" +DOMAIN="${ACCOUNT_DOMAIN:-accounts.svc.plus}" +LISTEN_ADDR="${ACCOUNT_LISTEN_ADDR:-127.0.0.1:8080}" +PUBLIC_URL="${ACCOUNT_PUBLIC_URL:-https://${DOMAIN}}" +CONFIG_DIR="${CONFIG_DIR:-/etc/accounts.svc.plus}" +CONFIG_PATH="${CONFIG_PATH:-${CONFIG_DIR}/account.standalone.yaml}" +BINARY_PATH="${BINARY_PATH:-/usr/local/bin/accounts-svc-plus}" +SYSTEMD_UNIT_PATH="${SYSTEMD_UNIT_PATH:-/etc/systemd/system/${SERVICE_NAME}.service}" +CADDY_CONF_DIR="${CADDY_CONF_DIR:-/etc/caddy/conf.d}" +CADDY_CONF_PATH="${CADDY_CONF_PATH:-${CADDY_CONF_DIR}/${DOMAIN}.conf}" + +tmp_binary="$(mktemp)" +trap 'rm -f "${tmp_binary}"' EXIT + +go build -o "${tmp_binary}" ./cmd/accountsvc/main.go + +install -d -m 0755 "$(dirname "${BINARY_PATH}")" "${CONFIG_DIR}" "${CADDY_CONF_DIR}" +install -m 0755 "${tmp_binary}" "${BINARY_PATH}" + +cat > "${CONFIG_PATH}" < "${SYSTEMD_UNIT_PATH}" < "${CADDY_CONF_PATH}" </dev/null + +echo "process deployment complete" +echo "service: ${SERVICE_NAME}.service" +echo "config: ${CONFIG_PATH}" +echo "caddy: ${CADDY_CONF_PATH}" diff --git a/scripts/setup.sh b/scripts/setup.sh index 1bc5f33..e718fdb 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -4,14 +4,23 @@ set -euo pipefail usage() { cat <<'EOF' Usage: - setup.sh [--repo ] [--ref ] [--dir ] + setup.sh [--mode ] [--deploy|--uninstall] [--repo ] [--ref ] [--dir ] Examples: - # Remote install: - # curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit//main/scripts/setup.sh?$(date +%s)" | bash -s -- + # Remote install (process mode): + # curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit//main/scripts/setup.sh?$(date +%s)" | bash -s -- --mode process --deploy + # + # Remote install (docker mode): + # curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit//main/scripts/setup.sh?$(date +%s)" | bash -s -- --mode docker --deploy + # + # Remote install (Cloud Run mode): + # curl -fsSL "https://raw.githubusercontent.com/cloud-neutral-toolkit//main/scripts/setup.sh?$(date +%s)" | bash -s -- --mode cloudrun # # Local: - # bash scripts/setup.sh + # bash scripts/setup.sh --mode process + # + # Uninstall: + # bash scripts/setup.sh --mode process --uninstall Notes: - Safe: no secrets written; no destructive actions. @@ -21,6 +30,19 @@ EOF log() { printf '[setup] %s\n' "$*"; } +normalize_mode() { + case "${1:-process}" in + process|proc|local|binary) printf 'process\n' ;; + docker|container) printf 'docker\n' ;; + cloudrun|cloud-run|gcp) printf 'cloudrun\n' ;; + *) + log "unsupported mode: ${1:-}" + usage + exit 2 + ;; + esac +} + need_cmd() { if ! command -v "$1" >/dev/null 2>&1; then log "missing required command: $1" @@ -39,9 +61,14 @@ shift REPO_URL="" REF="main" DIR="$NAME" +MODE="process" +ACTION="setup" while [[ $# -gt 0 ]]; do case "$1" in + --mode|--deploy-mode) MODE="${2:-}"; shift 2 ;; + --deploy) ACTION="deploy"; shift ;; + --uninstall) ACTION="uninstall"; shift ;; --repo) REPO_URL="${2:-}"; shift 2 ;; --ref) REF="${2:-}"; shift 2 ;; --dir) DIR="${2:-}"; shift 2 ;; @@ -49,6 +76,8 @@ while [[ $# -gt 0 ]]; do esac done +MODE="$(normalize_mode "$MODE")" + if [[ -z "${REPO_URL}" ]]; then REPO_URL="https://github.com/cloud-neutral-toolkit/${NAME}.git" fi @@ -74,29 +103,56 @@ fi cd "${DIR}" +if [[ "${ACTION}" == "uninstall" ]]; then + case "$MODE" in + process) bash scripts/uninstall-process.sh ;; + docker) bash scripts/uninstall-docker.sh ;; + cloudrun) + log "cloudrun uninstall is not supported by setup.sh; use gcloud directly" + exit 2 + ;; + esac + exit 0 +fi + did_any=false -if [[ -f "package.json" ]]; then - need_cmd node - if command -v corepack >/dev/null 2>&1; then - corepack enable >/dev/null 2>&1 || true - fi - if command -v yarn >/dev/null 2>&1; then - log "installing JS dependencies (yarn install)" - yarn install - did_any=true - else - log "yarn not found; install yarn (or enable corepack) then re-run" - exit 1 - fi -fi +case "$MODE" in + process) + if [[ -f "package.json" ]]; then + need_cmd node + if command -v corepack >/dev/null 2>&1; then + corepack enable >/dev/null 2>&1 || true + fi + if command -v yarn >/dev/null 2>&1; then + log "installing JS dependencies (yarn install)" + yarn install + did_any=true + else + log "yarn not found; install yarn (or enable corepack) then re-run" + exit 1 + fi + fi -if [[ -f "go.mod" ]]; then - need_cmd go - log "downloading Go dependencies (go mod download)" - go mod download - did_any=true -fi + if [[ -f "go.mod" ]]; then + need_cmd go + log "downloading Go dependencies (go mod download)" + go mod download + did_any=true + fi + ;; + docker) + need_cmd docker + log "docker mode selected; skipping host-level dependency installation" + did_any=true + ;; + cloudrun) + need_cmd docker + need_cmd gcloud + log "cloudrun mode selected; skipping host-level dependency installation" + did_any=true + ;; +esac if [[ "${did_any}" == "false" ]]; then log "no supported project type detected (package.json/go.mod)." @@ -113,10 +169,44 @@ if [[ -f "scripts/post-setup.sh" ]]; then bash scripts/post-setup.sh fi -log "setup complete" -log "next steps:" -if [[ -f "go.mod" ]]; then - log " cp .env.example .env" - log " make dev" +if [[ "${ACTION}" == "deploy" ]]; then + case "$MODE" in + process) bash scripts/install-process.sh ;; + docker) bash scripts/install-docker.sh ;; + cloudrun) + if [[ -z "${GCP_PROJECT:-}" ]]; then + log "cloudrun deploy requires GCP_PROJECT in the environment" + exit 2 + fi + make cloudrun-build + make cloudrun-deploy + ;; + esac fi +log "setup complete (mode=${MODE})" +log "next steps:" +case "$MODE" in + process) + if [[ -f ".env.example" ]]; then + log " cp .env.example .env" + fi + if [[ -f "Makefile" ]]; then + log " make init-db" + log " make start" + log " sudo bash scripts/install-process.sh" + elif [[ -f "go.mod" ]]; then + log " go run ./cmd/accountsvc/main.go --config config/account.yaml" + fi + ;; + docker) + log " docker build -t accounts-svc-plus ." + log " docker run --rm -p 8080:8080 -e CONFIG_TEMPLATE=/app/config/account.yaml -e CONFIG_PATH=/etc/xcontrol/account.yaml accounts-svc-plus" + log " sudo bash scripts/install-docker.sh" + ;; + cloudrun) + log " export GCP_PROJECT=" + log " GCP_PROJECT= make cloudrun-build" + log " GCP_PROJECT= make cloudrun-deploy CLOUD_RUN_SERVICE_YAML=deploy/gcp/cloud-run/prod-service.yaml" + ;; +esac diff --git a/scripts/uninstall-docker.sh b/scripts/uninstall-docker.sh new file mode 100644 index 0000000..17b4a8b --- /dev/null +++ b/scripts/uninstall-docker.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ "$(uname -s)" != "Linux" ]]; then + echo "docker uninstall is only supported on Linux" >&2 + exit 1 +fi + +if [[ "${EUID}" -ne 0 ]]; then + echo "docker uninstall must run as root" >&2 + exit 1 +fi + +SERVICE_NAME="${SERVICE_NAME:-accounts-svc-plus-docker}" +CONTAINER_NAME="${CONTAINER_NAME:-accounts-svc-plus}" +IMAGE_TAG="${IMAGE_TAG:-accounts-svc-plus:local}" +DOMAIN="${ACCOUNT_DOMAIN:-accounts.svc.plus}" +CONFIG_DIR="${CONFIG_DIR:-/etc/accounts.svc.plus}" +SYSTEMD_UNIT_PATH="${SYSTEMD_UNIT_PATH:-/etc/systemd/system/${SERVICE_NAME}.service}" +CADDY_CONF_DIR="${CADDY_CONF_DIR:-/etc/caddy/conf.d}" +CADDY_CONF_PATH="${CADDY_CONF_PATH:-${CADDY_CONF_DIR}/${DOMAIN}.conf}" + +if command -v systemctl >/dev/null 2>&1; then + systemctl disable --now "${SERVICE_NAME}.service" >/dev/null 2>&1 || true +fi + +if command -v docker >/dev/null 2>&1; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 || true + docker image rm "${IMAGE_TAG}" >/dev/null 2>&1 || true +fi + +rm -f "${SYSTEMD_UNIT_PATH}" "${CADDY_CONF_PATH}" +rm -rf "${CONFIG_DIR}" + +if command -v systemctl >/dev/null 2>&1; then + systemctl daemon-reload + if systemctl is-active --quiet caddy; then + systemctl reload caddy || systemctl restart caddy + fi +fi + +echo "docker deployment removed" diff --git a/scripts/uninstall-process.sh b/scripts/uninstall-process.sh new file mode 100644 index 0000000..bca9868 --- /dev/null +++ b/scripts/uninstall-process.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ "$(uname -s)" != "Linux" ]]; then + echo "process uninstall is only supported on Linux" >&2 + exit 1 +fi + +if [[ "${EUID}" -ne 0 ]]; then + echo "process uninstall must run as root" >&2 + exit 1 +fi + +SERVICE_NAME="${SERVICE_NAME:-accounts-svc-plus}" +DOMAIN="${ACCOUNT_DOMAIN:-accounts.svc.plus}" +CONFIG_DIR="${CONFIG_DIR:-/etc/accounts.svc.plus}" +BINARY_PATH="${BINARY_PATH:-/usr/local/bin/accounts-svc-plus}" +SYSTEMD_UNIT_PATH="${SYSTEMD_UNIT_PATH:-/etc/systemd/system/${SERVICE_NAME}.service}" +CADDY_CONF_DIR="${CADDY_CONF_DIR:-/etc/caddy/conf.d}" +CADDY_CONF_PATH="${CADDY_CONF_PATH:-${CADDY_CONF_DIR}/${DOMAIN}.conf}" + +if command -v systemctl >/dev/null 2>&1; then + systemctl disable --now "${SERVICE_NAME}.service" >/dev/null 2>&1 || true +fi + +rm -f "${SYSTEMD_UNIT_PATH}" "${BINARY_PATH}" "${CADDY_CONF_PATH}" +rm -rf "${CONFIG_DIR}" + +if command -v systemctl >/dev/null 2>&1; then + systemctl daemon-reload + if systemctl is-active --quiet caddy; then + systemctl reload caddy || systemctl restart caddy + fi +fi + +echo "process deployment removed" From d1f10e2170af077110636b2fad16d66199930bc1 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Sun, 15 Mar 2026 16:59:43 +0800 Subject: [PATCH 3/3] Handle Go bootstrap during process deploy --- scripts/init-go.sh | 14 ++++++++++++-- scripts/setup.sh | 11 ++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/scripts/init-go.sh b/scripts/init-go.sh index 178155f..68688cc 100755 --- a/scripts/init-go.sh +++ b/scripts/init-go.sh @@ -3,6 +3,17 @@ set -euo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/_common.sh" +apt_install() { + if command -v sudo >/dev/null 2>&1 && [[ "${EUID}" -ne 0 ]]; then + sudo apt-get update + sudo apt-get install -y golang + return + fi + + apt-get update + apt-get install -y golang +} + if [ ! -f go.mod ]; then echo ">>> go.mod not found, initializing module" go mod init account @@ -17,8 +28,7 @@ if ! command -v go >/dev/null; then brew install go@1.24 brew link --overwrite --force go@1.24 else - sudo apt-get update - sudo apt-get install -y golang + apt_install fi fi diff --git a/scripts/setup.sh b/scripts/setup.sh index e718fdb..e5ecba3 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -135,9 +135,14 @@ case "$MODE" in fi if [[ -f "go.mod" ]]; then - need_cmd go - log "downloading Go dependencies (go mod download)" - go mod download + if command -v go >/dev/null 2>&1; then + log "downloading Go dependencies (go mod download)" + go mod download + elif [[ "${ACTION}" == "deploy" ]]; then + log "go not found; process deploy will install it during scripts/install-process.sh" + else + need_cmd go + fi did_any=true fi ;;