102 lines
4.1 KiB
Markdown
102 lines
4.1 KiB
Markdown
# Deploying Libraries
|
|
|
|
Getting your library into [Clojars](http://clojars.org) is fairly
|
|
straightforward as is documented near the end of
|
|
[the Leiningen tutorial](https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md).
|
|
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](http://aws.amazon.com/s3/) bucket. You can deploy to S3
|
|
buckets using [S3 wagon private](https://github.com/technomancy/s3-wagon-private).
|
|
|
|
Alternatively you can run a private repository on your own server.
|
|
Both [Archiva](http://archiva.apache.org/) and
|
|
[Nexus](http://nexus.sonatype.org/) 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:
|
|
|
|
```clj
|
|
: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`:
|
|
|
|
```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](http://www.gnupg.org/) 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.
|
|
|
|
```clj
|
|
:repositories {"releases" {:url "http://blueant.com/archiva/internal"
|
|
:username "milgrim" :password :gpg}}
|
|
```
|
|
|
|
First write your credentials map to `~/.lein/credentials.clj` like so:
|
|
|
|
```clj
|
|
{#"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](https://github.com/funtoo/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`.
|