Обычно у меня есть URL-маршрут GET для всех моих серверных приложений, который возвращает текущий хэш git как простой способ проверить точную версию кода, работающего на данном экземпляре. В интерпретируемых языках (например, Python, Node.js) это легко, вы просто проверяете результат выполнения команды оболочки в подпроцессе. Но я распространяю свое приложение Clojure по экземплярам, упаковывая его с помощью lein uberjar
.
Таким образом, я могу получить текущий git sha программно, используя clojure.java.shell
, например:
(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 (а не во время выполнения, когда банка больше не находится в репо), чтобы он возвращался из маршрута URL, который я определяю с помощью compojure и обслуживаю через http-kit. Как мне запустить эту функцию во время компиляции или во время сборки и сбросить ее в константу или что-то еще, что я могу затем вернуть из маршрута?
Хотя я хотел бы решение в этом направлении, как указано, конечная цель здесь заключается в том, чтобы иметь возможность запрашивать работающий экземпляр через HTTP и находить точную версию работающего кода (настоятельно предпочитаю git sha, а не, например, номер semver) на данный экземпляр в производстве.
Я понимаю, что могу обойти это, клонировав репо во все экземпляры и создав банку локально, например. ansible и найдите sha в известном каталоге, но это кажется, ну, хакерским, а также подверженным ошибкам по сравнению с подписью файла jar, так сказать, во время сборки.
РЕДАКТИРОВАТЬ:
Мой проект.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]}})