SwiftGit2/script/cibuild
Tom Booth c3b155cfd4 Switch cibuild to xcodebuild and xcpretty
`xctool` runs the tests as logic only whereas `xcodebuild` and XCode
run them as application tests. When tests are running logic only a lot
of the subsystems that would be available on the simulator are not
there, for example keychain and networking.

https://github.com/facebook/xctool/issues/269
https://github.com/AFNetworking/AFNetworking/pull/1707
https://github.com/facebook/xctool/issues/367
https://github.com/facebook/xctool/issues/553
2016-04-07 14:40:58 +01:00

160 lines
3.5 KiB
Bash
Executable File

#!/bin/bash
export SCRIPT_DIR=$(dirname "$0")
##
## Configuration Variables
##
SCHEMES="$@"
config ()
{
# The workspace to build.
#
# If not set and no workspace is found, the -workspace flag will not be passed
# to `xcodebuild`.
#
# Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will
# take precedence.
: ${XCWORKSPACE=$(find_pattern "*.xcworkspace")}
# The project to build.
#
# If not set and no project is found, the -project flag will not be passed
# to `xcodebuild`.
#
# Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will
# take precedence.
: ${XCODEPROJ=$(find_pattern "*.xcodeproj")}
# A bootstrap script to run before building.
#
# If this file does not exist, it is not considered an error.
: ${BOOTSTRAP="$SCRIPT_DIR/bootstrap"}
# Extra options to pass to xcodebuild.
: ${XCODEBUILD_OPTIONS="RUN_CLANG_STATIC_ANALYZER=NO"}
# A whitespace-separated list of default schemes to build.
#
# Individual names can be quoted to avoid word splitting.
: ${SCHEMES:=$(xcodebuild -list -project "$XCODEPROJ" 2>/dev/null | awk -f "$SCRIPT_DIR/schemes.awk")}
export XCWORKSPACE
export XCODEPROJ
export BOOTSTRAP
export XCODEBUILD_OPTIONS
export SCHEMES
}
##
## Build Process
##
main ()
{
config
if [ -f "$BOOTSTRAP" ]
then
echo "*** Bootstrapping..."
"$BOOTSTRAP" || exit $?
fi
echo "*** Prebuilding OpenSSL"
$SCRIPT_DIR/update_libssl_ios
echo "*** The following schemes will be built:"
echo "$SCHEMES" | xargs -n 1 echo " "
echo
echo "$SCHEMES" | xargs -n 1 | (
local status=0
while read scheme
do
build_scheme "$scheme" || status=1
done
exit $status
)
}
find_pattern ()
{
ls -d $1 2>/dev/null | head -n 1
}
run_xcodebuild ()
{
if [ -n "$XCWORKSPACE" ]
then
xcodebuild -workspace "$XCWORKSPACE" $XCODEBUILD_OPTIONS "$@" \
ONLY_ACTIVE_ARCH=NO \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO 2>&1
elif [ -n "$XCODEPROJ" ]
then
xcodebuild -project "$XCODEPROJ" $XCODEBUILD_OPTIONS "$@" \
ONLY_ACTIVE_ARCH=NO \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO 2>&1
else
echo "*** No workspace or project file found."
exit 1
fi
}
parse_build ()
{
awk -f "$SCRIPT_DIR/xcodebuild.awk" 2>&1 >/dev/null
}
build_scheme ()
{
local scheme=$1
echo "*** Building and testing $scheme..."
echo
local sdkflags=()
local action=test
# Determine whether we can run unit tests for this target.
run_xcodebuild -scheme "$scheme" test | parse_build
local awkstatus=$?
if [ "$awkstatus" -eq "1" ]
then
# SDK not found, try for iphonesimulator.
sdkflags=(-sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 5")
# Determine whether the unit tests will run with iphonesimulator
run_xcodebuild "${sdkflags[@]}" -scheme "$scheme" tests | parse_build
awkstatus=$?
if [ "$awkstatus" -ne "0" ]
then
# Unit tests will not run on iphonesimulator.
sdkflags=()
fi
fi
if [ "$awkstatus" -ne "0" ]
then
# Unit tests aren't supported.
action=build
fi
run_xcodebuild "${sdkflags[@]}" -scheme "$scheme" $action | xcpretty
}
export -f build_scheme
export -f run_xcodebuild
export -f parse_build
main