Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,26 @@ To deploy to Clojars, simply merge
:main-opts ["-m" "deps-deploy.deps-deploy" "deploy"
"path/to/my.jar" "group-id/artifact-id" "x.y.z"]}}
```
into your `deps.edn`, have a `pom.xml` handy (you can generate one with `clj -Spom),` and deploy with
into your `deps.edn`, have a `pom.xml` handy (you can generate one with `clj -Spom),` and deploy with

```sh
$ env CLOJARS_USER=username CLOJARS_PASSWORD=password clj -a:deploy
```

to deploy to Clojars

You can also store your credentials in a symmetrically encryted file:

```sh
$ cat > .clojars_creds.edn
{:username "joe_user"
:password "r3a11ygr8"}
^D
$ gpg --encrypt .clojars_creds.edn
```

`deps-deploy` will then prompt you for the passphrase


`deps-deploy` also supports installing to your local `.m2` repo, by invoking `install` instead of `deploy`:
```clojure
Expand Down
5 changes: 4 additions & 1 deletion deps.edn
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{:paths ["src" "resources"]
:deps {org.clojure/clojure {:mvn/version "RELEASE"}
com.cemerick/pomegranate {:mvn/version "RELEASE"}}
com.cemerick/pomegranate {:mvn/version "RELEASE"}
org.bouncycastle/bcprov-jdk15on {:mvn/version "RELEASE"}
org.bouncycastle/bcmail-jdk15on {:mvn/version "RELEASE"}
org.bouncycastle/bcpg-jdk15on {:mvn/version "RELEASE"}}
:aliases
{:test {:extra-paths ["test"]
:extra-deps {org.clojure/test.check {:mvn/version "RELEASE"}}}
Expand Down
35 changes: 30 additions & 5 deletions src/deps_deploy/deps_deploy.clj
Original file line number Diff line number Diff line change
@@ -1,16 +1,41 @@
(ns deps-deploy.deps-deploy
(:require [cemerick.pomegranate.aether :as aether]
[clojure.edn :as edn]
[clojure.pprint :as pp]))
[clojure.pprint :as pp]
[clojure.java.io :as io])
(:import [org.bouncycastle.bcpg SymmetricKeyAlgorithmTags]
[org.bouncycastle.jce.provider BouncyCastleProvider]
[org.bouncycastle.openpgp.examples ByteArrayHandler]
[java.security NoSuchProviderException Security]
[java.io File]))

(def default-repo-settings {"clojars" {:url "https://clojars.org/repo"
:username (System/getenv "CLOJARS_USERNAME")
:password (System/getenv "CLOJARS_PASSWORD")}})
(defn read-byte-array [file]
(with-open [in (io/input-stream (io/file file))]
(let [buf (byte-array 1000)
n (.read in buf)]
buf)))

(defn decrypt [file]
(Security/addProvider (BouncyCastleProvider.))
(let [encrypted-byte-array (read-byte-array file)
console (System/console)
passwd (.readPassword console "Please enter your gpg passphrase: " (to-array [(Object.)]))
decrypted (ByteArrayHandler/decrypt encrypted-byte-array passwd)]
(edn/read-string (String. decrypted))))

(def clojars-gpg-file ".clojars_creds.edn.gpg")

(defn clojars-repo-settings []
(let [settings {:url "https://clojars.org/repo"}]
{"clojars" (merge settings (if (.exists (File. clojars-gpg-file))
(decrypt clojars-gpg-file)
{:username (System/getenv "CLOJARS_USERNAME")
:password (System/getenv "CLOJARS_PASSWORD")}))}))

(defmulti deploy :installer)

(defmethod deploy :clojars [{:keys [artifact name version repository]
:or {repository default-repo-settings} :as opts }]
:or {repository (clojars-repo-settings)} :as opts }]
(println "Deploying" (str name "-" version) "to clojars as" (-> repository vals first :username))
(aether/deploy :pom-file "pom.xml"
:jar-file artifact
Expand Down