build.sh #2

  • //
  • guest/
  • perforce_software/
  • p4ruby/
  • main/
  • config/
  • build.sh
  • View
  • Commits
  • Open Download .zip Download (16 KB)
#!/usr/bin/env bash
#
# build.sh
# --------
#
# Script to drive the build and test cycle of p4ruby across several different 
# OSes managed via Salt.
#
# Environment Setup
# -----------------
#
# We assume this script is running on the salt master as a user with nopasswd
# sudo access.
#
# ## Salt Master Setup
#
# The salt master should include:
#
# 1. The 'p4' command line app available on the path
#
# 2. An RVM multi-user installation with the current user referencing a 
# 	 'build' gemset for Ruby 2.0. (This is the lowest version that's supported
# 	 via RVM.)
#
# 3. A Salt file root at /srv/salt that's writeable by the executing user
#
# ## The build instance: node_type: build
#
# There should be a minion with the grain configuration 'node_type: build'. 
# We assume there's only one of these, and it's a Windows 7 machine with 
# the RubyDevKit and Ruby 2.0, 2.1, 2.2 distributions installed for both
# 32 and 64 bit deployments. The setup work of the instance is not yet 
# automated.
#


#-----------------------------------------------------------------------------
# Configuration
#-----------------------------------------------------------------------------

# P4Ruby is branched to follow it's MAJOR.MINOR versions. Except for main,
# which basically should never be released, just tested.
p4ruby_branch=${P4RUBY_BRANCH:main}

# This is overridden by 'rake test' after we've setup the ruby dependencies
p4ruby_version=invalid

# Our internal codeline specifier. This should align with p4ruby, but it's
# an internal specifier that people generally don't see.
p4_branch=r15.1

# The workspace root directory. This should appear like a 'wide open' client
# that maps in our internal Perforce depot repository. This basically includes:
#
#  1. The workshop branch of p4ruby
#  2. p4api.tgz, p4, and p4.exe of our required platforms
#  3. OpenSSL of MinGW-w64 builds for Windows
#
# Our internal CI system doesn't easily allow for me to remap directories, 
# so the directory layout of the working area follows our internal conventions,
# which can appear quite nested.
ws_root=${BUILD_P4CLIENTROOT}

# This is generally set via the EC build environment, and helps us identify
# where the dependent components come from.
codeline=${CODELINE}

p4_bin=${ws_root}/depot/${CODELINE}/p4-bin

p4ruby_dir=${ws_root}/public/guest/perforce_software/p4ruby/$p4ruby_branch

build_gemset=build
build_ruby_version=2.0.0-p643
build_user=perforce
build_wrappers=/home/perforce/.rvm/wrappers/ruby-2.0.0-p643

wrapper_dir=${HOME}/.rvm/wrappers/ruby-${build_ruby_version}@${build_gemset}

# This is the root of the local salt file directory that we copy temporary 
# from this server that get transferred to minions via cp.get_file
#
# Currently for this build this is really just a temp directory which should
# get cleaned out regularly.
salt_file_root=/srv/salt

openssl_root=${ws_root}/3rd_party/cpp_libraries/openssl/1.0.1m

# The salt parameter used to target the 'build' machines
# Right now, since I'm only running this on one machine, I target it via
# the hostname directly. It's much faster than -G 'grain' targeting.
salt_build='p4ruby-crossbuild.das.perforce.com'

salt_test_windows='p4ruby-test-windows7.das.perforce.com'

salt_test_ubuntu12='p4ruby-test-ubuntu12-pkg.das.perforce.com'

salt_test_ubuntu14='p4ruby-test-ubuntu14-rvm.das.perforce.com'

salt_test_centos6='p4ruby-test-centos6-pkg.das.perforce.com'

#-----------------------------------------------------------------------------
# create_p4ruby_tarball
#-----------------------------------------------------------------------------
# One of the first tasks is to generate the p4ruby.zip and p4ruby.tgz archives.
# They are just placed in the salt root here just to make sure 
create_p4ruby_tarball()
{
	cd $p4ruby_dir
	$wrapper_dir/bundle install || false
	$wrapper_dir/rake package || false
	ls pkg

	cp pkg/p4ruby.tgz $salt_file_root
	cp pkg/p4ruby.zip $salt_file_root
}

#-----------------------------------------------------------------------------
# set_p4ruby_version
#-----------------------------------------------------------------------------
# Update the p4ruby version string based on what's set in ruby. Depends upon
# create_p4ruby_tarball having been run, and already setup our Ruby dependencies
set_p4ruby_version()
{
    cd $p4ruby_dir
    p4ruby_version=`$wrapper_dir/rake version`
}

#-----------------------------------------------------------------------------
# prepare_build
#-----------------------------------------------------------------------------
# Transfer dependencies and the source tree to the crosscompile machine
prepare_build()
{
	# salt-cp doesn't copy binary files on windows
	# https://github.com/saltstack/salt/issues/23566
	# sudo salt-cp $salt_build $salt_file_root/p4ruby.zip C:\\Builds\\p4ruby.zip
	sudo salt $salt_build cp.get_file salt://p4ruby.tgz /var/tmp/p4ruby.tgz
	
	# I get a strange 'NoneType is not an object' error
	#sudo salt $salt_build archive.tar xzvf /var/tmp/p4ruby.tgz
	sudo salt $salt_build cmd.run 'tar xzv -C /var/tmp -f /var/tmp/p4ruby.tgz' runas=$build_user

	mkdir -p $salt_file_root/openssl/mingw64x64
	cp -r $openssl_root/artifacts/inc.mingw64x64 $salt_file_root/openssl/mingw64x64
	cp -r $openssl_root/artifacts/lib.mingw64x64 $salt_file_root/openssl/mingw64x64

	mkdir -p $salt_file_root/openssl/mingw64x86
	cp -r $openssl_root/artifacts/inc.mingw64x86 $salt_file_root/openssl/mingw64x86
	cp -r $openssl_root/artifacts/lib.mingw64x86 $salt_file_root/openssl/mingw64x86

	# salt-cp doesn't copy binary files on windows
	# https://github.com/saltstack/salt/issues/23566
	#sudo salt-cp $salt_build $salt_file_root/openssl C:\\Builds\\openssl
	sudo salt $salt_build cp.get_dir salt://openssl /var/tmp

	mkdir -p $salt_file_root/depot/$codeline/p4-bin
	cp -r $p4_bin/bin.mingw64x64 $salt_file_root/depot/$codeline/p4-bin
	cp -r $p4_bin/bin.mingw64x86 $salt_file_root/depot/$codeline/p4-bin
	cp -r $p4_bin/bin.ntx64 $salt_file_root/depot/$codeline/p4-bin

	sudo salt $salt_build cp.get_dir salt://depot /var/tmp

	# Unpack p4api archives
	sudo salt $salt_build archive.unzip /var/tmp/depot/$codeline/p4-bin/bin.mingw64x64/p4api.zip /var/tmp/depot/$codeline/p4-bin/bin.mingw64x64
	sudo salt $salt_build archive.unzip /var/tmp/depot/$codeline/p4-bin/bin.mingw64x86/p4api.zip /var/tmp/depot/$codeline/p4-bin/bin.mingw64x86
}

#-----------------------------------------------------------------------------
# run_build
#-----------------------------------------------------------------------------
run_build()
{
	sudo salt $salt_build cmd.run "/bin/bash -c 'P4RUBY_CROSS_PLATFORM=x64-mingw32 p4api_dir=`echo /var/tmp/depot/$codeline/p4-bin/bin.mingw64x64/p4api-${p4ruby_branch}.*` ssl_include_dir=/var/tmp/openssl/mingw64x64/inc.mingw64x64 ssl_lib_dir=/var/tmp/openssl/mingw64x64/lib.mingw64x64 $build_wrappers/rake cross compile RUBY_CC_VERSION=2.0.0:2.1.5:2.2.2'" runas=$build_user cwd=/var/tmp/p4ruby

    sudo salt $salt_build cmd.run "/bin/bash -c 'P4RUBY_CROSS_PLATFORM=x86-mingw32 p4api_dir=`echo /var/tmp/depot/$codeline/p4-bin/bin.mingw64x86/p4api-${p4ruby_branch}.*` ssl_include_dir=/var/tmp/openssl/mingw64x86/inc.mingw64x86 ssl_lib_dir=/var/tmp/openssl/mingw64x86/lib.mingw64x86 $build_wrappers/rake cross compile RUBY_CC_VERSION=2.0.0:2.1.5:2.2.2'" runas=$build_user cwd=/var/tmp/p4ruby

	sudo salt $salt_build cmd.run "/bin/bash -c 'P4RUBY_CROSS_PLATFORM=x64-mingw32 p4api_dir=`echo /var/tmp/depot/$codeline/p4-bin/bin.mingw64x64/p4api-${p4ruby_branch}.*` ssl_include_dir=/var/tmp/openssl/mingw64x64/inc.mingw64x64 ssl_lib_dir=/var/tmp/openssl/mingw64x64/lib.mingw64x64 $build_wrappers/rake cross native gem RUBY_CC_VERSION=2.0.0:2.1.5:2.2.2'" runas=$build_user cwd=/var/tmp/p4ruby

    sudo salt $salt_build cmd.run "/bin/bash -c 'P4RUBY_CROSS_PLATFORM=x86-mingw32 p4api_dir=`echo /var/tmp/depot/$codeline/p4-bin/bin.mingw64x86/p4api-${p4ruby_branch}.*` ssl_include_dir=/var/tmp/openssl/mingw64x86/inc.mingw64x86 ssl_lib_dir=/var/tmp/openssl/mingw64x86/lib.mingw64x86 $build_wrappers/rake cross native gem RUBY_CC_VERSION=2.0.0:2.1.5:2.2.2'" runas=$build_user cwd=/var/tmp/p4ruby

	# Push gems back to the host
	sudo salt $salt_build cp.push /var/tmp/p4ruby/pkg/p4ruby-${p4ruby_version}.gem
	sudo salt $salt_build cp.push /var/tmp/p4ruby/pkg/p4ruby-${p4ruby_version}-x64-mingw32.gem
	sudo salt $salt_build cp.push /var/tmp/p4ruby/pkg/p4ruby-${p4ruby_version}-x86-mingw32.gem

	# Copy the gems into our salt root
	cp /var/cache/salt/master/minions/p4ruby-crossbuild.das.perforce.com/files/var/tmp/p4ruby/pkg/*.gem $salt_file_root
}

#-----------------------------------------------------------------------------
# test_windows
#-----------------------------------------------------------------------------
# Test both 32- and 64- bit gems out on p4ruby-test-windows7.das.perforce.com
# This requires the p4d.exe NT build, and SSL, which should be prepared
# in Salt by prepare_build()
test_windows()
{
    sudo salt $salt_test_windows file.mkdir C:\\test || false

    # Note that windows *does not* use the source gem.
    sudo salt $salt_test_windows cp.get_file salt://p4ruby-${p4ruby_version}-x64-mingw32.gem C:\\test\\p4ruby-${p4ruby_version}-x64-mingw32.gem
    sudo salt $salt_test_windows cp.get_file salt://p4ruby-${p4ruby_version}-x86-mingw32.gem C:\\test\\p4ruby-${p4ruby_version}-x86-mingw32.gem

    sudo salt $salt_test_windows cp.get_file salt://depot/$codeline/p4-bin/bin.ntx64/p4d.exe C:\\test\\p4d.exe

    cp $p4ruby_dir/config/install_windows.bat $salt_file_root
    cp $p4ruby_dir/config/test_windows.bat $salt_file_root
    cp $p4ruby_dir/config/uninstall_windows.bat $salt_file_root

    # The source distribution should only be needed for executing tests.
    sudo salt $salt_test_windows cp.get_file salt://p4ruby.zip C:\\test\\p4ruby.zip || false
    sudo salt $salt_test_windows archive.unzip C:\\test\\p4ruby.zip C:\\test || false

    sudo salt $salt_test_windows cmd.script salt://install_windows.bat template=jinja context="{\"ruby_version\":\"Ruby200\", \"gem_file\":\"p4ruby-${p4ruby_version}-x86-mingw32.gem\"}"
    sudo salt $salt_test_windows cmd.script salt://test_windows.bat template=jinja context="{\"ruby_version\":\"Ruby200\"}"
    sudo salt $salt_test_windows cmd.script salt://uninstall_windows.bat template=jinja context="{\"ruby_version\":\"Ruby200\"}"

    sudo salt $salt_test_windows cmd.script salt://install_windows.bat template=jinja context="{\"ruby_version\":\"Ruby21\", \"gem_file\":\"p4ruby-${p4ruby_version}-x86-mingw32.gem\"}"
    sudo salt $salt_test_windows cmd.script salt://test_windows.bat template=jinja context="{\"ruby_version\":\"Ruby21\"}"
    sudo salt $salt_test_windows cmd.script salt://uninstall_windows.bat template=jinja context="{\"ruby_version\":\"Ruby21\"}"

    sudo salt $salt_test_windows cmd.script salt://install_windows.bat template=jinja context="{\"ruby_version\":\"Ruby22\", \"gem_file\":\"p4ruby-${p4ruby_version}-x86-mingw32.gem\"}"
    sudo salt $salt_test_windows cmd.script salt://test_windows.bat template=jinja context="{\"ruby_version\":\"Ruby22\"}"
    sudo salt $salt_test_windows cmd.script salt://uninstall_windows.bat template=jinja context="{\"ruby_version\":\"Ruby22\"}"

    sudo salt $salt_test_windows cmd.script salt://install_windows.bat template=jinja context="{\"ruby_version\":\"Ruby200-x64\", \"gem_file\":\"p4ruby-${p4ruby_version}-x64-mingw32.gem\"}"
    sudo salt $salt_test_windows cmd.script salt://test_windows.bat template=jinja context="{\"ruby_version\":\"Ruby200-x64\"}"
    sudo salt $salt_test_windows cmd.script salt://uninstall_windows.bat template=jinja context="{\"ruby_version\":\"Ruby200-x64\"}"

    sudo salt $salt_test_windows cmd.script salt://install_windows.bat template=jinja context="{\"ruby_version\":\"Ruby21-x64\", \"gem_file\":\"p4ruby-${p4ruby_version}-x64-mingw32.gem\"}"
    sudo salt $salt_test_windows cmd.script salt://test_windows.bat template=jinja context="{\"ruby_version\":\"Ruby21-x64\"}"
    sudo salt $salt_test_windows cmd.script salt://uninstall_windows.bat template=jinja context="{\"ruby_version\":\"Ruby21-x64\"}"

    sudo salt $salt_test_windows cmd.script salt://install_windows.bat template=jinja context="{\"ruby_version\":\"Ruby22-x64\", \"gem_file\":\"p4ruby-${p4ruby_version}-x64-mingw32.gem\"}"
    sudo salt $salt_test_windows cmd.script salt://test_windows.bat template=jinja context="{\"ruby_version\":\"Ruby22-x64\"}"
    sudo salt $salt_test_windows cmd.script salt://uninstall_windows.bat template=jinja context="{\"ruby_version\":\"Ruby22-x64\"}"

    sudo salt $salt_test_windows cmd.run 'RMDIR C:\\test /S /Q'
}

#-----------------------------------------------------------------------------
# test_ubuntu12_system19
#-----------------------------------------------------------------------------
# This test will run against the Ubuntu 1.9 system installer, but downloading
# the p4api from ftp.perforce.com
#
# Note 1: bundler and rake should be installed.
#
# Note 2: The rubygems package supported by Debian is very old, so we have to
#         work around the fact that the rake-compiler package can't be installed
test_ubuntu12_system19()
{
    sudo salt $salt_test_ubuntu12 cp.get_file salt://p4ruby-${p4ruby_version}.gem /var/tmp/p4ruby-${p4ruby_version}.gem

    cp $ws_root/depot/$codeline/p4-bin/bin.linux26x86_64/p4d $salt_file_root
    sudo salt $salt_test_ubuntu12 cp.get_file salt://p4d /var/tmp/p4d
    sudo salt $salt_test_ubuntu12 cmd.run 'chmod +x /var/tmp/p4d'

    sudo salt $salt_test_ubuntu12 cmd.run "gem install /var/tmp/p4ruby-${p4ruby_version}.gem"

    sudo salt $salt_test_ubuntu12 cp.get_file salt://p4ruby.tgz /var/tmp/p4ruby.tgz
    sudo salt $salt_test_ubuntu12 cmd.run "tar xzv -C /var/tmp -f /var/tmp/p4ruby.tgz"

    sudo salt $salt_test_ubuntu12 cmd.run "bundle install --without=development" cwd=/var/tmp/p4ruby
    sudo salt $salt_test_ubuntu12 cmd.run "bash -c 'P4D_BIN=/var/tmp/p4d rake test'" cwd=/var/tmp/p4ruby

    sudo salt $salt_test_ubuntu12 cmd.run "gem uninstall p4ruby"

    sudo salt $salt_test_ubuntu12 cmd.run "rm -rf /var/tmp/*"
}

#-----------------------------------------------------------------------------
# test_centos6_system19
#-----------------------------------------------------------------------------
# This comes from the "Software Collections Library", hence, we have to
# prefix our commands with 'scl enable ruby193'
test_centos6_system19()
{
    sudo salt $salt_test_centos6 cp.get_file salt://p4ruby-${p4ruby_version}.gem /var/tmp/p4ruby-${p4ruby_version}.gem

    cp $ws_root/depot/$codeline/p4-bin/bin.linux26x86_64/p4d $salt_file_root
    sudo salt $salt_test_centos6 cp.get_file salt://p4d /var/tmp/p4d
    sudo salt $salt_test_centos6 cmd.run 'chmod +x /var/tmp/p4d'

    sudo salt $salt_test_centos6 cmd.run "scl enable ruby193 \"gem install /var/tmp/p4ruby-${p4ruby_version}.gem\""

    sudo salt $salt_test_centos6 cp.get_file salt://p4ruby.tgz /var/tmp/p4ruby.tgz
    sudo salt $salt_test_centos6 cmd.run "tar xzv -C /var/tmp -f /var/tmp/p4ruby.tgz"

    sudo salt $salt_test_centos6 cmd.run "scl enable ruby193 \"bundle install --without=development\"" cwd=/var/tmp/p4ruby
    sudo salt $salt_test_centos6 cmd.run "bash -c 'export P4D_BIN=/var/tmp/p4d; scl enable ruby193 \"rake test\"'" cwd=/var/tmp/p4ruby

    sudo salt $salt_test_centos6 cmd.run "scl enable ruby193 \"gem uninstall p4ruby\""

    sudo salt $salt_test_centos6 cmd.run "rm -rf /var/tmp/*"
}

#-----------------------------------------------------------------------------
# prepare_distribution
#-----------------------------------------------------------------------------
# Make sure that output files are made available at the root of the workspace
# which will not be deleted
prepare_distribution()
{
    cd $ws_root

    mkdir p4-bin/bin.tools

    cp $salt_file_root/*.gem p4-bin/bin.tools
    cp $salt_file_root/p4ruby.tgz p4-bin/bin.tools
    cp $salt_file_root/p4ruby.zip p4-bin/bin.tools
}

#-----------------------------------------------------------------------------
# clean_build
#-----------------------------------------------------------------------------
clean_build()
{	
	sudo salt $salt_build cmd.run 'rm -rf /var/tmp/*'
}

#-----------------------------------------------------------------------------
# clean_salt_file_root
#-----------------------------------------------------------------------------
clean_salt_file_root()
{
	sudo rm -rf $salt_file_root/*
}


#-----------------------------------------------------------------------------
# Main Script
#-----------------------------------------------------------------------------

set -ex

create_p4ruby_tarball
set_p4ruby_version

prepare_build

run_build

test_windows
test_ubuntu12_system19
test_centos6_system19

prepare_distribution

clean_build
clean_salt_file_root
# Change User Description Committed
#2 14721 tjuricek Updating to the 2015.1 branch of the workshop code, just to avoid the different spec map and version string
#1 14719 tjuricek Mirroring the current state of the workshop.

From this point, we will try to rebuild the history of p4-ruby in the workshop from this codeline.