# Linux Release We will build a `.deb` binary and test it. Then we will build a source tarball, upload to Launchpad PPA, let it autobuild, and copy the published `.deb` link from there. ## Summary ### Building a `.deb` locally Update `debian/changelog` with a new log message. Update version number. Use the time from `date -R`. Build: ``` $ ./package-linux.sh --binary-only --unsigned ``` Type `s` for single binary, `Enter`. It displays a confirm message, `Enter`. When the build finished, find the `.deb` in `$HOME/PPA/fractorium-VERSION`. ### Publishing to Launchpad PPA Remember we are not building a `.deb` here, Launchpad will do that. We are just uploading a signed source tarball. Make sure `debian/changelog` was updated. Build: ``` $ ./package-linux.sh ``` Type `s` for single binary, `Enter`. It displays a confirm message, `Enter`. It asks for your GPG key passphrase to sign the source tarball. Now upload the source tarball to Launchpad: ``` $ dput ppa:fractorium/ppa fractorium_1.0.0.0a-0ubuntu1_source.changes ``` An email will arrive to say if the package was accepted or rejected. Wait for the autobuild to complete, and when the package is published, copy the link to the `.deb` from "Package Details". ## Narrative Starting with a fresh clone from my fork at bitbucket. ``` $ cd fractorium ``` First, testing locally on my machine. `package-linux.sh` with no arguments builds a signed source for the Launchpad PPA. Instead, now we want an unsigned binary `.deb`: ``` $ ./package-linux.sh --binary-only --unsigned ``` ``` Error: Different version numbers were found. Please update the correct file, the version numbers should agree up to the digits in: 0.9.9.6 1.0.0.0 ./debian/changelog : 0.9.9.6 ./Source/Ember/EmberDefines.h : 1.0.0.0 ``` So, I should bump the version number in `debian/changelog`. Let's get the time in the correct format: ``` $ date -R Sat, 18 Jun 2016 13:12:15 +0100 ``` Add a new log message at the top of `debian/changelog`, copying the last message and changing the version number and time. ``` fractorium (1.0.0.0-0ubuntu1) xenial; urgency=low * release 1.0.0.0 -- Gambhiro Bhikkhu Sat, 18 Jun 2016 13:12:15 +0100 ``` Now try again: ``` $ ./package-linux.sh --binary-only --unsigned ``` Question about type of build: ``` Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] ``` Type `s` for single binary, `Enter`. It displays a confirm message, `Enter`. The build starts. It copied the files which are not ignored in `.gitignore` out to `$HOME/PPA/fractorium-1.0.0.0/`, and building there. The build finished, let's go and see: ``` $ cd $HOME/PPA/fractorium-1.0.0.0 $ ls -lh total 7.7M drwxrwxr-x 2 yume yume 4.0K Jun 18 13:31 build-area drwxrwxr-x 8 yume yume 4.0K Jun 18 13:19 fractorium -rw------- 1 yume yume 780 Jun 18 13:31 fractorium_1.0.0.0-0ubuntu1_amd64.changes -rw------- 1 yume yume 3.5M Jun 18 13:31 fractorium_1.0.0.0-0ubuntu1_amd64.deb -rw-rw-r-- 1 yume yume 2.1M Jun 18 13:18 fractorium_1.0.0.0.orig.tar.gz -rw-rw-r-- 1 yume yume 2.1M Jun 18 13:18 fractorium-1.0.0.0.tar.gz ``` This `.deb` is ready to use. (aside) You could upload this `.deb` to the website if you don't want to bother with the Launchpad PPA. The advantages of the PPA are - testing the package and build procedure - users will automatically get the updated version when they run their regular upgrades ppl get used to always looking for the PPA of a project and installing from there: ``` sudo apt-add-repository ppa:fractorium/ppa sudo apt-get update sudo apt-get install fractorium ``` (aside end) Back to installing the `.deb`: ``` sudo dpkg -i fractorium_1.0.0.0-0ubuntu1_amd64.deb ``` When I open fractorium with its menu icon, the About page has the updated version number. I run a few random flames, drag some xforms around. All seems well. Now let's upload the source to the Launchpad PPA for the auto-build. Back in the fractorium folder: ``` $ ./package-linux.sh PPA work folder already exists: /home/yume/PPA/fractorium-1.0.0.0 Move this folder aside or remove it. ``` That's right, it expects to be able to create a clean folder with that name. I don't need the earlier files, so let's remove it: ``` $ rm -r /home/yume/PPA/fractorium-1.0.0.0 ``` Try again: ``` $ ./package-linux.sh ``` Very good. Press `s` at the type of package question. This is quick, it only creates a source tarball to upload. Before finishing, it asks for my GPG key passphrase to sign the source tarball. Now let's upload it to Launchpad: ``` $ cd /home/yume/PPA/fractorium-1.0.0.0/ $ dput ppa:fractorium/ppa fractorium_1.0.0.0-0ubuntu1_source.changes ``` It verifies my signature and says `Uploading to ppa (via ftp to ppa.launchpad.net)`. Upload finished, now I open my email and wait for a message from Launchpad. It arrives, saying the package was accepted. ``` [~fractorium/ubuntu/ppa/xenial] fractorium 1.0.0.0-0ubuntu1 (Accepted) ``` I open https://launchpad.net/~fractorium/+archive/ubuntu/ppa from the email and check that the build started: ``` [BUILDING] amd64 build of fractorium 1.0.0.0-0ubuntu1 in ubuntu xenial RELEASE Build started 2 minutes ago on lgw01-09 ``` Good, let's wait. If the package had been rejected, or if the autobuild now fails, then I would be fixing the build on my machine. When I want to try again, I would add a new message to the top of `debian/changelog`, with a modified version number and time. For these minor changes it is enough to append a letter to the version number, such as `fractorium 1.0.0.0a`. Then create a tarball again with `package-linux.sh`, and upload to Launchpad with `dput`. If fact I just remembered I should update the project links and description in `debian/control`. So I will do that now, bump the version number to `fractorium 1.0.0.0a` and update the time to `date -R`. Publish update: ``` $ ./package-linux.sh $ cd ~/PPA/fractorium-1.0.0.0a $ dput ppa:fractorium/ppa fractorium_1.0.0.0a-0ubuntu1_source.changes ``` Email says package accepted. Building has started. Finished: ``` Successfully built on lgw01-33 Started 23 minutes ago Finished 1 minute ago (took 22 minutes, 6.6 seconds) ``` But also: ``` Binary packages awaiting publication: fractorium-1.0.0.0a-0ubuntu1 ``` It usually takes a bit more time until the `.deb` is published in the PPA repository. Commit the changes: ``` $ git checkout -b linux-1.0.0.0a $ git add -A . $ git commit -m "linux 1.0.0.0a" ``` After a little while the package is published now, so I go to: - https://launchpad.net/~fractorium/+archive/ubuntu/ppa - Select "Package Details" - Open the dropdown arrow at the package listing, see "Publishing Details" - Under "Package Files", copy the link to the `.deb` https://launchpad.net/~fractorium/+archive/ubuntu/ppa/+files/fractorium_1.0.0.0a-0ubuntu1_amd64.deb Update the README.md link to this. All done. Commit, push, send Pull Request.