Omnibus を利用して OSX のパッケージを作成する


今さらなのですが諸事情で作ってみたので

dmgファイルになって配布が簡単になります。インストールはpkgをクリックしてもらうだけです

![sass.png](https://qiita-image-store.s3.amazonaws.com/0/4393/a3453fb7-f906-990d-e96d-09f4dc6f6a4d.png "sass.png")

Sass単体だと用途があまり思い浮かばないのですが`chef`や`gitlab`みたいなプロダクトやミドルウェアなど配布するときには便利なのではないかと思います。

試していないですがWindows配布にも対応しているし。

## 試したバージョン

- `Omnibus` - v3.2.1
- `ruby` - 2.1.1p76

## （作成する）パッケージ情報

- `/opt/sass`にインストール
- `ruby`のバージョンは2.1.1
- `rubygems`のバージョンは2.2.1

## 作成方法

以下にずらずら書いてる手順で作成したサンプルはGitHubにアップしています

https://github.com/ryshinoz/omnibus-sass-sample

### `omnibus`をインストールする

```bash
$ gem install omnibus
$ omnibus -v
Omnibus v3.2.1
```

### プロジェクトを作成

```bash
$ omnibus new sass
      create  omnibus-sass/Gemfile
      create  omnibus-sass/.gitignore
      create  omnibus-sass/README.md
      create  omnibus-sass/omnibus.rb
      create  omnibus-sass/config/projects/sass.rb
      create  omnibus-sass/config/software/c-example.rb
      create  omnibus-sass/config/software/erlang-example.rb
      create  omnibus-sass/config/software/ruby-example.rb
      create  omnibus-sass/.kitchen.local.yml
      create  omnibus-sass/.kitchen.yml
      create  omnibus-sass/Berksfile
      create  omnibus-sass/package-scripts/sass/makeselfinst
       chmod  omnibus-sass/package-scripts/sass/makeselfinst
      create  omnibus-sass/package-scripts/sass/preinst
       chmod  omnibus-sass/package-scripts/sass/preinst
      create  omnibus-sass/package-scripts/sass/prerm
       chmod  omnibus-sass/package-scripts/sass/prerm
      create  omnibus-sass/package-scripts/sass/postinst
       chmod  omnibus-sass/package-scripts/sass/postinst
      create  omnibus-sass/package-scripts/sass/postrm
       chmod  omnibus-sass/package-scripts/sass/postrm
      create  omnibus-sass/files/mac_pkg/Resources/license.html
      create  omnibus-sass/files/mac_pkg/Resources/welcome.html
      create  omnibus-sass/files/mac_pkg/Resources/background.png
      create  omnibus-sass/files/mac_dmg/Resources/background.png
      create  omnibus-sass/files/mac_dmg/Resources/icon.png
      create  omnibus-sass/files/windows_msi/Resources/localization-en-us.wxl.erb
      create  omnibus-sass/files/windows_msi/Resources/parameters.wxi.erb
      create  omnibus-sass/files/windows_msi/Resources/source.wxs
      create  omnibus-sass/files/windows_msi/Resources/assets/LICENSE.rtf
      create  omnibus-sass/files/windows_msi/Resources/assets/banner_background.bmp
      create  omnibus-sass/files/windows_msi/Resources/assets/dialog_background.bmp
      create  omnibus-sass/files/windows_msi/Resources/assets/project.ico
      create  omnibus-sass/files/windows_msi/Resources/assets/project_16x16.ico
      create  omnibus-sass/files/windows_msi/Resources/assets/project_32x32.ico
```

### `Gemfile`を修正

[`omnibus-software`](https://github.com/opscode/omnibus-software)をインストールするようにします

※ 現在のブランチだと`cacert`がチェックサムでエラーになってしまうのでフォークして修正した自分のブランチを利用しています

```Gemfile
source 'https://rubygems.org'

# Use Berkshelf for resolving cookbook dependencies
gem 'berkshelf', '~> 3.0'

# Install omnibus software
gem 'omnibus', '~> 3.2'

# Use Chef's software definitions. It is recommended that you write your own
# software definitions, but you can clone/fork Chef's to get you started.
# gem 'omnibus-software', github: 'opscode/omnibus-software'
gem 'omnibus-software', github: 'ryshinoz/omnibus-software', branch: 'omnibus/3.2-stable'

# Use Test Kitchen with Vagrant for converging the build environment
gem 'test-kitchen',    '~> 1.2'
gem 'kitchen-vagrant', '~> 0.14'
```

インストールします

```bash
$ bundle install --binstubs
```

### `config/software/sass.rb`を作成

`config/software`配下にそれぞれのソフトウェアをインストールするDSLを用意します

今回は`Sass`をインストールするDSLを作成します

ビルド手順は以下です、パスで/opt/sass配下にインストールされている`bundle`や`rake`を利用するようにしています

1. `bundle install`で依存ライブラリをインストール
2. `rake package`でパッケージ作成
3. 作成したパッケージをインストール
4. `/opt/sass/bin/sass`でシンボリックリンクを作成する

```ruby
name 'sass'
default_version 'stable'
gem_version = '3.4.3'

source :git => 'https://github.com/sass/sass.git'
relative_path 'sass'

env = {
  'PATH' => "#{install_dir}/embedded/bin:#{ENV['PATH']}"
}

build do
  command "bundle install", :env => env
  command "rake package", :env => env
  command "#{install_dir}/embedded/bin/gem install --no-ri --no-rdoc -l pkg/sass-#{gem_version}.gem", :env => env
  command "ln -fs #{install_dir}/embedded/bin/sass #{install_dir}/bin/sass", :env => env
end
```

### `config/project/sass.rb`を作成

ここにプロジェクト用の設定を記述します

`dependency`で先ほど作成した`sass`やそれのインストールに必要な`ruby`なども指定します

インストール先やメンテナーなども必要に応じて修正します

```
name 'sass'
maintainer 'CHANGE ME'
homepage 'https://CHANGE-ME.com'

install_dir     '/opt/sass'
build_version   Omnibus::BuildVersion.semver
build_iteration 1

override :ruby, version: '2.1.1'
override :rubygems, version: '2.2.1'

# creates required build directories
dependency 'preparation'

# sass dependencies/components
# dependency 'somedep'
dependency 'ruby'
dependency 'rubygems'
dependency 'bundler'

dependency "sass"

# version manifest file
dependency 'version-manifest'

exclude '\.git*'
exclude 'bundler\/git'
```

### キャッシュ用ディレクトリを作成

デフォルトだとキャッシュ用ディレクトリが`/var/cache/omnibus`になっていますが、存在しないのでそのままだとエラーになりますので作成しておきます

```bash
$ sudo mkdir -p -m 777 /var/cache/omnibus
```

### インストールディレクトリを作成する

`config/project/sass.rb`で指定した`install_dir`を作成して実行するユーザにパーミッションを付与しておいてください

```bash
$ sudo mkdir /opt/sass
$ sudo chown xxx:xxx /opt/sass
```

### ビルド

いっぱいDEPRECATEDが出ますが今回は無視します

```bash
$ bin/omnibus build sass
                     [BuildVersion] W | Could not extract version information from 'git describe'! Setting version to 0.0.0.
Building sass 0.0.0+20140906094658...
                   [Software: zlib] W | DEPRECATED: project_file (DSL). Please use `downloaded_file' instead.
                [Software: ncurses] W | DEPRECATED: project_file (DSL). Please use `downloaded_file' instead.
...
...
...
                           [Config] W | DEPRECATED: fetch ([]). Please use `Config.dmg_window_bounds' instead.
                           [Config] W | DEPRECATED: fetch ([]). Please use `Config.dmg_pkg_position' instead.
```

完了すると`pkg`ディレクトリ配下にpkgとdmgファイルが作成されています

```bash
$ tree pkg
pkg
├── sass-0.0.0+20140906094658-1.dmg
├── sass-0.0.0+20140906094658-1.dmg.metadata.json
├── sass-0.0.0+20140906094658-1.pkg
└── sass-0.0.0+20140906094658-1.pkg.metadata.json
```

### インストール

作成された`sass-0.0.0+20140906094658-1.dmg`からインストールしてみます

バージョンが出れば多分問題なく動きます

```bash
$ /opt/sass/bin/sass -v
Sass 3.4.3 (Selective Steve)
```

## Links

- [sawanobolyさんの記事](http://qiita.com/sawanoboly/items/a2c258a235824b91b70f)
- [opscode/omnibus](https://github.com/opscode/omnibus)
- [sass/sass](https://github.com/sass/sass)

以上