leiningen/doc/DEPLOY.md
2012-06-27 16:06:48 -07:00

4.1 KiB

Deploying Libraries

Getting your library into Clojars is fairly straightforward as is documented near the end of the Leiningen tutorial. However, deploying is not always that straightforward.

Private Repositories

There may be times when you want to make a library available to your team without making it public. This is best done by setting up a private repository. The simplest kind of private repository is an Amazon S3 bucket. You can deploy to S3 buckets using S3 wagon private.

Alternatively you can run a private repository on your own server. Both Archiva and Nexus provide this as well as proxying to other repositories, so you can set :omit-default-repositories in project.clj, and dependency downloads will speed up by quite a bit with only one server to check.

The private server will need to be added to the :repositories listing in project.clj. Archiva and Nexus offer separate repositories for snapshots and releases, so you'll want two entries for them:

:repositories {"snapshots" "http://blueant.com/archiva/snapshots"
               "releases" "http://blueant.com/archiva/internal"}

If you are are deploying to a repository that is only used for deployment and never for dependency resolution, then it should be specified in a :deploy-repositories slot instead of included in the more general-purpose :repositories map; the former is checked by lein deploy before the latter. Deployment-only repositories useful across a number of locally developed projects may also be specified in the :user profile in ~/.lein/profiles.clj:

{:user {:deploy-repositories {"internal" "http://blueant.com/archiva/internal"}}}

Authentication

Deploying and reading from private repositories needs authentication credentials. Check your repository's documentation for details, but you'll usually need to provide a :username and :password or :passphrase. Leiningen will prompt you for a password if you haven't set up credentials, but it's convenient to set it so you don't have to re-enter it every time you want to deploy. You will need gpg installed and a key pair configured.

If you specify :gpg in one of your :repositories settings maps, Leiningen will decrypt ~/.lein/credentials.clj.gpg and use that to find the proper credentials for the given repository.

:repositories {"releases" {:url "http://blueant.com/archiva/internal"
                           :username "milgrim" :password :gpg}}

First write your credentials map to ~/.lein/credentials.clj like so:

{#"blueant" {:password "locative1"}
 #"https://clojars.org/repo"
 {:username "milgrim" :password "locative1"}
 "s3p://s3-repo-bucket/releases"
 {:username "AKIAIN..." :passphrase "1TChrGK4s..."}}

Then encrypt it with gpg:

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

Remember to delete the plaintext credentials.clj once you've encrypted it. Due to a bug in gpg you currently need to use gpg-agent and have already unlocked your key before Leiningen launches, but with gpg-agent you only have to enter your passphrase once per login.

On some systems you will be prompted for your GPG passphrase if you haven't entered it. If yours does not, you can install Keychain, which provides this functionality portably.

Unattended builds can specify :env instead of :gpg in the repository specification to have credentials looked up in the environment. For example, specifying :password :env will cause Leiningen to look up (System/getenv "LEIN_PASSWORD") for that value.

Deployment

Once you've set up a private repository and configured project.clj appropriately, you can deploy to it:

$ lein deploy [repository-name]

If the project's current version is a SNAPSHOT, it will default to deploying to the snapshots repository; otherwise it will default to releases.