通常,我对所有服务器端应用程序都有一个URL GET路由,该路由返回当前的git hash作为一种简单的方法来检查在给定实例上运行的代码的确切版本。在解释语言(例如Python,Node.js)中,这很容易,您只需检查在子进程中运行shell命令的输出即可。但是我通过使用打包将Clojure应用分发给实例lein uberjar
。
所以我可以clojure.java.shell
像下面这样以编程方式获取当前的git sha :
(defn get-git-sha
[_req]
(trim ((sh "/bin/sh" "-c" "git rev-parse HEAD") :out)))
(defroutes server-routes
(GET "/revision" [] get-git-sha))
(defn serve-http
[port]
(http-server/run-server server-routes {:port port}))
但是我需要一种在uberjar进程中(而不是在运行时不再将jar存放在repo中)嵌入到代码中的方法,以便从使用compojure定义并通过http-kit进行服务的URL路由返回。如何在编译时或构建时运行该函数并将其转储为常量或其他可以从路由返回的函数?
尽管我希望采用这些解决方案,但如上所述,此处的最终目标是能够通过HTTP查询正在运行的实例,并找到正在运行的代码的确切版本(强烈建议使用git sha而不是例如semver数字)在生产中给定实例。
我意识到我可以通过以下方法来解决此问题:克隆回购程序到所有实例,并通过例如ansible在本地构建jar,然后在已知目录中查找sha,但这似乎很hacky,而且容易出错和“签名” jar文件可以这么说在构建时。
我的project.clj看起来像这样:
(defproject gps-server "0.1.0-SNAPSHOT"
:description "Receives GPS data over TCP"
:url "http://someurl"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [...]
:main ^:skip-aot gps-server.core
:target-path "target/%s"
:profiles {:uberjar {:aot [gps-server.core]}})
我认为我并没有做任何特别的事情来做到这一点,所以请检查一下您的罐子内是否存在
META-INF/maven/your-project/name/pom.properties
your-project/name
您用来构建uberjar的project.clj来自哪里
(defproject your-project/name "4.2.6"
...
在pom.properties中,我有:
#Leiningen
#Tue Oct 01 13:20:45 CEST 2019
version=4.2.6
revision=4625a070a34ddc3c563b71025fa5dd907b406331
groupId=your-project
artifactId=name
修订来自git。
我有一个/version
使用此功能返回此信息的端点
defn- get-version []
(let [rsrc (io/resource "META-INF/maven/your-project/name/pom.properties")
rdr (io/reader rsrc)
props (java.util.Properties.)]
(.load props rdr)
(into {} (for [[k v] props] [k v]))))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句