Jenkins/misc/build-package-with-tamarin

162 lines
4.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
# build-package-from-git - Job handler for Marang
# Author: Willam Petit <wpetit@cadoles.com>
#
# Dependencies:
#
# - jq - https://stedolan.github.io/jq/ - apt-get install jq
# - git
#
# Arguments:
#
# - $1: Docker distribution to use for building package - Default: debian:jessie
# - $2: Limit the build for commits in this specified branch - Default: No branch limitation
#---------Config---------
TAMARIN_PATH=$(readlink -f ../../tamarin)
#------------------------
#---------Functions---------
function get_payload_opt {
echo "$MARANG_PAYLOAD" | jq -r "$1"
}
function clean_workspace {
# Clean workspace
echo "Cleaning workspace $workdir..."
rm -rf "$workdir"
}
#---------------------------
# Get handlers arguments
DISTRIB=$1
LIMIT_TO_BRANCH=$2
OUTPUT_DIR=$3
# Create temporary workspace
workdir=$(mktemp -d)
cd "$workdir"
trap clean_workspace EXIT
echo "Using workspace $workdir..."
# Create temporary dist directory
mkdir -p "$workdir/dist"
# Extract project info
project_name=$(get_payload_opt ".repository.name" | tr '[:upper:]' '[:lower:]')
repo_url=$(get_payload_opt ".repository.clone_url")
commit=$(get_payload_opt ".ref")
# Fetch project sources
GIT_SSL_NO_VERIFY=true git clone "$repo_url" "$project_name"
cd "$project_name"
# Limit the build to a specific branch if needed
if [ ! -z "$LIMIT_TO_BRANCH" ]; then
echo "The build processus is limited to $LIMIT_TO_BRANCH..."
git checkout "$LIMIT_TO_BRANCH"
branches_containing_commit=$(git branch --contains $commit)
if [[ ! "${branches_containing_commit[@]}" =~ "$LIMIT_TO_BRANCH" ]]; then
echo "The commit $commit is not part of $LIMIT_TO_BRANCH !"
clean_workspace
exit
fi
fi
# Checkout specified commit
git checkout "$commit"
git submodule init
git submodule update
echo "Building package..."
# Build on package per version
set +e
COMMIT_TAGS=$(git describe --exact-match --abbrev=0) #git tag -l --contains HEAD | grep "^pkg")
set -e
if [[ -z ${COMMIT_TAGS} ]]
then
echo "Nothing to build :"
echo " - No build build tags on last commit"
clean_workspace
exit
fi
for tag in ${COMMIT_TAGS}
do
PACKAGE_ENV=$(echo ${tag} | cut -d '/' -f 2)
PACKAGE_DISTRIB=$(echo ${tag} | cut -d '/' -f 3)
PKGVERSION=$(echo ${tag} | cut -d '/' -f 4)
# Setting package version
[[ -z ${PKGVERSION} ]] && PKGVERSION="NO-VERSION"
cd ${workdir}/${project_name}
tamarinrc="${workdir}/${project_name}/.tamarinrc"
[[ ! -f ${tamarinrc} ]] && touch ${tamarinrc}
set +e
grep -q "^project_version=.*" ${tamarinrc}
if [[ ${?} -eq 0 ]]
then
sed -i -e "s/^project_version=.*/project_version=${PKGVERSION}/" ${workdir}/${project_name}/.tamarinrc
else
echo "project_version=${PKGVERSION}" > ${tamarinrc}
fi
if [[ ${PACKAGE_ENV} =~ ^(staging|stable) ]]
then
grep -q "^no_version_suffix=.*" ${tamarinrc}
if [[ ${?} -eq 0 ]]
then
sed -i -e "s/no_version_suffix=.*/no_version_suffix=yes/" ${tamarinrc}
else
echo "no_version_suffix=yes" >> ${tamarinrc}
fi
fi
set -e
# Build package with Tamarin for specified distrib
echo
echo "Building package with $TAMARIN_PATH/package (${tag})"
echo
"$TAMARIN_PATH/package" "$workdir/$project_name" -o "$workdir/dist" -b "$DISTRIB"
# Copy debian packages to destination directory if arguments is specified
if [ ! -z $OUTPUT_DIR ]; then
DEST_DIR="$OUTPUT_DIR/$LIMIT_TO_BRANCH/$project_name"
mkdir -p "$DEST_DIR"
echo "Copying packages to $DEST_DIR/..."
cp $workdir/dist/*.deb "$DEST_DIR/"
else
echo "No output directory specified."
fi
# Deploy packages automatically based on tags
# Check that the package environment matches the expected ones
if [[ "$PACKAGE_ENV" =~ ^(dev|staging|stable)$ ]]; then
echo
echo "Pushing packages to matching '$PACKAGE_ENV' repository ..."
echo
ssh aptly@vulcain.cadoles.com mkdir -p "/home/aptly/packages/$PACKAGE_ENV/$LIMIT_TO_BRANCH"
scp -r $workdir/dist/*.deb "aptly@vulcain.cadoles.com:/home/aptly/packages/$PACKAGE_ENV/$LIMIT_TO_BRANCH/"
echo "Cleaning builded package"
rm -rf $workdir/dist/*
else
echo "Packaging tag prefix 'pkg' found but the environment token does not match any of 'dev', 'staging' or 'stable'. Ignoring..."
fi
done