# Distillery Packager
Elixir lib for creating Debian and RPM packages with Distillery.
## Features
1. [x] Able to build Debian packages
1. [x] With changelog
2. [x] With control file
3. [x] With customizable pre/post install/remove scripts
4. [x] With capability to add custom files/scripts to the package
2. [ ] Able to build RPM packages
3. [x] Automatically builds init scripts, which are all customizable, for:
1. [x] Systemd
2. [x] Upstart
3. [x] SysVinit
## Required OS dependencies
Before using distillery_packager, you'll need the following packages installed and in your path:
- `tar` (or `gtar` if you're on a mac - you can `brew install gnu-tar` if you don't already have it)
- `ar`
- `uname`
## General configuration
Distillery_packager relies on the following data in the `mix.exs` file being set:
```diff
defmodule Testapp.Mixfile do
use Mix.Project
def project do
[app: :testapp,
version: "0.0.1",
elixir: "~> 1.4",
+ description: "Elixir lib for creating linux packages with Distillery",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
- deps: deps()]
+ deps: deps(),
+ deb_package: deb_package()]
end
```
## Debian package configuration
The `deb_package` function must be set as:
```diff
def deb_package do
[
vendor: "18Months S.r.l.",
maintainers: ["18Months <info@18months.it>"],
homepage: "https://www.18months.it",
licenses: ["MIT"],
external_dependencies: [],
maintainer_scripts: [
pre_install: "rel/distillery_packager/debian/install_scripts/pre_install.sh",
post_install: "rel/distillery_packager/debian/install_scripts/post_install.sh",
pre_uninstall: "rel/distillery_packager/debian/install_scripts/pre_uninstall.sh"
]
config_files: ["/etc/init/.conf"],
additional_files: [{"configs", "/etc/distillery_packager/configs"}]
owner: [user: "root", group: "root"]
]
end
```
A list of configuration options you can add to `deb_package/0`:
- `vendor`
- String
- The distribution vendor that's creating the debian package. I normally just put my name or company name.
- `maintainers`
- Array of Strings
- Should be in the format `name <email>`
- `homepage`
- String
- Should be in the format `https://www.18months.it`
- `licenses`
- Array of Strings
- Can be something like `["Copyright <date> <company_name>"]` if you are building private packages.
- `external_dependencies`
- Array of Strings
- Should be in the format of `package-name (operator version_number)` where operator is either `<<`, `<=`, `=`, `>=`, or `>>` - [read more about this here.][1]
- `maintainer_scripts`
- A keyword list of Strings
- The keyword should be one of: `:pre_install`, `:post_install`, `:pre_uninstall`, or `:post_uninstall`
- The keyword should point to the path of a script you want to run at the moment in question.
- `config_file`
- Array of Strings
- Should contain the absolute path of the config file to be overwritten.
- `additional_files`
- List of Tuples
- Should contain the relative path of the source folder in the first position of the tuple.
All files present in the source folder will be copied to the destination folder.
You can use the task
```bash
mix release.deb.prepare_base_path
```
to create root directory where to put your files or folders.
- Should contain the path of the destination folder, relative to the target system where the package will be installed, in the second position of the tuple.
- `owner`
- A keyword list of Strings
- If set, requires both `user` and `group` keys to be set.
- This is used when building the archive to set the correct user and group
- Defaults to root for user & group.
## Distillery configuration
You can build a deb by adding `plugin DistilleryPackager.Plugin` to your `rel/config.exs` file.
You can also specify target distribution with `plugin DistilleryPackager.Plugin, distribution: "xenial"`
The name and version is taken from the `rel/config.exs` file.
## Installation
The package can be installed as:
1. Add distillery_packager to your list of dependencies in `mix.exs`:
def deps do
[{:distillery_packager, "~> 0.4"}]
end
## Usage
### Customising deb config files
You can customise the debs that are being built by copying the template files used and modifying them:
```bash
mix release.deb.generate_templates
```
### Build
Packages are build with `mix release` command.
[1]:https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#control