An open API service indexing awesome lists of open source software.

https://github.com/timsutton/brewbus

Very simple Omnibus-style OS X installer packages from Homebrew.
https://github.com/timsutton/brewbus

Last synced: 11 months ago
JSON representation

Very simple Omnibus-style OS X installer packages from Homebrew.

Awesome Lists containing this project

README

          

# brewbus

This is a very simple shell script that outputs Omnibus-style OS X installer packages from Homebrew.

The use case is for outputting Installer packages for a given Homebrew formula, including all its dependencies,
in such a way that the binary and dependencies can't collide with those of other components (other formulae,
other things installed in `/usr/local`, etc.)

If the formula and its dependencies are all versioned, it should be possible to make reproducible
builds of older versions by passing in the commit revision, which will build from the revision
within the Homebrew repo.

More on the general idea of Omnibus packaging here:

* https://github.com/chef/omnibus
* http://blog.scoutapp.com/articles/2013/06/21/omnibus-tutorial-package-a-standalone-ruby-gem

## How it works

Sets up an "isolated" Homebrew installation at a prefix you specify (e.g. `/myorg`), with the entire
formula installation located within the formula name (e.g. `/myorg/ffmpeg`). All the formula's
dependencies should be properly installed using `/myorg/ffmpeg` as the prefix, and an installer
package will be built using the prefix as the `install-location`. The payload is the entire contents of the Homebrew installation, minus a set of Homebrew-specific paths which are excluded from the built package (such as the actual repo in `.git`).

```
FORMULA=nyancat ./brewbus.sh
```

To create the initial prefix/formula path, this script uses `sudo` so that your regular (or admin) user can create the necessarily target directories, but the actual brew installation and package creation is done as a regular user. Homebrew also, rightfully, doesn't allow being run as root.

## Command-line options

There are none - all configuration is done via environment variables. This was done simply so that I could run the script standalone in a "cleanroom" VM as a Jenkins parameterized build (where the parameters ultimately set environment variables).

The supported environment variables for configuration:

#### FORMULA

(required): name of Homebrew formula

#### PREFIX

Prefix to use in conjunction with FORMULA, to use as a root for the package. For example, a `PREFIX` of `/opt` and a `FORMULA` of `tree` will make a root of `/opt/tree`, meaning the final binaries will be in `/opt/tree/bin/` (or `sbin`, etc.). **Default:** /brewbus

#### REVERSE_DOMAIN

Reverse-domain-style prefix for the installer package identifier. **Default:** ca.macops.brewbus

#### BREW_GIT_SHA

Optional Git SHA-1 hash to which the tap of the homebrew-core repo will be checked out. Useful if you want to 'pin' to a specific known state for the Formula. **Default:** (none, and use the tip of master branch)

#### OUTPUT_DIR

Optional output directory for the built package. **Default:** Current working directory

## Paths

Of course, binaries that are installed to `/myprefix/formula/{bin,sbin}` will not be in a user's default `PATH`. This tool wasn't specifically intended for distributing tools for general use but rather infrastructure- or build-related tools. However, one can always add additional paths to files in `/etc/paths.d`, which shells on OS X should be sourcing to add to the end of a user's `PATH` at login. If anyone would like to submit an option to add something like this automatically, it would be welcome.

## Formulae linking to /usr/local/opt

Some formulae link to shared libraries installed to /usr/local/opt (for example, formulae depending on `openssl`), and those will not work with this project as-is. The workaround for these cases would be to manage installations of these dependencies to /usr/local/opt independently. Not yet sure if there is a way to also support installing these dependencies within the same PREFIX as we install the rest of the formula dependencies.

## A note on sudo and permissions

Assuming one is using prefixes like `/myorg/formula`, this script will require `sudo` in order for the script to have permission to write to the root volume to create the prefix, unless the prefix exists already and is writeable by the current user.

Running this script using `sudo` if there already exists a Homebrew installation for the regular user of the machine may result in some cache files created as root, causing issues with future usage of `brew` as the regular user.

I don't advise running this in such a situation, but instead recommend it be done in a "clean" environment with no pre-existing Homebrew installation.