LoginSignup
2
1

More than 5 years have passed since last update.

Leiningenからclojarsに非対話式にデプロイする

Posted at

Mavenリポジトリといえば、Maven Central Repositoryが広く知られています。Sonatypeにより運営されており、Apache, Codehaus, Sonatypeなどのリポジトリを統合したものです。

Clojure用には、Leiningenの作者らによって作られた、Clojarsも存在します。LeiningenやBootとの連携機能が組み込まれており、これらのビルドツールから容易にjarファイルとPOMメタデータをアップロードすることができます。また、Maven Centralより緩やかな登録ポリシーを採用しており、簡単にプロジェクトを公開できるようになっています。

Clojarsにアカウントを作成する

(defproject lein-zinc "0.1.3"
  :description "Typesafe zinc scala incremental compiler plugin"
  ;...中略...  
  :repositories [["clojars" {:url "https://clojars.org/repo"
                             :username [:env/clojars_username :gpg]
                             :password [:env/clojars_password :gpg]}]]
  :deploy-repositories  [["releases" :clojars]
                         ["snapshots" :clojars]]
  :signing {:gpg-key "868C4511"}
  :profiles {:dev {:global-vars {*warn-on-reflection* true}
                   :dependencies [[expectations "2.0.13"]]}})

まず、:repositoriesを定義します。リポジトリ名(任意の名前、この場合は"clojars")をつけ、:url:username:passwordを指定します。ユーザー名とパスワードは、環境変数からが第一候補、もし指定されてなければgpgで暗号化された、$HOME/.lein/credentials.clj.pgpから読み出されます。:username:passwordが定義されていな場合は、コマンドライン上で対話的に入力することになります。

環境変数経由でアカウント情報を指定

環境変数から値を渡す場合は、下記のように定義します。

export CLOJARS_USERNAME=myuserid
export CLOJARS_PASSWORD=mypassword

ホームディレクトリ配下の設定ファイル経由でアカウント情報を指定

まず、$HOME/.lein/credentials.cljファイルを作成し、下記内容を定義します。

{#"https://clojars.org/repo"
  {:username  "myuserid" :password  "mypassword"}}

次に、GnuPGでファイルを暗号化します。LeiningenはGnuPGバージョン1を要求するようなので、インストールされていなければシステムに追加しましょう。Mac OS Xであれば、

$ brew install gnupg

です。

$ gpg --default-recipient-self -e \
    ~/.lein/credentials.clj > ~/.lein/credentials.clj.gpg

Clojarsにアップロード

project.clj:repositoriesで指定したリポジトリ名(上記の例ではclojars)を引数に渡して下記のコマンドを実行すれば、プロンプトを出さずに、成果物をClojarsにアップロードすることができます。

$ lein deploy clojars

CircleCIで自動化

以上で、手元のマシンでlein deploy clojarsを実行すればアップロードできるようになりましたが、完全な自動化のためには、CIサーバ上で実現する必要があります。

もし、お使いのCIサーバが、安全にパスワードを環境変数で管理することができるのであれば、環境変数を用いるのが最も簡単です。例えば、JetBrainsのTeamCityではパスワードを第三者に晒すことなく使用することができます。

別の方法として、credentials.clj.pgpをプライベートリポジトリで管理して、CIサーバからチェックアウトして用いるアプローチもあります。ここでは、CircleCIを用いてみたいと思います。

  • プライベートリポジトリを用意する。Githubであれば、CircleCIは特別な設定なしに、プライベートリポジトリからチェックアウトすることができる。
  • 上記の方法でcredentials.clj.gpgを作成し、下記のinit.shファイルも併せて、プライベートリポジトリにプッシュする。
    #!/bin/sh

    set -e

    echo "Init env..."
    git config --global user.name "Kenji Nakamura"
    git config --global user.email "kenjin@clazzsoft.com"
    mv ~/dotfiles/credentials.clj.gpg ~/.lein/credentials.clj.gpg
    echo -e "use-agent\ndefault-key kenjin@clazzsoft.com\npassphrase    your_super_secret_passphrase" >> ~/.gnupg/gpg.conf
    gpg --allow-secret-key-import --quiet --import ~/dotfiles/gnupg/secring.gpg
    echo "Done."
  • プライベートリポジトリをチェックアウトする。CircleCIのPre-dependency commandsに下記の設定を入れる。
git clone git@github.com:k2n/dotfiles.git ~/dotfiles && . ~/dotfiles/init.sh
/usr/bin/curl -O https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein
chmod a+x lein
  • Leiningenのdeployコマンドを実行する。
$ ./lein deploy clojars

lein-zincビルドパイプラインがこの手法を用いているので、参考にしてみてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1