Files
mgmt/misc/fpm-pack.sh
James Shubin a4db9fc8e5 misc: Add mkosi based package building with fpm
Building distro packages is great, however if they aren't built in the
correct environment with the associated dependencies, then they won't
work properly on those distros.

This patch adds an `mkosi` based image building environment that builds
the packages in their respective distros, and then copies them out into
our releases directory.

You'll now want to `make tag && make mkosi && make release` to get a new
release out. We use a small hack to trick the `make release` portion to
not re-build the distro packages if they're already present in the
releases/ directory for that version.

This commit depends on a very recent version of mkosi (it was tested
with git master) and also depends on two currently unmerged patches:
https://github.com/systemd/mkosi/pull/363 and
https://github.com/systemd/mkosi/pull/365
2019-09-20 12:32:41 -04:00

108 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# This script packages rpm, deb, and pacman packages of mgmt with fpm. The
# first argument is the package type, and all subsequent arguments are the
# dependencies. Example usage: `./fpm-pack.sh deb dependency1 dependency2`
# the binary to package
BINARY="mgmt"
# git tag pointing to the current commit
TAG=$(git tag -l --points-at HEAD)
# maintainer email
MAINTAINER="mgmtconfig@purpleidea.com"
# project url
URL="https://github.com/purpleidea/mgmt/"
# project description
DESCRIPTION="Next generation distributed, event-driven, parallel config management!"
# project license
LICENSE="GPLv3"
# location to install the binary
PREFIX="/usr/bin"
# release directory
DIR="releases"
# placeholder for dependencies to be read from arguments
DEPS=
# placeholder for changelog argument parsed from the package type
CHANGELOG=
# make sure we're on a tagged commit
if [ "$TAG" == "" ]; then
echo "cannot release an untagged commit"
exit 1
fi
if [ "$2" == "" ]; then
echo "version was not specified"
exit 1
fi
VERSION="$2"
if [ "$VERSION" != "$TAG" ]; then
echo "you must checkout the correct version before building (${VERSION} != ${TAG})"
exit 1
fi
# make sure the package type is valid
if [ "$1" != "rpm" ] && [ "$1" != "deb" ] && [ "$1" != "pacman" ]; then
echo "invalid package type"
exit 1
fi
# don't run if the file already exists (bad idempotent implementation)
if [ -d "${DIR}/${VERSION}/${1}/" ]; then
if [ "$1" = "rpm" ]; then
if ls "${DIR}/${VERSION}/${1}/"*.rpm &>/dev/null; then
# update timestamp so the Makefile is happy =D
touch "${DIR}/${VERSION}/${1}/"*.rpm
echo "a .rpm already exists"
exit 0 # don't error, we want to be idempotent
fi
fi
if [ "$1" = "deb" ]; then
if ls "${DIR}/${VERSION}/${1}/"*.deb &>/dev/null; then
touch "${DIR}/${VERSION}/${1}/"*.deb
echo "a .deb already exists"
exit 0
fi
fi
if [ "$1" = "pacman" ]; then
if ls "${DIR}/${VERSION}/${1}/"*.tar.xz &>/dev/null; then
touch "${DIR}/${VERSION}/${1}/"*.tar.xz
echo "a .tar.xz already exists"
exit 0
fi
fi
fi
# there are no changelogs for pacman packages
if [ "$1" != "pacman" ]; then
CHANGELOG="--${1}-changelog=${DIR}/${VERSION}/${1}/changelog"
fi
# arguments after the first two are deps
for i in "${@:3}"; do
DEPS="$DEPS -d $i"
done
# in case the `fpm` gem bin isn't in the $PATH
if which ruby >/dev/null && which gem >/dev/null && ! command -v fpm 2>/dev/null; then
PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi
# build the package
fpm \
--log error \
--name "$BINARY" \
--version "$TAG" \
--maintainer "$MAINTAINER" \
--url "$URL" \
--description "$DESCRIPTION" \
--license "$LICENSE" \
--input-type dir \
--output-type "$1" \
--package "${DIR}/${VERSION}/${1}/" \
${CHANGELOG} \
${DEPS} \
--prefix "$PREFIX" \
"$BINARY"