<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: primenumsdev</title>
    <description>The latest articles on DEV Community by primenumsdev (@primenumsdev).</description>
    <link>https://dev.to/primenumsdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F810317%2Fc21abdb4-2b40-4575-b89f-f36f89586e28.png</url>
      <title>DEV Community: primenumsdev</title>
      <link>https://dev.to/primenumsdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/primenumsdev"/>
    <language>en</language>
    <item>
      <title>Publish Clojure library as private GitHub Package</title>
      <dc:creator>primenumsdev</dc:creator>
      <pubDate>Sun, 06 Feb 2022 12:54:35 +0000</pubDate>
      <link>https://dev.to/primenumsdev/publish-clojure-library-as-private-github-package-3km</link>
      <guid>https://dev.to/primenumsdev/publish-clojure-library-as-private-github-package-3km</guid>
      <description>&lt;p&gt;Recently, I faced a problem, I was need to share a Clojure library internally, without exposing it to the public Clojars repo, and surprisingly I didn't find a good tutorial on how to do it. So I decided to describe my story here.&lt;/p&gt;

&lt;p&gt;Since our company uses GitHub, I knew that GitHub provides a private package registry, but never used it before.&lt;/p&gt;

&lt;p&gt;It appears that it is very simple solution to provide an internal maven package registry for sharing libraries within multiple projects, and accompanied with GitHub Actions you can easily setup an automated release pipeline.&lt;/p&gt;

&lt;p&gt;Let's start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 Create a new library
&lt;/h2&gt;

&lt;p&gt;I use Leiningen to start a new project, so let's first create a test library:&lt;br&gt;
&lt;code&gt;$ lein new cljcloud/my-lib&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It will create a new project based on default Leiningen template, with &lt;code&gt;project.clj&lt;/code&gt; file in the root.&lt;/p&gt;

&lt;p&gt;We need to modify &lt;code&gt;project.clj&lt;/code&gt; and add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;:repositories&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s"&gt;"github"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"https://maven.pkg.github.com/your-org-name/your-repo-name"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"private-token"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:env/GITHUB_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pls, update &lt;code&gt;your-org-name&lt;/code&gt; and &lt;code&gt;your-repo-name&lt;/code&gt; with real values accordingly.&lt;/p&gt;

&lt;p&gt;It tells Leiningen to use GitHub private registry of your GitHub organization to push your package.&lt;/p&gt;

&lt;p&gt;It's also possible to store packages at your personal account, you just need to use your GitHub username instead of &lt;code&gt;your-org-name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The line &lt;code&gt;:password :env/GITHUB_TOKEN&lt;/code&gt; instructs Leiningen to read password from environment variable called &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, we will get back to this latter.&lt;/p&gt;

&lt;p&gt;I set &lt;code&gt;:username "private-token"&lt;/code&gt; because we going to use GitHub private access token, and it doesn't matter what we specify for the username, it only needs to be a string.&lt;/p&gt;

&lt;p&gt;Another thing that I changed is library version, I removed the &lt;code&gt;SNAPSHOT&lt;/code&gt; from it, so that final &lt;code&gt;project.clj&lt;/code&gt; looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defproject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cljcloud/my-lib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FIXME: write description"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"http://example.com/FIXME"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:repositories&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s"&gt;"github"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:url&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;"https://maven.pkg.github.com/cljcloud/my-lib"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"private-token"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:env/GITHUB_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:license&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="no"&gt;:url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"https://www.eclipse.org/legal/epl-2.0/"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:dependencies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;org.clojure/clojure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.10.3"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 Set up GitHub Actions workflow to publish package
&lt;/h2&gt;

&lt;p&gt;In order to create GitHub workflow, you need to make a new YAML file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.github/workflows/publish-package.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publish package&lt;/span&gt;
&lt;span class="c1"&gt;# Manually trigger&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="c1"&gt;# Add permissions for GITHUB_TOKEN&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt; 
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-java@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;java-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;17'&lt;/span&gt;
          &lt;span class="na"&gt;distribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;temurin'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install clojure tools&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DeLaGuardo/setup-clojure@3.5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;lein&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;latest'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Configure GPG Key&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --import&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GPG_SIGNING_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GPG_SIGNING_KEY }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish package&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cd my-lib &amp;amp;&amp;amp; lein deploy github&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few more things, by default Leiningen, requires GPG key to be present when running &lt;code&gt;lein deploy&lt;/code&gt;, you can opt-in to not use it with the option: &lt;code&gt;:sign-releases false&lt;/code&gt; in project.clj&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;:repositories&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s"&gt;"github"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:url&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;"https://maven.pkg.github.com/cljcloud/my-lib"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"private-token"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:env/GITHUB_TOKEN&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:sign-releases&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it's not recommended, so I have created a new GPG key via:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gpg --gen-key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It will prompt for name, email, and passphrase and print out a key ID and details.&lt;br&gt;
Then you can run this command to list your local keys:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gpg --list-keys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In GitHub Actions workflow we use &lt;code&gt;secrets.GPG_SIGNING_KEY&lt;/code&gt;, which is our locally generated GPG signing key, exported as Base64 text.&lt;/p&gt;

&lt;p&gt;To export your newly generated key, run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gpg --export-secret-keys YOUR_ID_HERE | base64 &amp;gt; private.key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;YOUR_ID_HERE&lt;/code&gt; - is a public key, long string with unique characters it will be printed after the key is generated or when you run list keys command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;private.key&lt;/code&gt; - is a file name that will be created in your current folder and will contain a Base64 representation of your private GPG key.&lt;/p&gt;

&lt;p&gt;Next, you have to copy the &lt;code&gt;private.key&lt;/code&gt; content and create a new secret in your GitHub repository with the name: &lt;code&gt;GPG_SIGNING_KEY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note that we also pass environment variable: &lt;code&gt;GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}&lt;/code&gt;, here we use the &lt;code&gt;secrets.GITHUB_TOKEN&lt;/code&gt; which is automatically provided by GitHub Actions context, and for which we set the permissions at the top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# Add permissions for GITHUB_TOKEN&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Now when you commit and push your code to the repo, you will be able to find and run a new GitHub Actions workflow that should build and release your library as a private package to GitHub private registry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 Wait, so how do I use it now?
&lt;/h2&gt;

&lt;p&gt;In order to use your package in your other projects, you have to add a similar line to &lt;code&gt;project.clj&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;:repositories&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s"&gt;"github"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:url&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;"https://maven.pkg.github.com/cljcloud/my-lib"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"private-token"&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="no"&gt;:password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:env/GITHUB_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}]]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and specify your library as usual Leiningen dependency, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;:dependencies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;org.clojure/clojure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.10.3"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
                 &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cljcloud/my-lib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"0.1.20"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when you run &lt;code&gt;lein deps&lt;/code&gt; locally, Leiningen may fail, with 401 Unauthorized error, that's because you don't have a &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; environment variable, you can go to GitHub and generate one by following &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;these simple instructions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After that, you should set the environment variable via:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ export GITHUB_TOKEN="your personal access token"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And retry with &lt;code&gt;lein deps&lt;/code&gt; should work now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/technomancy/leiningen/blob/master/sample.project.clj"&gt;Leiningen sample project.clj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/technomancy/leiningen/blob/master/doc/DEPLOY.md"&gt;Leiningen DEPLOY command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/technomancy/leiningen/blob/master/doc/GPG.md"&gt;Leiningen GPG usage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clojure</category>
      <category>github</category>
      <category>maven</category>
      <category>library</category>
    </item>
  </channel>
</rss>
