Ian

A Debian CLI package hacking tool named in memory of the late Ian Murdock.

This tool will help you to create and maintain git repositories that contain simple Debian packages and tries to mimic the CLI of other popular tools such as git and bundler.

It is intended to be helpful when integrating other build tools/systems and with CI/CD.

Requirements

  • dpkg
  • fakeroot
  • rsync

Installation

Add this line to your application's Gemfile:

gem 'ian'

And then execute:

$ bundle

Or install it yourself as:

$ gem install ian

Usage

This tool is used for working with what Debian called "Binary packages" - that is ones that have the DEBIAN folder in capitals to slap Debian packages together quickly. It uses dpkg-deb -b in the background which most Debian package maintainers frown at but it is suitable enough for rolling your own packages quickly, and it scratches an itch.

Help is available using -h or --help with all commands.

Create a new package (like bundle new gemname):

$ ian new mycoolpackage

This will create a folder called mycoolpackage as well as the DEBIAN folder inside it, a control file with defaults and a postinst file. It will also create an .ianignore file for stuff you don't want in the package.

Init an existing directory (like git init):

$ ian init

This does the same as the new command but assumes you are already in the folder called mycoolpackage.

Show info for the package (basically cat DEBAIN/control):

$ ian info

This will print the control file as parsed by ian. It will also warn you if you are missing a mandatory field.

Dependencies:

This prints the dependencies from the control file each on a separate line:

$ ian deps

Set info in the control file:

$ ian set -v 2.3.1-beta
$ ian set -a amd64

Using this you can programatically set the version or architecture in the control file.

Run a build script

Put an executable script at DEBIAN/build and when you run:

$ ian build

Ian will run the script passing with the following args:

$ DEBAIN/build <dir> <version> <arch>

That is, the path to the package directory and the version and arch from the control file.

Build a package:

$ ian pkg
$ ian pkg -b   # runs the build script first

Before building a package ian will determine the installed size and save it to the control file. Then the contents are rsynced to a temp dir, excluding the .git folder, the .gitignore and .ianignore files, as well as anything specified in the .ianignore file.

Any files left in the root of the package will be moved to /usr/share/doc under a folder of the same name as the generated package.

Finally the package is built into a pkg folder in the format name_version_arch.

Install a package

$ ian install [-b]

Running the following will build and install a package with one command. This is great for installing the package during development and mimics the rake install command of gem development.

Releasing a package:

EXPERIMENTAL Tagging commits with the package version can be done using this command:

$ ian release

This takes the version from the control file, tags the current commit with that version (prepending it with a v) and then builds the package as above.

$ ian release 4.2.8-beta

This does the same as before, however first it will take the version number in the argument, write it to the control file and commit the control file.

Push a package

Push a package to remote repo by adding a file called .ianpush in the repo root containing a command to run to push the file up. E.G:

package_cloud push my/repo/debian/jessie

Then when you run ian push it will run that command and tack the package for the current version on the end, warning you if you didn't run ian pkg yet. You can also give the package name as an argument like ian push pkg/the-pkg_0.0.1_all.deb.

Show versions:

Show the versions by using this command:

$ ian versions

Help

Need help with the control files? Try these links:

TODO

  • [ ] MD5sums generation
  • [x] finish package generation code
  • [x] ADD SPECS!!!!
  • [ ] ADD MORE SPECS!!!!
  • [ ] Nicer output
  • [ ] add commands to help with releasing new versions/tagging
  • [ ] allow packaging past versions from git tags
  • [ ] add option for semver enforcement
  • [ ] remove rsync dependency
  • [ ] add PUSH command to a server via rsync (lol)

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/penguinpowernz/ian.

In Memory Of

In memory of Ian Ashley Murdock (1973 - 2015) founder of the Debian project.