如何在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
相关产品推荐
相关产品推荐

