Installing applications via packages saves us a lot of time. Especially being an OPS oriented guy, compiling applications from source is somtimes pain and time consuming. Especially the dependencies. But later, after the rise of config management system, people started creating corresponding automated scripts that will install necessary dependencies and the ususal
make && make install. But if you check applications like Freeswitch was taking 15+min to finish compiliations, which is defintely a bad idea when you want to deploy the a new patch on a cluster. In such cases packages are really a life saver. Build the packages once as per our requirement and deploy it throughout the infrastructure. Now with the tools like jenkins,TravisCI etc we can attain a good level of CI.
In this blog, i’m going to explain on how to build a debian package from scratch. First let’s install two main dependencies for a build machine
$ apt-get install devscripts build-essential
For the past few days i was playing with OpenVPN and SoftEther. I’m going to build a simple debian package for OpenVPN from source. The current stable version of OpenVPN is available 2.3.6. First let’s get the OpenVPN source code.
$ wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.6.tar.gz $ tar xvzf openvpn-2.3.6.tar.gz && cd openvpn-2.3.6
Now for building a package, first we need to create a
debian folder. And in this folder we are going to place all necessary files required for building a package.
$ mkdir debian
As per the Debian pacakging Documentation, the mandatory files are rules control, changelog.
Changlog file content should match the exact syntax, otherwise packaging will fail at the initial stage itself. There are some more optional files that we can use. Below are the files present in my
changelog => Changelog for my Package control => Contains Details about the package including the dependencies dirs => specifies any directories which we need but which are not created by the normal installation procedure, handled by 'dh_installdirs' openvpn.default => this file will be copied to /etc/default/openvpn openvpn.init => this file will be copied to /etc/init.d/openvpn, handled by 'dh_installinit' postinst.debhelper => Any action that need to be performed once the package installation is completed, like creating a specific user, starting service etc postrm.debhelper => Any action that need to be performed once the package removal is completed, like deleting a specific user prerm.debhelper => Any action that need to be performed before the package removal is initiated, like stopping the service rules => Contains rules for build procedure
In my case i wanted to install the openvpn on a custom location say ’/opt/openvpn’. So if we are building from scratch manually, we can mention the prefix like ’./configure –prefix=/opt/openvpn’. but in the build process,
dh_auto_configure is running our ’./configure’ operation with dfault option ie, no custom prefix. So we need to overide this process if we want to have a custom prefix. Below is the content of my
# rules file #!/usr/bin/make -f # vim: tabstop=4 softtabstop=4 noexpandtab fileencoding=utf-8 # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 DEB_DIR=$(CURDIR)/debian/openvpn %: dh $@ override_dh_auto_configure: # override of configure ./configure --prefix=/opt/openvpn
Once we have all the necessary files in place, we can start the build process. Make sure that all the dependency packages mentioned in the
control file is installed on the build server.
$ debuild -us -uc
If the build command is completed successfully, we will see the deb package as well as the source package just above our openvpn source folderm which is the default path where
dh_builddeb places the files. We can overide the same too.
#!/usr/bin/make -f # vim: tabstop=4 softtabstop=4 noexpandtab fileencoding=utf-8 # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 DEB_DIR=$(CURDIR)/debian/openvpn %: dh $@ override_dh_auto_configure: ./configure --prefix=/opt/openvpn override_dh_builddeb: dh_builddeb --destdir=./deb-pkg/
So now we have the Debian package. We can test installing it manually via ’dpkg -i’. This was just a go thorugh on how to build a simple debian package. In my next blog, i’ll be discussing about how to create and manage a private apt repository using a awsme tool called aptly