#!/usr/bin/env bash set -x set -e NAME="$1" ARTIFACTS="${2:-artifacts}" distro="${3:-distro}" prefix=/opt/${NAME#bjn-} apt-get update # Create packaging environment - using system ruby if [ "$distro" = precise ] then apt-get install -y ruby1.9.1 ruby1.9.1-dev \ rubygems1.9.1 irb1.9.1 ri1.9.1 rdoc1.9.1 \ libopenssl-ruby1.9.1 libreadline-dev libffi-dev libssl-dev update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 400 \ --slave /usr/share/man/man1/ruby.1.gz ruby.1.gz \ /usr/share/man/man1/ruby1.9.1.1.gz \ --slave /usr/bin/ri ri /usr/bin/ri1.9.1 \ --slave /usr/bin/irb irb /usr/bin/irb1.9.1 \ --slave /usr/bin/rdoc rdoc /usr/bin/rdoc1.9.1 update-alternatives --config ruby update-alternatives --config gem else packager_deps=(ruby ruby-dev rubygems-integration build-essential libssl-dev libreadline-dev libffi-dev git) apt-get install -y "${packager_deps[@]}" fi /usr/bin/gem install bundler /usr/local/bin/bundle install /usr/bin/gem install fpm ## Build gem rm -rf pkg/*.gem /usr/bin/rake build # Build Ruby from source RUBY_SOURCE=https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.4.tar.gz RUBY_SHA256SUM=98e18f17c933318d0e32fed3aea67e304f174d03170a38fd920c4fbe49fec0c3 RUBY_SOURCE_SIZE=17820518 build_deps=(build-essential git llvm zlib1g-dev libssl-dev libncurses5-dev libreadline6-dev libbz2-dev xz-utils) package_deps=(zlib1g libssl1.0.0 libncurses5 libreadline6 libbz2-1.0 xz-utils) # Prepare ruby build environment apt-get install -y curl "${build_deps[@]}" "${package_deps[@]}" # Build ground-up Ruby for self-contained package rm -rf $prefix mkdir -m 0775 -p $prefix curl -O $RUBY_SOURCE source_tarball=$(basename $RUBY_SOURCE) actual_size=$(stat -c %s $source_tarball) actual_sha256=$(sha256sum $source_tarball | awk '{print $1}') if [ $actual_sha256 != $RUBY_SHA256SUM ] then echo "Ruby tarball invalid, SHA256 sum mismatch (expected $RUBY_SHA256SUM, got $actual_sha256)" >&2 exit 10 fi if [ $actual_size != $RUBY_SOURCE_SIZE ] then echo "Ruby tarball invalid, size mismatch (expected $RUBY_SOURCE_SIZE, got $actual_size)" >&2 exit 11 fi gzip -dc $source_tarball | tar xf - (cd ${source_tarball%.t*} && \ ./configure --prefix=$prefix && \ make && \ make install) rm -rf ${source_tarball%.t*} export PATH=$prefix/bin:$PATH $prefix/bin/gem install pkg/*.gem ## Set packaging info get_metadata() { metadata_constant=$(echo $1 | tr '[[:lower:]]' '[[:upper:]]') $prefix/bin/ruby -Ilib -rbjn_inventory/metadata -rbjn_inventory/version -e "puts BjnInventory::${metadata_constant}" } provides="${NAME}" description=$(get_metadata summary) license=$(get_metadata license) url=$(get_metadata url) maintainer="$(get_metadata author) <$(get_metadata email)>" version=$(get_metadata version) revision="$version-${BUILD_NUMBER:-1}+${distro}-$(git rev-parse --short HEAD)" ## Hard system deps (will be coded as debian package deps) declare -a fpm_dependencies for dependency in "${package_deps[@]}" do fpm_dependencies[${#fpm_dependencies[@]}]=-d fpm_dependencies[${#fpm_dependencies[@]}]="$dependency" done # Create the package rm -f *.deb fpm \ -s dir \ -t deb \ -n "${NAME}" \ -v "${revision}" \ "${fpm_dependencies[@]}" \ --provides "${provides}" \ --description "${description}" \ --maintainer "${maintainer}" \ --url "${url}" \ --exclude "tasks" \ --exclude "tests" \ --exclude ".git" \ --exclude "tmp" \ --license "${license}" \ "$prefix=/opt" rm -rf $prefix dpkg -i *.deb ls -la $prefix $prefix/bin/ansible-from --version $prefix/bin/aws-ec2-source --version mkdir -p $ARTIFACTS mv *.deb $ARTIFACTS