Building Package Using Omnibus

Vasundhara Jagdale Oct 15 - 5 min read

Audio : Listen to This Blog.

Omnibus is a tool for creating full-stack installers for multiple platforms. In general, it simplifies the installation of any software by including all of the dependencies for that piece of software. It was written by the people at Chef, who use it to package Chef.
Omnibus consists of two pieces- omnibus and omnibus software.

    • omnibus – the framework, created by Chef Software, by which we create full-stack, cross-platform installers for software. The project is on GitHub at chef/omnibus.
    • omnibus-software – Chef Software’s open source collection of software definitions that are used to build the Chef Client, the Chef Server, and other Chef Software products. The software definitions can be found on GitHub at chef/omnibus-software.

Omnibus provides both, a DSL for defining Omnibus projects for your software, as well as a command-line tool for generating installer artifacts from that definition.
Omnibus has minimal prerequisites. It requires Ruby 2.0.0+ and Bundler.

Getting Started

To get started install omnibus
> gem install omnibus
You can now create an omnibus project inside your current directory using project generator feature
> omnibus new demo
This will generate a complete project skeleton in the directory as following:
create omnibus-demo/Gemfile
create omnibus-demo/.gitignore
create omnibus-demo/README.md
create omnibus-demo/omnibus.rb
create omnibus-demo/config/projects/demo.rb
create omnibus-demo/config/software/demo-zlib.rb
create omnibus-demo/.kitchen.local.yml
create omnibus-demo/.kitchen.yml
create omnibus-demo/Berksfile
create omnibus-demo/package-scripts/demo/preinst
chmod omnibus-demo/package-scripts/demo/preinst
create omnibus-demo/package-scripts/demo/prerm
chmod omnibus-demo/package-scripts/demo/prerm
create omnibus-demo/package-scripts/demo/postinst
chmod omnibus-demo/package-scripts/demo/postinst
create omnibus-demo/package-scripts/demo/postrm
chmod omnibus-demo/package-scripts/demo/postrm
It creates the omnibus-demo directory inside your current directory and this directory has all omnibus package build related files. It is easy to build an empty project without doing any change run
> bundle install --binstubs
bundle install installs all Omnibus dependencies
bundle install installs all Omnibus dependencies
The above command will create the installer inside pkg directory. Omnibus determines the platform for which to build an installer based on the platform it is currently running on. That is, you can only generate a .deb file on a Debian-based system. To alleviate this caveat, the generated project includes a Test Kitchen setup suitable for generating a series of Omnibus projects.
Back to the Omnibus DSL. Though bin/omnibus build demo will build the package for you, it will not do anything exciting. For that, you need to use the Omnibus DSL to define the specifics of your application.

1) Config

If present, Omnibus will use a top-level configuration file name omnibus.rb at the root of your repository. This file is loaded at runtime and includes number of configurations. For e.g.-
omnibus.rb
# Build locally (instead of /var)
# -------------------------------
base_dir './local'
# Disable git caching
# ------------------------------
use_git_caching false
# Enable S3 asset caching
# ------------------------------
use_s3_caching true
s3_access_key  ENV['S3_ACCESS_KEY']
s3_secret_key  ENV['S3_SECRET_KEY']
s3_bucket      ENV['S3_BUCKET']
Please see config doc for more information. You can use different configuration file by using –config option using command line
$ bin/omnibus --config /path/to/config.rb

2) Project DSL

When you create an omnibus project, it creates a project DSL file inside config/project with the name which you used for creating project for above example it will create config/project/demo.rb. It provides means to define the dependencies of the project and metadata of the project. We will look at some contents of project DSL file
name            "demo"
maintainer      "YOUR NAME"
homepage        "http://yoursite.com"
install_dir     "/opt/demo"
build_version   "0.1.0"
# Creates required build directories
dependency "preparation"
# demo dependencies/components
dependency "harvester"
‘install_dir’ option is the location where package will be installed. There are more DSL methods available which you can use in this file. Please see the Project Doc for more information.

3) Software DSL

Software DSL defines individual software components that go into making your overall package. The Software DSL provides a way to define where to retrieve the software sources, how to build them, and what dependencies they have. Now let’s edit a config/software/demo.rb
name "demo"
default_version "1.0.0"
dependency "ruby"
dependency "rubygems"
build do
  #vendor the gems required by the app
  bundle “install –path vendor/bundle”
end
In the above example, consider that we are building a package for Ruby on Rails application, hence we need to include ruby and rubygems dependency. The definition for ruby and rubygems dependency comes from the omnibus-software. Chef has introduced omnibus-software, it is a collection of software definitions used by chef while building their products. To use omnibus-software definitions you need to include the repo path in Gemfile. You can also write your own software definitions. Inside build block you can define how to build your installer. Omnibus provide Build DSL which you can use inside build block to define your build essentials. You can run ruby script and copy and delete files using Build DSL inside build block.
Apart from all these DSL file omnibus also created ‘package-script’ directory which consist of pre install and post install script files. You can write a script which you want to run before and after the installation of package and also before and after the removal of the package inside these files.
You can use the following references for more examples
https://github.com/chef/omnibus
https://www.chef.io/blog/2014/06/30/omnibus-a-look-forward/

Leave a Reply