このバージョン番号にアクセスする 1 つの方法はMANIFEST.MF
、JAR ファイル内に保存されているファイルを使用することです。これにより、Java のjava.lang.Package
クラスを介して実行時にアクセスできるようになります。これには、次の 3 つの手順が必要です。
- Jenkins のビルド番号を Leiningen に渡し、
project.clj
のdefproject
宣言に組み込みます。
MANIFEST.MF
の値を持つを構築するようにライニンゲンに指示しますImplementation-Version
。
- バージョン番号を含む
Package#getImplementationVersion()
へのアクセスを取得するために呼び出します。String
1 - Jenkins ビルド番号の取得
Jenkins の環境変数を使用して、ビルド番号 (適切な名前のBUILD_NUMBER
) にアクセスできます。これは、 を使用して、JVM プロセス内で使用できますSystem.getenv("BUILD_NUMBER")
。この場合、JVM プロセスはproject.clj
、 を呼び出すことができる Clojure コードである leiningen スクリプトにすることができ(System/getenv "BUILD_NUMBER")
ます。上記の例に従うと、返される文字列は「42」になります。
2 - MANIFEST.MF でのバージョンの設定
JAR をビルドするとき、Leiningen はMANIFEST.MF
デフォルトでファイルをインクルードします。また、そのファイルに任意のキーと値のペアを設定できる構成オプションもあります。したがって、Clojure で Jenkins のビルド番号にアクセスできる場合は、それを静的バージョン宣言と組み合わせてImplementation-Version
、マニフェストで を設定できます。関連する部分は次のproject.clj
ようになります。
(def feature-version "1.2")
(def build-version (or (System/getenv "BUILD_NUMBER") "HANDBUILT"))
(def release-version (str feature-version "." build-version))
(def project-name "my-web-service")
(defproject project-name feature-version
:uberjar-name ~(str project-name "-" release-version ".jar")
:manifest {"Implementation-Version" ~release-version}
... )
この例のいくつかの詳細に注目する価値があります。(if-let ...)
いつ定義するかは、build-version
Jenkins の環境変数をエミュレートする必要なく、開発者がローカルで JAR をビルドできるようにするためです。構成は、:uberjar-name
Maven/Ivy 規則を使用して名前が付けられた JAR ファイルを作成できるようにすることです。この例の結果のファイルはmy-web-service-1.2.42.jar
.
この構成では、ビルド番号 42 で Leiningen が Jenkins によって呼び出されると、結果の JAR のマニフェストに「Implementation-Version: 1.2.42」という行が含まれます。
3 - 実行時のバージョンへのアクセス
使用したいバージョン文字列がマニフェスト ファイルにあるので、Clojure コードで Java 標準ライブラリを使用してアクセスできます。次のスニペットはこれを示しています。
(ns version-namespace
(:gen-class))
(defn implementation-version []
(-> (eval 'version-namespace) .getPackage .getImplementationVersion))
ここで、 を呼び出すgetImplementationVersion()
にはPackage
インスタンスが必要であり、取得するには のインスタンスが必要であることに注意してくださいjava.lang.Class
。したがって、Java クラスがこの名前空間 ( への呼び出し) から生成されることを確認します (その後、そのクラスからメソッド(:gen-class)
にアクセスできます。getPackage
この関数の結果は、「1.2.42」などの文字列です。
注意事項
心配しなければならない問題がいくつかあることに注意してください。
project.clj
の呼び出しで定義されたバージョン文字列を動的に設定すると、(defproject ...)
ハードコードされているバージョンに依存している場合、他のツールが機能しなくなる可能性があります
- のセマンティクスは
getImplementationVersion
わずかに悪用されています。実際にはバージョンは :pkg.getSpecificationVersion() + "." + pkg.getImplementationVersion()
である必要がありますが、これらの値のいずれかを読み取るものは他にないため、実装バージョンを設定するだけで済みます。これを正しく行うには、マニフェストに「Specification-Version」も追加する必要があることに注意してください。
上記の手順により、実行中の Clojure アプリケーションは、コードをパッケージ化した Jenkins ビルドに対応するバージョン番号にアクセスできます。