You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Babashka中调用gcloud 优化GCP Cloud Functions部署脚本

优化方案

你可以通过动态构造命令参数序列的方式大幅提升可读性,和Bash逐行写参数的体验一致,后续修改配置也更方便。

方案1:基于原生clojure.java.shell优化

#!/usr/bin/env bb
(require '[cheshire.core :as json]
         '[clojure.java.shell :refer [sh]])

(let [package-json (json/parse-string (slurp "package.json") true)
      name (:name package-json)
      ;; 所有配置统一放在map中,增删改一目了然
      deploy-config {:region "europe-west3"
                     :entry-point "entryPoint"
                     :memory "128MB"
                     :runtime "nodejs14"
                     :source "dist"
                     :service-account "sa-function-invoker@prj-kitchen-sink.iam.gserviceaccount.com"
                     :timeout "10s"
                     :trigger-http nil}] ;; 无值参数直接设为nil
  (println "deploy function" name "with entry point" (:entry-point deploy-config) "to GCP Cloud Functions. Attach service account" (:service-account deploy-config))
  ;; 自动展开构造命令参数
  (let [cmd (concat ["gcloud" "functions" "deploy" name]
                    (mapcat (fn [[k v]]
                              (if v
                                [(str "--" (name k)) (str v)]
                                [(str "--" (name k))]))
                            deploy-config))
        {:keys [out err exit]} (apply sh cmd)]
    (if (zero? exit)
      (println out)
      (do
        (println "部署错误:" err)
        (System/exit exit)))))

优势:

  • 配置与逻辑分离,修改参数不需要调整命令构造代码
  • 基于退出码判断执行结果,比仅判断stderr是否为空更符合Unix命令惯例,避免误判正常警告信息为错误
  • 新增无值参数(如--allow-unauthenticated)只需要在map中加一行:allow-unauthenticated nil即可

方案2:基于Babashka自带babashka.process优化(更推荐)

Babashka内置的process库比原生clojure.java.shell更适合脚本场景,默认行为和Bash一致:

#!/usr/bin/env bb
(require '[cheshire.core :as json]
         '[babashka.process :refer [shell]])

(let [package-json (json/parse-string (slurp "package.json") true)
      name (:name package-json)
      deploy-config {:region "europe-west3"
                     :entry-point "entryPoint"
                     :memory "128MB"
                     :runtime "nodejs14"
                     :source "dist"
                     :service-account "sa-function-invoker@prj-kitchen-sink.iam.gserviceaccount.com"
                     :timeout "10s"
                     :trigger-http nil}]
  (println "deploy function" name "with entry point" (:entry-point deploy-config) "to GCP Cloud Functions. Attach service account" (:service-account deploy-config))
  (let [cmd (concat ["gcloud" "functions" "deploy" name]
                    (mapcat (fn [[k v]]
                              (if v
                                [(str "--" (name k)) (str v)]
                                [(str "--" (name k))]))
                            deploy-config))]
    ;; 自动实时输出stdout/stderr到终端,执行失败自动终止脚本,和Bash set -e行为一致
    (apply shell cmd)))

优势:

  • 不需要手动处理输出,gcloud的进度条、实时日志都能正常显示,和直接在终端执行命令体验完全相同
  • 命令执行失败会自动抛出异常终止脚本,不需要手写错误判断逻辑

内容的提问来源于stack exchange,提问作者jackdbd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:09:04