Leiningen plugin to generate RPM files for iPlant Clojure projects.
Clojure
Latest commit 1f27d36 Feb 13, 2014 @dennisroberts71 dennisroberts71 Merge branch 'dev'
Permalink
Failed to load latest commit information.
resources/rpm
src/leiningen
.gitignore
README.markdown
project.clj

README.markdown

Leiningen Plugin for Generating RPMs

This is a leiningen plugin that can be used to generate RPM files for stand-alone services or command-line utilities that are written in Clojure.

Services are installed in the directory, /usr/local/lib/{project-name}, with an init.d script added to /etc/init.d. Upon installation, the service is configured to automatically start at run levels 2, 3, 4 and 5.

The JAR files for command-line utilities are installed in the directory, /usr/local/lib/{project-name}, with an automatically generated wrapper script installed in /usr/local/bin. Additional executable files, if present, are also installed in /usr/local/bin.

Note: the RPM files generated by this plugin are specific to iPlant. This plugin will have to be modified to work anywhere else.

Leiningen 1 Compatibility

This plugin is not currently compatible with Leiningen 1 although previous versions of it are. Please use version 1.1.1 of this plugin with Leiningen 1.

Usage

This plugin is stored in iPlant's Archiva repository, which will have to be defined in project.clj:

:repositories {"iplantCollaborative"
               "http://projects.iplantcollaborative.org/archiva/repository/internal/"}

Next, the plugin has to be added to the plugins section of project.clj:

[org.iplantc/lein-iplant-rpm "1.2.0-SNAPSHOT"]

Finally, a configuration section needs to be added to project.clj in order to control how the RPM is generated:

  :iplant-rpm {:summary "project summary"
               :release 1
               :provides "some name"
               :dependencies ["some-dependency >= some.version"]
               :config-files ["some.file" "someother.file"]
               :resources ["some.glob.pattern" "someother.glob.pattern"]
               :config-path "conf"}

Here's an example configuration file for one of iPlant's web services:

(defproject snowdog "1.1.0-SNAPSHOT"
  :description "Back-End Services for Something"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [org.clojure/data.json "0.1.1"]
                 [org.clojure/tools.logging "0.2.3"]
                 [org.clojure/java.jdbc "0.1.0"]
                 [org.iplantc/clojure-commons "1.1.0-SNAPSHOT"]
                 [compojure "1.0.1"]
                 [swank-clojure "1.4.0-SNAPSHOT"]
                 [log4j/log4j "1.2.16"]
                 [postgresql/postgresql "9.0-801.jdbc4"]
                 [c3p0/c3p0 "0.9.1.2"]
                 [ring/ring-jetty-adapter "1.0.1"]]
  :plugins [[org.iplantc/lein-iplant-rpm "1.1.0-SNAPSHOT"]
            [lein-ring "0.4.5"]
            [swank-clojure "1.4.0-SNAPSHOT"]]
  :aot [snowdog.core]
  :main snowdog.core
  :ring {:handler snowdog.core/app :init snowdog.core/load-configuration}
  :iplant-rpm {:summary "iPlant SnowDog"
               :release 1
               :provides "snowdog"
               :type :service
               :dependencies ["iplant-service-config >= 0.1.0-4"]
               :config-files ["log4j.properties"]
               :config-path "conf/main"}
  :repositories {"iplantCollaborative"
                 "http://projects.iplantcollaborative.org/archiva/repository/internal/"})

Configuration Settings

Many of the configuration settings for lein-iplant-rpm come from the project definition itself. In cases where the configuration settings can't be obtained from the project definitions or it may be helpful to override the setting from the project definition, the configuration setting is made available in the iplant-rpm section of project.clj. The configuration settings are described in detail below.

Summary

The summary, which is used as the value of the Summary tag of the RPM specification file, is specified using the :summary key in the :iplant-rpm configuration settings. This should contain a brief description of what is contained in the RPM.

Name

The RPM name is obtained directly from the project name (the first argument to the defproject macro). This field is used as the value of the Name tag in the RPM specification file, which is then used as part of the BuildRoot tag, part of the name of the source tarball, and the names of several other files and directories. This value is also used as the name of the init.d script and part of the name of the RPM specification file.

Version

The version string is obtained from the portion of the project version (the second argument to the defproject macro) prior to the first hyphen. For example, if the version string in the project file is 1.0.0-SNAPSHOT, the version string in this configuration setting is 1.0.0. This field is used as the value of the Version tag in the RPM specification file, which is used as part of the value of the BuildRoot tag, part of the name of the source tarball, and in the names of several other files and directories.

Release

The release number is configured in the :release attribute of the :iplant-rpm configuration settings. The value of this setting is used as the value of the Release tag in the RPM specification file. The release number defaults to 1 if it's not specified.

Provides

The name of the package that the RPM provides is configured in the :provides attribute of the :iplant-rpm configuration settings. The value of this setting is used as the value of the Provides tag in the RPM specification file. The package name defaults to the project name if it's not specified.

Type

This configuration setting indicates the type of the project, and its value must be a Clojure keyword. The currently accepted settings are :service, for a standalone service and :command for a command-line tool. This setting is obtained from the :type attribute of the :iplant-rpm configuration settings. For backward compatibility with lein-iplant-rpm version 1.0.0-SNAPSHOT, this setting defaults to :service if it's not specified.

Dependencies

The dependencies that this setting refers to here are the RPM dependencies rather than the JVM dependencies, which are automatically packaged in the JAR file. These dependencies are configured in the :dependencies attribute of the iplant-rpm configuration settings, which contains a vector of strings. Each string in this vector represents the name of the required RPM and any version number requirements associated with that RPM.

Description

The RPM description is obtained directly from the project description in project.clj, and is used as the value of the %description tag in the RPM specification file.

JAR Version Number

The JAR version string is obtained directly from the project version (the second project to the defproject macro. This version number contains the full version string rather than just the portion of the string prior to the first hyphen. This value is used to build the name of the JAR file in the %install section of the RPM specification file. It's also used to build the name of the JAR file that is being used in the init.d script.

Configuration Files

Any configuration files that are rquired by the service may be specified using the :config-files attribute of the :iplant-rpm configuration settings. This setting contains only the names of the configuration files, not the full paths to the files. This setting is used in conjunction with the :config-path setting to generate portions of the %install and %files sections of the RPM specification file.

Resources

Additional resource files can be specified using the :resources attribute of the :iplant-rpm configuration settings. This setting contains shell glob patterns that can be used to install the resource files into the same directory as the configuration files for services. Additional resources are not currently supported for command-line utilities. As with configuration files, only the names of the resource files are included on the command line. At this time, the plugin assumes that the resource files are in the same directory as the configuration files. This can be changed in the future if necessary.

Configuration Path

The path to the directory containing the configuration files, relative to the directory containing project.clj is specified using the :config-path attribute of the :iplant-rpm configuration settings. This setting is used in conjunction with the :config-files setting to generate portions of the %install and %files sections of the RPM specification file. This setting must be specified if any configuration files are listed in the in the :config-files setting.

Executable Files

This configuration setting, which is obtained from the :exe-files attribute of the :iplant-rpm configuration settings, is used to specify the paths (relative to the directory containing project.clj) to additional executable files that should be included in the RPM. The value of this setting should be a vector of strings. This setting is currently only supported for command-line tools.

Extra Classpath Directories

This setting is obtained directly from the :extra-classpath-dirs setting in project.clj. This setting is not used in the RPM specification or the init.d script, but it is used to determine if any additional directories need to be included in the source tarball.

Account Used to Run Services

This configuration setting, which is obtained from the :runuser attribute of the :iplant-rpm configuration settings, is used to specify the username that should be used when running the service. If this setting is not specified then the username will be set to iplant.

Known Issues

Leiningen 2 no longer supports the :extra-classpath-dirs option. Instead, it relies on the :dev profile to provide additional resource paths. Support for profiles will have to be added to this plugin before Leiningen 1 projects that rely on the :extra-classpath-dirs option can be migrated.