git packaging hooks for autotools, debian, and opensuse build service

bill-auger 493734acbc update README 6 years ago
.gitignore ddb0bd0a50 add git packaging hooks for debian 6 years ago
LICENSE d1a7e00893 add git packaging hooks for autotools and OBS 6 years ago
README.md 493734acbc update README 6 years ago
commit-msg ddb0bd0a50 add git packaging hooks for debian 6 years ago
common.sh.inc ddb0bd0a50 add git packaging hooks for debian 6 years ago
debug-constants.sh.inc ddb0bd0a50 add git packaging hooks for debian 6 years ago
debug-remote-files.sh.inc d1a7e00893 add git packaging hooks for autotools and OBS 6 years ago
gbp.conf ddb0bd0a50 add git packaging hooks for debian 6 years ago
post-commit ddb0bd0a50 add git packaging hooks for debian 6 years ago
project-defs.sh.inc.example ddb0bd0a50 add git packaging hooks for debian 6 years ago

README.md

these files are a set of git hooks to semi-automate the following:

  • injecting semantic version strings into the program source code
  • signed releases on github
  • packaging for debian
  • packaging on the opensuse build service (OBS)

sources include graph:

* commit-msg
  -> common.sh.inc
     -> project-defs.sh.inc
  -> staging-pre.sh.inc
  -> packaging-pre.sh.inc
* post-commit
  -> common.sh.inc
     -> project-defs.sh.inc
  -> staging-post.sh.inc
  -> packaging-post.sh.inc
     -> github-post.sh.inc
     -> obs-post.sh.inc
     -> debian-post.sh.inc

initial local configuration:

  • configure git to use these git-packaging-hooks
    => $ git config --local core.hooksPath /path/to/git-packaging-hooks/
  • define the project-specific constants in project-defs.sh.inc
  • ensure that the project debian/ and obs/ directories are on the $PACKAGING_BRANCH only
  • copy (or adapt) the gbp.conf from this directory to the project debian/ directory
  • ensure that git config user.name and git config user.signingkey are set
  • ensure that curl and piuparts are installed
    => $ su -c "apt-get install curl piuparts"
  • for DEB_BUILD_TOOL='debuild' ensure that devscripts is installed
    => $ su -c "apt-get install devscripts"
  • for DEB_BUILD_TOOL='sbuild' ensure that sbuild and schroot are installed
    and that your user is in the 'sbuild' group
    => $ su -c "apt-get install sbuild schroot"
    => $ su -c "sbuild-adduser $USER"
    => (optional) set alternate chroot directory
    => $ su -c "mkdir -p ${$DEB_SBUILD_DIR}
    => $ su -c "rm -rf /run/schroot"
    => $ su -c "ln -s $DEB_SBUILD_DIR /run/schroot"
  • for DEB_BUILD_TOOL='gbp' ensure that git-buildpackage is installed
    => ensure that your user can sudo
    => $ sudo apt-get install debhelper fakeroot git-buildpackage cowbuilder
    => (optional) set alternate chroot directory
    => $ sudo mkdir -p $DEB_PBUILDER_DIR
    => $ sudo rm -rf /var/cache/pbuilder
    => $ sudo ln -s $DEB_PBUILDER_DIR /var/cache/pbuilder

for each release version:

  • checkout the $STAGING_BRANCH and pull/merge the release state
  • ensure that the appropriate tag 'vMAJOR.MINOR' exists on the $STAGING_BRANCH
    or add a new tag 'vMAJOR.MINOR' if major or minor version should change
  • amend the $STAGING_BRANCH HEAD commit to trigger the git hooks
  • verify that the git hook has put a tag of the form 'vMAJOR.MINOR.REV' on the HEAD
    where REV is n_commits after the nearest 'vMAJOR.MINOR' tag
  • checkout the $PACKAGING_BRANCH to enable the packaging-specific git hooks
  • rebase the $PACKAGING_BRANCH onto the previous HEAD
  • (optional) in debian/changelog
    => add detailed entry for this version to suppress the automated entry

if build or install steps have changed:

  • in $OBS_NAME.spec.in
    => update '%build' recipe, and/or '%post' install hooks
  • in debian.rules
    => update 'build-stamp:' and 'install:' recipes
  • in PKGBUILD.in
    => update 'build()' and 'package()' recipes
    => $ gpg --detach-sign PKGBUILD

if output files have changed:

  • in $OBS_NAME.spec.in
    => update package '%files'

if dependencies have changed:

  • in $OBS_NAME.spec.in
    => update 'BuildRequires' and/or 'Requires'
  • in $OBS_NAME.dsc.in
    => update 'Build-Depends'
  • in debian.control
    => update 'Build-Depends' and/or 'Depends'
  • in PKGBUILD.in
    => update 'makedepends' and/or 'depends'
    => $ gpg --detach-sign PKGBUILD

prepare packaging files:

  • add a new commit to trigger the git hooks
    => $ git add --all
    => $ git commit --allow-empty --allow-empty-message --message=''

NOTE: after each commit to the $STAGING_BRANCH:

  • the version string will be written into the configure.ac file
  • any git tags of the form 'vMAJOR.MINOR.REV' that are not merged into master will be deleted
  • a git tag 'vMAJOR.MINOR.REV' will be put on the HEAD
    where REV is n_commits after the nearest 'vMAJOR.MINOR' tag
  • autoreconf will be run, the project will be rebuilt and installchecked
  • the commit will be rejected if the re-config/re-build fails
  • the commit will be amended with '--gpg-sign' if it was not already GPG signed
    or if any tracked files had been changed by the re-config/re-build

NOTE: after each commit to the $PACKAGING_BRANCH:

  • all existing git tags are preserved
  • rebasing and amend commits are non-eventful and will not trigger any of the following actions
  • the _service, .spec, .dsc, and PKGBUILD files will be created from their corresponding *.in templates
  • version strings will be written into the _service, .spec, .dsc, and PKGBUILD files
  • checksums will be written into the .dsc and PKGBUILD files
  • a tarball named 'PROJECT_MAJOR.MINOR.REV.orig.tar.gz' will be in the parent directory
  • signatures will be generated for the tarball and PKGBUILD
  • the .spec and .dsc recipes will be coupled to this tarball
  • the .dsc recipe will be coupled to this tarball checksums
  • the PKGBUILD recipe will be coupled to this tarball, checksum, and signatures
  • a new entry will be added to the debian/changelog if one does not exist for this version
  • the new HEAD commit will be amended and signed with the commit message as $GIT_COMMIT_MSG
  • the $STAGING_BRANCH, $PACKAGING_BRANCH, and tags will pushed to github
  • the PKGBUILD and signatures will be uploaded to the 'vMAJOR.MINOR.REV' github "tag release"
  • the local tarball, PKGBUILD, and signatures will be verified as identical to the github "tag release"
  • all files in the ./obs/ directory (except *.in) will be copied into the $OSC_DIR
  • the remote OBS build will be triggered with a checkin
  • a debian package will be built, installed, and validated in a clean chroot

finalize the release:

  • tweak any debian/ or OSC files and rebuild manually with deb tools and/or osc
    as necessary until everything is rocking sweetly
  • duplicate any manual changes to the OSC files in the ./obs/ files and amend commit
    => $ git add --all
    => $ git commit --amend
  • checkout the master branch and fast-forward to the $STAGING_BRANCH
    => $ git checkout master && git merge $STAGING_BRANCH && git push upstream master