Skip to content

Instantly share code, notes, and snippets.

@ryandevore
Last active May 14, 2018 18:18
Show Gist options
  • Save ryandevore/35a6756c4db99bb88e36 to your computer and use it in GitHub Desktop.
Save ryandevore/35a6756c4db99bb88e36 to your computer and use it in GitHub Desktop.
A helpful set of bash functions for iOS and Android projects.
#!/bin/sh
# import common helper functions
. common_build_functions.sh
function UUClearCrashlyticsKeyAndSecret
{
if [ $# != 1 ]
then
echo "Usage: UUClearCrashlyticsKeyAndSecret [Android manifest path]"
exit 1
fi
local MANIFEST_PATH=$1
# NOTE: This only works if you put the manifest entry on a single line.
REPLACEMENT_VALUE="INSERT_FABRIC_API_KEY_HERE"
OLD_LINE="(<meta-data android:name=\"io.fabric.ApiKey\" android:value=\")(.+)(\" \/>)"
NEW_LINE="\1${REPLACEMENT_VALUE}\3"
sed -i "" -E "s/${OLD_LINE}/${NEW_LINE}/g" "${MANIFEST_PATH}"
}
function UUExtractGradleBuildSetting
{
if [ $# != 3 ]
then
echo "Usage: UUExtractGradleBuildSetting [Project Path] [VarName] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local VAR_NAME=$2
local OUTPUT_VAR=$3
local RESULT=`cat ${FULL_PATH} | grep -m 1 "${VAR_NAME}" | awk -F"${VAR_NAME}" '{print $2}' | sed 's/^ *//g' | sed 's/ *$//g' | tr -d '"'`
eval $OUTPUT_VAR="'${RESULT}'"
UUCheckReturnCode $? "UUExtractGradleBuildSetting"
}
function UUExtractGradleBuildProperty
{
if [ $# != 3 ]
then
echo "Usage: UUExtractGradleBuildSetting [Project Path] [VarName] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local VAR_NAME=$2
local OUTPUT_VAR=$3
local RESULT=`cat ${FULL_PATH} | grep -m 1 "${VAR_NAME}=" | awk -F"${VAR_NAME}=" '{print $2}' | sed 's/^ *//g' | sed 's/ *$//g' | tr -d '"'`
eval $OUTPUT_VAR="'${RESULT}'"
UUCheckReturnCode $? "UUExtractGradleBuildSetting"
}
function UUMakeAarBuild
{
if [ $# != 3 ]
then
echo "Usage: UUMakeAarBuild [Project Path] [Module] [Output Folder]"
exit 1
fi
local PROJDIR=$1
local MODULE=$2
local OUTPUT_DIR=$3
CWD=$(pwd)
UUDebugLog "Changing current directory to ${PROJDIR}"
cd "${PROJDIR}"
./gradlew clean :${MODULE}:assembleRelease
rm -rf ${OUTPUT_DIR}/${MODULE}.aar
cp ${MODULE}/build/outputs/aar/${MODULE}-release.aar ${OUTPUT_DIR}/${MODULE}.aar
rm -rf ${OUTPUT_DIR}/${MODULE}SymbolMapping.zip
zip -r ${OUTPUT_DIR}/${MODULE}SymbolMapping.zip ${MODULE}/build/outputs/mapping
UUCheckReturnCode $? "UUMakeAarBuild"
}
function UUMakeJavaDocBuild
{
if [ $# != 3 ]
then
echo "Usage: UUMakeJavaDocBuild [Project Path] [Module] [Output Folder]"
exit 1
fi
local PROJDIR=$1
local MODULE=$2
local OUTPUT_DIR=$3
CWD=$(pwd)
UUDebugLog "Changing current directory to ${PROJDIR}"
cd "${PROJDIR}"
./gradlew clean :${MODULE}:javadoc
rm -rf ${OUTPUT_DIR}/${MODULE}Docs.zip
cd ${MODULE}/build/docs/javadoc
zip -r ${OUTPUT_DIR}/${MODULE}Docs.zip *
UUCheckReturnCode $? "UUMakeJavaDocBuild"
}
function UUMakeApkBuild
{
if [ $# != 6 ]
then
echo "Usage: UUMakeApkBuild [Project Path] [Module] [Flavor] [Output Folder] [Fixed Version] [APK Name]"
exit 1
fi
local PROJDIR=$1
local MODULE=$2
local FLAVOR=$3
local OUTPUT_DIR=$4
local BUILD_VERSION=$5
local APK_NAME=$6
local UPLOAD_TO_CRASHLYTICS=0
local HAS_FIXED_VERSION=0
if [ ! -z ${BUILD_VERSION} ]
then
HAS_FIXED_VERSION=1
fi
if [ -z ${APK_NAME} ]
then
APK_NAME="${MODULE}"
fi
CWD=$(pwd)
UUIsGitRepo IS_GIT_REPO
UUIsSvnRepo IS_SVN_REPO
GRADLE_PATH=${PROJDIR}/${MODULE}/build.gradle
GRADLE_PROPERTIES_PATH=${PROJDIR}/gradle.properties
UUExtractGradleBuildSetting "${GRADLE_PATH}" "ext.betaDistributionGroupAliases" CRASHLYTICS_GROUP_ALIAS
if [ ! -z ${CRASHLYTICS_GROUP_ALIAS} ]
then
UPLOAD_TO_CRASHLYTICS=1
fi
UUDebugLog "PROJDIR: ${PROJDIR}"
UUDebugLog "MODULE: ${MODULE}"
UUDebugLog "FLAVOR: ${FLAVOR}"
UUDebugLog "OUTPUT_DIR: ${OUTPUT_DIR}"
UUDebugLog "UPLOAD_TO_CRASHLYTICS: ${UPLOAD_TO_CRASHLYTICS}"
UUDebugLog "CRASHLYTICS_GROUP_ALIAS: ${CRASHLYTICS_GROUP_ALIAS}"
UUDebugLog "BUILD_VERSION: ${BUILD_VERSION}"
UUDebugLog "HAS_FIXED_VERSION: ${HAS_FIXED_VERSION}"
UUDebugLog "IS_GIT_REPO: ${IS_GIT_REPO}"
UUDebugLog "IS_SVN_REPO: ${IS_SVN_REPO}"
VERSION_NAME_VAR=buildVersionName
if [ ${HAS_FIXED_VERSION} == 0 ]
then
UUExtractGradleBuildProperty "${GRADLE_PROPERTIES_PATH}" "${VERSION_NAME_VAR}" CURRENT_VERSION
BUILD_VERSION=${CURRENT_VERSION}
if [ ${IS_GIT_REPO} == 1 ]
then
UUReadGitRevisionNumber GIT_REV_NUMBER
BUILD_VERSION="${CURRENT_VERSION}.${GIT_REV_NUMBER}"
fi
UUDebugLog "CURRENT_VERSION=${CURRENT_VERSION}"
UUDebugLog "GIT_REV_NUMBER=${GIT_REV_NUMBER}"
UUDebugLog "BUILD_VERSION=${BUILD_VERSION}"
fi
UUDebugLog "Changing current directory to ${PROJDIR}"
cd "${PROJDIR}"
if [ ${UPLOAD_TO_CRASHLYTICS} == 1 ]
then
UUDebugLog "Building with Crashlytics Upload"
./gradlew clean :${MODULE}:assemble${FLAVOR}Release -P${VERSION_NAME_VAR}="${BUILD_VERSION}" crashlyticsUploadDistribution${FLAVOR}Release
else
UUDebugLog "Building without Crashlytics Upload"
./gradlew clean :${MODULE}:assemble${FLAVOR}Release -P${VERSION_NAME_VAR}="${BUILD_VERSION}"
fi
UUCheckReturnCode $? "UUMakeApkBuild.gradle compile"
BUILT_APK_NAME=${MODULE}-${FLAVOR}-release.apk
if [ -z ${FLAVOR} ]
then
BUILT_APK_NAME=${MODULE}-release.apk
fi
BUILT_APK_FULL_PATH=${MODULE}/build/outputs/apk/release/${BUILT_APK_NAME}
OUTPUT_APK_NAME=${APK_NAME}-${BUILD_VERSION}.apk
UUDebugLog "BUILT_APK_NAME: ${BUILT_APK_NAME}"
UUDebugLog "BUILT_APK_FULL_PATH: ${BUILT_APK_FULL_PATH}"
UUDebugLog "OUTPUT_APK_NAME: ${OUTPUT_APK_NAME}"
rm -rf ${OUTPUT_DIR}/${OUTPUT_APK_NAME}
UUDebugLog "Copying APK to output folder"
FULL_OUTPUT_APK_PATH="${OUTPUT_DIR}/${OUTPUT_APK_NAME}"
UUDebugLog "FULL_OUTPUT_APK_PATH: ${FULL_OUTPUT_APK_PATH}"
cp ${BUILT_APK_FULL_PATH} ${FULL_OUTPUT_APK_PATH}
OUTPUT_SYMBOL_MAP_NAME=${APK_NAME}-${BUILD_VERSION}-Symbols.zip
rm -rf ${OUTPUT_DIR}/${OUTPUT_SYMBOL_MAP_NAME}
FULL_OUTPUT_SYMBOLS_PATH="${OUTPUT_DIR}/${OUTPUT_SYMBOL_MAP_NAME}"
if [ -d "${FULL_OUTPUT_SYMBOLS_PATH}" ]; then
zip -r ${FULL_OUTPUT_SYMBOLS_PATH} ${MODULE}/build/outputs/mapping
fi
UUCheckReturnCode $? "UUMakeApkBuild"
}
#!/bin/sh
function UUDebugLog
{
LINE=$1
# Uncomment this line to print debug info
echo "${LINE}"
}
function UUCheckReturnCode
{
if [ $1 != 0 ]
then
echo "Return Code check failed for action $2, exiting with error code $1"
exit $1
fi
}
function UURemoveSpaces
{
local INPUT=$1
echo ${INPUT//[[:blank:]]/}
}
function UUTrimWhitespace
{
local INPUT=$1
NO_SPACE="$(echo "${INPUT}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo ${NO_SPACE}
}
function UUIsGitRepo
{
if [ $# != 1 ]
then
echo "Usage: UUIsGitRepo [Output Variable]"
exit 1
fi
local OUTPUT_VAR=$1
eval $OUTPUT_VAR=1
git rev-parse --is-inside-work-tree
if [ $? != 0 ]
then
eval $OUTPUT_VAR=0
fi
}
function UUIsSvnRepo
{
if [ $# != 1 ]
then
echo "Usage: UUIsSvnRepo [Output Variable]"
exit 1
fi
local OUTPUT_VAR=$1
eval $OUTPUT_VAR=1
svn info
if [ $? != 0 ]
then
eval $OUTPUT_VAR=0
fi
}
# This method will replace the last digit in a dotted version string with a fixed number.
# The intention is that the project plist will have either a three or four digit build number
function UUGenerateBuildNumber
{
if [ $# != 3 ]
then
echo "Usage: UUGenerateBuildNumber [Current Version String] [Build Number] [Output Variable]"
exit 1
fi
local CURRENT_VERSION=$1
local BUILD_NUMBER=$2
local OUTPUT_VAR=$3
PARTS=()
IFS='.' read -ra ARR <<< "${CURRENT_VERSION}"
PART_COUNT=0
for i in "${ARR[@]}"; do
COMPONENT=${i}
PARTS+=(${COMPONENT})
let PART_COUNT=PART_COUNT+1
done
let PART_COUNT=PART_COUNT-1
if (( ${PART_COUNT} <= 0 ))
then
echo "UUGenerateBuildNumber expects current version to have at least 1 components"
exit 1
fi
NEW_VERSION=''
for i in `seq 1 ${PART_COUNT}`;
do
let INDEX=i-1
PART=${PARTS[${INDEX}]}
NEW_VERSION+="${PART}."
done
NEW_VERSION+="${BUILD_NUMBER}"
eval $OUTPUT_VAR="'${NEW_VERSION}'"
}
# Slices off the fourth part of a build number if needed
function UUGetShortBuildNumber
{
if [ $# != 2 ]
then
echo "Usage: UUGetShortBuildNumber [Version String] [Output Variable]"
exit 1
fi
local CURRENT_VERSION=$1
local OUTPUT_VAR=$2
PARTS=()
IFS='.' read -ra ARR <<< "${CURRENT_VERSION}"
PART_COUNT=0
for i in "${ARR[@]}"; do
COMPONENT=${i}
PARTS+=(${COMPONENT})
let PART_COUNT=PART_COUNT+1
done
let PART_COUNT=PART_COUNT-1
if (( ${PART_COUNT} <= 3 ))
then
eval $OUTPUT_VAR="'${CURRENT_VERSION}'"
fi
let PERIOD_STOP=PART_COUNT-1
NEW_VERSION=''
for i in `seq 1 ${PART_COUNT}`;
do
let INDEX=i-1
PART=${PARTS[${INDEX}]}
NEW_VERSION+="${PART}"
if [ ${INDEX} -lt ${PERIOD_STOP} ]
then
NEW_VERSION+="."
fi
done
eval $OUTPUT_VAR="'${NEW_VERSION}'"
}
function UUReadGitRevisionNumber
{
if [ $# != 1 ]
then
echo "Usage: UUReadGitRevNumber [Output Variable]"
exit 1
fi
local OUTPUT_VAR=$1
VAR_RESULT=`git rev-list --count HEAD`
eval $OUTPUT_VAR="'${VAR_RESULT}'"
UUCheckReturnCode $? "readGitRevisionNumber"
}
function UURevertGitChanges
{
if [ $# != 1 ]
then
echo "Usage: UURevertGitChanges [Path to File]"
exit 1
fi
local FILE_PATH=$1
echo "Resetting git changes to ${FILE_PATH}"
git checkout HEAD "${FILE_PATH}"
UUCheckReturnCode $? "revert git changes ${FILE_PATH}"
}
function UURevertSvnChanges
{
if [ $# != 1 ]
then
echo "Usage: UURevertSvnChanges [Path to File]"
exit 1
fi
local FILE_PATH=$1
echo "Resetting svn changes to ${FILE_PATH}"
svn revert -R "${FILE_PATH}"
UUCheckReturnCode $? "revert svn changes ${FILE_PATH}"
}
function UURevertChanges
{
if [ $# != 1 ]
then
echo "Usage: UURevertChanges [Path to File]"
exit 1
fi
local FILE_PATH=$1
UUIsGitRepo LOCAL_IS_GIT_REPO
UUIsSvnRepo LOCAL_IS_SVN_REPO
if [ ${LOCAL_IS_GIT_REPO} == 1 ]
then
UURevertGitChanges "${FILE_PATH}"
fi
if [ ${LOCAL_IS_SVN_REPO} == 1 ]
then
UURevertSvnChanges "${FILE_PATH}"
fi
}
function UUDeleteFile
{
if [ $# != 1 ]
then
echo "Usage: UUDeleteFile [Source]"
exit 1
fi
local SOURCE=$1
echo "Deleting ${SOURCE}"
rm -rf "${SOURCE}"
UUCheckReturnCode $? "delete file failed"
}
function UUCopyFile
{
if [ $# != 2 ]
then
echo "Usage: UUCopyFile [Source] [Dest]"
exit 1
fi
local SOURCE=$1
local DEST=$2
# echo "Deleting ${DEST}"
# rm -rf "${DEST}"
UUDebugLog "Copying ${SOURCE} to ${DEST}"
cp -r "${SOURCE}" "${DEST}"
UUCheckReturnCode $? "copy file failed"
}
function UUCreateFolder
{
if [ $# != 1 ]
then
echo "Usage: UUCreateFolder [FolderName]"
exit 1
fi
local FOLDER_NAME=$1
UUDebugLog "Creating folder ${FOLDER_NAME}"
mkdir -p "${FOLDER_NAME}"
UUCheckReturnCode $? "creating folder"
}
function UUExtractFileName
{
if [ $# != 2 ]
then
echo "Usage: UUExtractFileName [Full Path] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local OUTPUT_VAR=$2
local FILE_NAME=$(basename "$FULL_PATH")
eval $OUTPUT_VAR="'${FILE_NAME}'"
UUCheckReturnCode $? "UUExtractFileName"
}
function UUExtractFileNameNoExtension
{
if [ $# != 2 ]
then
echo "Usage: UUExtractFileNameNoExtension [Full Path] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local OUTPUT_VAR=$2
local FILE_WITH_EXTENSION=$(basename "$FULL_PATH")
local FILE_WITHOUT_EXTENSION="${FILE_WITH_EXTENSION%.*}"
eval $OUTPUT_VAR="'${FILE_WITHOUT_EXTENSION}'"
UUCheckReturnCode $? "UUExtractFileNameNoExtension"
}
function UUExtractFileExtension
{
if [ $# != 2 ]
then
echo "Usage: UUExtractFileExtension [Full Path] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local OUTPUT_VAR=$2
local FILE_EXTENSION="${FULL_PATH##*.}"
eval $OUTPUT_VAR="'${FILE_EXTENSION}'"
UUCheckReturnCode $? "UUExtractFileExtension"
}
function UUExtractFolder
{
if [ $# != 2 ]
then
echo "Usage: UUExtractFolder [Full Path] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local OUTPUT_VAR=$2
local DIR=$(dirname "${FULL_PATH}")
eval $OUTPUT_VAR="'${DIR}'"
UUCheckReturnCode $? "UUExtractFolder"
}
function UUFindFolder
{
if [ $# != 3 ]
then
echo "Usage: UUFindFolder [Root Search Path] [VarName] [Output Variable]"
exit 1
fi
local ROOT_SEARCH_PATH=$1
local VAR_NAME=$2
local OUTPUT_VAR=$3
local RESULT=`find "${ROOT_SEARCH_PATH}" -type d -name "${VAR_NAME}" | head -n 1`
eval $OUTPUT_VAR="'${RESULT}'"
UUCheckReturnCode $? "UUFindFolder"
}
function UUZipFolder
{
if [ $# != 2 ]
then
echo "Usage: UUZipFolder [Source] [Dest]"
exit 1
fi
local SOURCE=$1
local DEST=$2
CWD=$(pwd)
cd "${SOURCE}"
cd ..
local FOLDER=$(basename "$SOURCE")
UUDebugLog "CWD: $(pwd)"
UUDebugLog "FOLDER: ${FOLDER}"
zip -r "${DEST}" "${FOLDER}"
UUCheckReturnCode $? "UUZipFolder"
cd "${CWD}"
}
function UUEscapeChars
{
if [ $# != 1 ]
then
echo "Usage: UUEscapeChars [input]"
exit 1
fi
local INPUT=$1
INPUT="${INPUT/\&/\\\&}"
echo ${INPUT}
}
function UUReplaceStringInFile
{
if [ $# != 3 ]
then
echo "Usage: UUReplaceStringInFile [file] [to replace] [replacement]"
exit 1
fi
local FILE=$1
local TO_REPLAC=$2
local REPLACEMENT=$3
sed -i "" -e "s/${TO_REPLAC}/${REPLACEMENT}/g" "${FILE}"
}
#!/bin/sh
# import common helper functions
. common_build_functions.sh
function UUSetupBuildKeychain
{
if [ $# -lt 4 ]
then
echo "Usage: UUSetupBuildKeychain [Keychain Path] [Keychain Password] [Cert Path] [Cert Password] (optional) [Verbose Mode]"
exit 1
fi
local KEYCHAIN_PATH=$1
local KEYCHAIN_PASS=$2
local IMPORT_CERT_PATH=$3
local IMPORT_CERT_PASS=$4
local VERBOSE_MODE=$5
UUDebugLog "Creating temporary build keychain ${KEYCHAIN_PATH}"
security ${VERBOSE_MODE} create-keychain -p ${KEYCHAIN_PASS} ${KEYCHAIN_PATH}
if [ $? == 48 ] # keychain already exists
then
UUDebugLog "Keychain already exists, let's try deleting it"
security ${VERBOSE_MODE} delete-keychain ${KEYCHAIN_PATH}
UUDebugLog "Trying to creating keychain again"
security ${VERBOSE_MODE} create-keychain -p ${KEYCHAIN_PASS} ${KEYCHAIN_PATH}
fi
UUCheckReturnCode $? "createKeychain"
UUDebugLog "Unlocking temporary build keychain ${KEYCHAIN_PATH}"
security ${VERBOSE_MODE} unlock-keychain -p ${KEYCHAIN_PASS} ${KEYCHAIN_PATH}
UUCheckReturnCode $? "unlockKeychain"
UUDebugLog "Importing build certificate into keychain"
security ${VERBOSE_MODE} import ${IMPORT_CERT_PATH} -k ${KEYCHAIN_PATH} -P ${IMPORT_CERT_PASS} -T /usr/bin/codesign -A
UUCheckReturnCode $? "importCertificate"
UUDebugLog "Listing keychain"
security ${VERBOSE_MODE} list-keychain -s ${KEYCHAIN_PATH}
UUCheckReturnCode $? "listKeychain"
UUDebugLog "Setting keychain timeout"
security -v set-keychain-settings -lut 7200 ${KEYCHAIN_PATH}
UUCheckReturnCode $? "setKeychainTimeout"
UUDebugLog "Setting key paritition list ${KEYCHAIN_PATH}"
security ${VERBOSE_MODE} set-key-partition-list -S apple-tool:,apple: -s -k ${KEYCHAIN_PASS} ${KEYCHAIN_PATH}
# Don't check return code here because this is a Sierra only command
# UUCheckReturnCode $? "setKeyPartition List"
}
function UUCleanupBuildKeychain
{
if [ $# -lt 1 ]
then
echo "Usage: UUCleanupBuildKeychain [Keychain Path] (optional) [Verbose Mode]"
exit 1
fi
local KEYCHAIN_PATH=$1
local VERBOSE_MODE=$2
UUDebugLog "Deleting temporary keychain ${KEYCHAIN_PATH}"
security ${VERBOSE_MODE} delete-keychain ${KEYCHAIN_PATH}
UUCheckReturnCode $? "deleteKeychain"
UUDebugLog "Re-listing current user login keychain"
security ${VERBOSE_MODE} list-keychain -s "${HOME}/Library/Keychains/login.keychain"
}
function UUMakeTempKeychain
{
if [ $# -lt 3 ]
then
echo "Usage: UUMakeTempKeychain [path to certificate] [certificate password] [keychain path (out)]"
exit 1
fi
CWD=$(pwd)
local CERT_PATH=$1
local CERT_PASSWORD=$2
local OUTPUT_VAR=$3
KEYCHAIN_NAME=`uuidgen`
KEYCHAIN_PATH=~/Library/Keychains/${KEYCHAIN_NAME}.keychain
KEYCHAIN_PASS=masterpassword
UUDebugLog "KEYCHAIN_NAME: ${KEYCHAIN_NAME}"
UUSetupBuildKeychain ${KEYCHAIN_PATH} ${KEYCHAIN_PASS} ${CERT_PATH} ${CERT_PASSWORD} -v
eval $OUTPUT_VAR="'${KEYCHAIN_PATH}'"
}
function UUReadPlistString
{
if [ $# != 3 ]
then
echo "Usage: UUReadPlistString [Full Path to Plist] [VarName] [Output Variable]"
exit 1
fi
local PLIST_PATH=$1
local VAR_NAME=$2
local OUTPUT_VAR=$3
VAR_RESULT=`/usr/libexec/PlistBuddy -c "Print :${VAR_NAME}" "${PLIST_PATH}"`
eval $OUTPUT_VAR="'${VAR_RESULT}'"
UUCheckReturnCode $? "read ${VAR_NAME}"
}
function UUReadBundleVersion
{
UUReadPlistString "$1" "CFBundleVersion" "$2"
}
function UUReadBundleShortVersionString
{
UUReadPlistString "$1" "CFBundleShortVersionString" "$2"
}
function UUWritePlistString
{
if [ $# != 3 ]
then
echo "Usage: UUWritePlistString [Full Path to Plist] [VarName] [VarValue]"
exit 1
fi
local PLIST_PATH=$1
local VAR_NAME=$2
local VAR_VALUE=$3
`/usr/libexec/PlistBuddy -c "Set :${VAR_NAME} ${VAR_VALUE}" "${PLIST_PATH}"`
UUCheckReturnCode $? "write ${VAR_NAME}"
}
function UUUpdateWatchAppBundleIdentifier
{
if [ $# != 2 ]
then
echo "Usage: UUUpdateWatchAppBunbleIdentifier [Plist Path] [bundle id]"
exit 1
fi
local PLIST_PATH=$1
local BUNDLE_ID=$2
UUDebugLog "PLIST_PATH: ${PLIST_PATH}"
UUDebugLog "BUNDLE_ID: ${BUNDLE_ID}"
`/usr/libexec/PlistBuddy -c "Set :NSExtension:NSExtensionAttributes:WKAppBundleIdentifier ${BUNDLE_ID}" "${PLIST_PATH}"`
UUCheckReturnCode $? "write watch bundle id ${VAR_NAME}"
}
function UUWriteBundleVersion
{
UUWritePlistString "$1" "CFBundleVersion" "$2"
}
function UUWriteBundleShortVersionString
{
UUWritePlistString "$1" "CFBundleShortVersionString" "$2"
}
function UUWriteBundleVersionShort
{
local VERSION=$2
UUGetShortBuildNumber ${VERSION} UPDATED_VERSION
UUDebugLog "VERSION: ${VERSION}, UPDATED_VERSION: ${UPDATED_VERSION}"
UUWritePlistString "$1" "CFBundleShortVersionString" "${UPDATED_VERSION}"
}
function UUWriteBundleIdentifier
{
UUWritePlistString "$1" "CFBundleIdentifier" "$2"
}
function UUWriteBundleDisplayName
{
UUWritePlistString "$1" "CFBundleDisplayName" "$2"
}
function UUGenerateArchive
{
if [ $# != 4 ]
then
echo "Usage: UUGenerateArchive [full project path] [scheme name] [configuration (Release/Debug)] [Archive Output Path]"
exit 1
fi
local PROJECT_PATH=$1
local SCHEME=$2
local CONFIGURATION=$3
local ARCHIVE_OUTPUT_PATH=$4
UUDebugLog "UUGenerateArchive, PROJECT_PATH=${PROJECT_PATH}"
UUDebugLog "UUGenerateArchive, SCHEME=${SCHEME}"
UUDebugLog "UUGenerateArchive, CONFIGURATION=${CONFIGURATION}"
UUDebugLog "UUGenerateArchive, ARCHIVE_OUTPUT_PATH=${ARCHIVE_OUTPUT_PATH}"
BUILD_TYPE="-project"
if [[ ${PROJECT_PATH} == *".xcworkspace" ]]
then
BUILD_TYPE="-workspace"
fi
UUDebugLog "Building Xcode Project"
xcodebuild \
"${BUILD_TYPE}" "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-configuration "${CONFIGURATION}" \
-archivePath "${ARCHIVE_OUTPUT_PATH}" \
clean \
archive
UUCheckReturnCode $? "Xcode Build Failed"
}
function UUGenerateBuild
{
if [ $# != 5 ]
then
echo "Usage: UUGenerateBuild [full project path] [scheme name] [sdk] [configuration (Release/Debug)] [Output Path]"
exit 1
fi
local PROJECT_PATH=$1
local SCHEME=$2
local SDK=$3
local CONFIGURATION=$4
local OUTPUTDIR=$5
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${CONFIGURATION}" "ENABLE_BITCODE" ENABLE_BITCODE
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${CONFIGURATION}" "OTHER_CFLAGS" OTHER_CFLAGS
UUDebugLog "ENABLE_BITCODE: ${ENABLE_BITCODE}"
UUDebugLog "OTHER_CFLAGS: ${OTHER_CFLAGS}"
BUILD_TYPE="-project"
if [[ ${PROJECT_PATH} == *".xcworkspace" ]]
then
BUILD_TYPE="-workspace"
fi
if [[ ${ENABLE_BITCODE} == "YES" ]]
then
UUDebugLog "Bitcode is enabled, force c flags"
OTHER_CFLAGS="${OTHER_CFLAGS} -fembed-bitcode -Qunused-arguments"
fi
if [[ ${SDK} == "iphonesimulator" ]]
then
UUDebugLog "Building Xcode Project for simulator platform"
xcodebuild \
"${BUILD_TYPE}" "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-sdk "${SDK}" \
-configuration "${CONFIGURATION}" \
OTHER_CFLAGS="${OTHER_CFLAGS}" \
CONFIGURATION_BUILD_DIR="${OUTPUTDIR}" \
clean \
build
else
UUDebugLog "Building Xcode Project for iPhone platform"
xcodebuild \
"${BUILD_TYPE}" "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-sdk "${SDK}" \
-configuration "${CONFIGURATION}" \
OTHER_CFLAGS="${OTHER_CFLAGS}" \
CONFIGURATION_BUILD_DIR="${OUTPUTDIR}" \
clean \
build
fi
UUCheckReturnCode $? "Xcode Build Failed"
}
function UUGenerateIpa
{
if [ $# != 4 ]
then
echo "Usage: UUGenerateIpa [archive path] [ipa output path] [team identifer] [export type]"
exit 1
fi
local ARCHIVE_PATH=$1
local IPA_OUTPUT_PATH=$2
local TEAM_IDENTIFIER=$3
local EXPORT_TYPE=$4
EXPORT_PLIST_FILE=/tmp/__${TEAM_IDENTIFIER}__.plist
rm -rf "${EXPORT_PLIST_FILE}"
cat > "${EXPORT_PLIST_FILE}" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>${EXPORT_TYPE}</string>
<key>teamID</key>
<string>${TEAM_IDENTIFIER}</string>
<key>uploadSymbols</key>
<string>false</string>
</dict>
</plist>
EOF
xcodebuild \
-exportArchive \
-archivePath "${ARCHIVE_PATH}" \
-exportOptionsPlist "${EXPORT_PLIST_FILE}" \
-exportPath "${IPA_OUTPUT_PATH}"
rm -rf "${EXPORT_PLIST_FILE}"
UUCheckReturnCode $? "Generate IPA"
}
function UUUploadToCrashlytics
{
if [ $# != 6 ]
then
echo "Usage: UUUploadToCrashlytics [api key] [build secret] [crashlytics path] [email group aliases] [notes path] [ipa path]"
exit 1
fi
local API_KEY=$1
local BUILD_SECRET=$2
local CRASHLYTICS_PATH=$3
local EMAIL_LIST=$4
local NOTES_PATH=$5
local IPA_PATH=$6
local SUBMIT_EXE_PATH=${CRASHLYTICS_PATH}/submit
if [ -f ${SUBMIT_EXE_PATH} ]
then
${SUBMIT_EXE_PATH} \
${API_KEY} ${CRASHLYTICS_BUILD_SECRET} \
-ipaPath "${IPA_PATH}" \
-groupAliases "${EMAIL_LIST}" \
-notesPath "${NOTES_PATH}" \
-notifications YES
UUCheckReturnCode $? "Crashlytics Upload"
else
UUDebugLog "Crashlytics submit exe not found, skipping upload"
fi
}
function UUExtractXcodeBuildSetting
{
if [ $# != 4 ]
then
echo "Usage: UUExtractXcodeBuildSetting [Project Path] [config name] [VarName] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local CONFIG_NAME=$2
local VAR_NAME=$3
local OUTPUT_VAR=$4
BUILD_TYPE="-project"
if [[ ${FULL_PATH} == *".xcworkspace" ]]
then
BUILD_TYPE="-workspace"
fi
local RESULT=$(xcodebuild "${BUILD_TYPE}" "${FULL_PATH}" -configuration "${CONFIG_NAME}" -showBuildSettings | grep -m 1 ${VAR_NAME} | awk -F"=" '/=/ { print $2 }' | sed 's/^ *//g' | sed 's/ *$//g')
eval $OUTPUT_VAR="'${RESULT}'"
UUCheckReturnCode $? "UUExtractXcodeBuildSetting"
}
function UUExtractMobileProvisionValue
{
if [ $# != 3 ]
then
echo "Usage: UUExtractMobileProvisionValue [Provision Path] [VarName] [Output Variable]"
exit 1
fi
local FULL_PATH=$1
local VAR_NAME=$2
local OUTPUT_VAR=$3
local TMP_PLIST_PATH=tmp.plist
local RESULT=`security cms -D -i "${FULL_PATH}" > "${TMP_PLIST_PATH}" && /usr/libexec/PlistBuddy -c "Print ${VAR_NAME}" "${TMP_PLIST_PATH}"`
eval $OUTPUT_VAR="'${RESULT}'"
UUCheckReturnCode $? "UUExtractMobileProvisionValue"
rm -rf "${TMP_PLIST_PATH}"
}
function UUExtractCrashlyticsKeyAndSecret
{
if [ $# != 3 ]
then
echo "Usage: UUExtractCrashlyticsKeyAndSecret [Xcode project path] [API Key output variable] [Build Secret Output Variable]"
exit 1
fi
local PROJECT_PATH=$1
local API_KEY_OUT=$2
local BUILD_SECRET_OUT=$3
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
TMP=`cat "${PBXPROJECT_PATH}" | grep -m 1 "Fabric.framework/run" | awk -F"=" '/=/ { print $2 }'`
UUDebugLog "TMP: ${TMP}"
if [ -z "${TMP}" ]
then
UUDebugLog "Checking Pods style script phase"
TMP=`cat "${PBXPROJECT_PATH}" | grep -m 1 "${PODS_ROOT}/Fabric/run" | awk -F"=" '/=/ { print $2 }'`
UUDebugLog "TMP: ${TMP}"
fi
if [ -z "${TMP}" ]
then
UUDebugLog "Checking old crashlytics style"
TMP=`cat "${PBXPROJECT_PATH}" | grep -m 1 "Crashlytics.framework/run" | awk -F"=" '/=/ { print $2 }'`
UUDebugLog "TMP: ${TMP}"
fi
TMP="${TMP/\"/}"
TMP="${TMP/\";/}"
UUDebugLog "TMP: ${TMP}"
local API_KEY_RESULT=""
local BUILD_SECRET_RESULT=""
INDEX=0
for word in ${TMP}
do
UUDebugLog "WORD: ${word}"
if [ ${INDEX} = 1 ]
then
API_KEY_RESULT=${word}
fi
if [ ${INDEX} = 2 ]
then
BUILD_SECRET_RESULT=${word}
fi
let INDEX=INDEX+1
done
eval $API_KEY_OUT="'${API_KEY_RESULT}'"
UUCheckReturnCode $? "UUFindFolder assign api key result"
eval $BUILD_SECRET_OUT="'${BUILD_SECRET_RESULT}'"
UUCheckReturnCode $? "UUFindFolder assign build secret result"
}
function UUClearCrashlyticsKeyAndSecret
{
if [ $# != 2 ]
then
echo "Usage: UUClearCrashlyticsKeyAndSecret [Xcode project path] [Config Name]"
exit 1
fi
local PROJECT_PATH=$1
local CONFIG_NAME=$2
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
UUExtractCrashlyticsKeyAndSecret "${PROJECT_PATH}" CRASHLYTICS_API_KEY CRASHLYTICS_BUILD_SECRET
UUReplaceStringInFile "${PBXPROJECT_PATH}" "${CRASHLYTICS_API_KEY}" "INSERT_CRASHLYTICS_API_KEY_HERE"
UUReplaceStringInFile "${PBXPROJECT_PATH}" "${CRASHLYTICS_BUILD_SECRET}" "INSERT_CRASHLYTICS_BUILD_SECRET_HERE"
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${CONFIG_NAME}" "INFOPLIST_FILE" INFO_PLIST_FILE
UUReplaceStringInFile "${INFO_PLIST_FILE}" "${CRASHLYTICS_API_KEY}" "INSERT_CRASHLYTICS_API_KEY_HERE"
UUReplaceStringInFile "${INFO_PLIST_FILE}" "${CRASHLYTICS_BUILD_SECRET}" "INSERT_CRASHLYTICS_BUILD_SECRET_HERE"
}
function UUUpdateProvisioningProfile
{
if [ $# != 4 ]
then
echo "Usage: UUUpdateProvisioningProfile [Xcode project path] [profile name full] [profile guid] [profile name]"
exit 1
fi
local PROJECT_PATH=$1
local PROFILE_NAME=$2
local PROFILE_GUID=$3
local PROFILE_SPECIFIER_NAME=$4
UUDebugLog "PROFILE_NAME: ${PROFILE_NAME}"
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
PROFILE_NAME=`UUEscapeChars "${PROFILE_NAME}"`
UUDebugLog "PROFILE_NAME Escaped: ${PROFILE_NAME}"
OLD_PROFILE_LINE="(\"CODE_SIGN_IDENTITY\[.+\]\" = \")(.+)(\";)"
NEW_PROFILE_LINE="\1${PROFILE_NAME}\3"
sed -i "" -E "s/${OLD_PROFILE_LINE}/${NEW_PROFILE_LINE}/g" "${PBXPROJECT_PATH}"
OLD_PROFILE_LINE="(CODE_SIGN_IDENTITY = \")(.+)(\";)"
sed -i "" -E "s/${OLD_PROFILE_LINE}/${NEW_PROFILE_LINE}/g" "${PBXPROJECT_PATH}"
OLD_PROFILE_LINE="PROVISIONING_PROFILE = \"\";"
NEW_PROFILE_LINE="PROVISIONING_PROFILE = \"${PROFILE_GUID}\";"
sed -i "" -e "s/${OLD_PROFILE_LINE}/${NEW_PROFILE_LINE}/g" "${PBXPROJECT_PATH}"
OLD_PROFILE_LINE="PROVISIONING_PROFILE_SPECIFIER = \"\";"
NEW_PROFILE_LINE="PROVISIONING_PROFILE_SPECIFIER = \"${PROFILE_SPECIFIER_NAME}\";"
sed -i "" -e "s/${OLD_PROFILE_LINE}/${NEW_PROFILE_LINE}/g" "${PBXPROJECT_PATH}"
}
function UUUpdateTeamIdentifier
{
if [ $# != 2 ]
then
echo "Usage: UUUpdateTeamIdentifier [Xcode project path] [Team ID]"
exit 1
fi
local PROJECT_PATH=$1
local TEAM_NAME=$2
UUDebugLog "TEAM_NAME: ${TEAM_NAME}"
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
OLD_PROFILE_LINE="(DevelopmentTeam = )(.+)(;)"
NEW_PROFILE_LINE="\1${TEAM_NAME}\3"
UUDebugLog "OLD_PROFILE_LINE: ${OLD_PROFILE_LINE}"
UUDebugLog "NEW_PROFILE_LINE: ${NEW_PROFILE_LINE}"
sed -i "" -E "s/${OLD_PROFILE_LINE}/${NEW_PROFILE_LINE}/g" "${PBXPROJECT_PATH}"
OLD_PROFILE_LINE="(DEVELOPMENT_TEAM = )(.+)(;)"
NEW_PROFILE_LINE="\1${TEAM_NAME}\3"
UUDebugLog "OLD_PROFILE_LINE: ${OLD_PROFILE_LINE}"
UUDebugLog "NEW_PROFILE_LINE: ${NEW_PROFILE_LINE}"
sed -i "" -E "s/${OLD_PROFILE_LINE}/${NEW_PROFILE_LINE}/g" "${PBXPROJECT_PATH}"
}
function UUUpdateProvisioningStyle
{
if [ $# != 1 ]
then
echo "Usage: UUUpdateProvisioningStyle [Xcode project path]"
exit 1
fi
local PROJECT_PATH=$1
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
OLD_LINE="ProvisioningStyle = Automatic;"
NEW_LINE="ProvisioningStyle = Manual;"
sed -i "" -e "s/${OLD_LINE}/${NEW_LINE}/g" "${PBXPROJECT_PATH}"
}
function UUUpdateProductBundleIdentifier
{
if [ $# != 2 ]
then
echo "Usage: UUUpdateProductBundleIdentifier [Xcode project path] [bundle id]"
exit 1
fi
local PROJECT_PATH=$1
local BUNDLE_ID=$2
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
BUNDLE_ID_LINES=`cat "${PBXPROJECT_PATH}" | grep "PRODUCT_BUNDLE_IDENTIFIER"`
#UUDebugLog "BUNDLE_ID_LINES: ${BUNDLE_ID_LINES}"
IFS=$'\n' ARR=(${BUNDLE_ID_LINES})
for i in "${ARR[@]}"; do
#UUDebugLog "LINE: ${i}"
UUUpdateProductBundleIdentifierLine "${PROJECT_PATH}" "${i}" "${BUNDLE_ID}"
done
}
function UUUpdateProductBundleIdentifierLine
{
if [ $# != 3 ]
then
echo "Usage: UUUpdateProductBundleIdentifier [Xcode project path] [old bundle id line] [bundle id]"
exit 1
fi
local PROJECT_PATH=$1
local OLD_BUNDLE_ID_LINE=$2
local BUNDLE_ID=$3
local PBXPROJECT_PATH="${PROJECT_PATH}/project.pbxproj"
ORIGINAL_OLD_BUNDLE_ID_LINE=`UUTrimWhitespace "${OLD_BUNDLE_ID_LINE}"`
declare -a SUFFIX_TO_PRESERVE=("msg" "watchkitapp" "watchkitapp.watchkitextension")
for i in ${SUFFIX_TO_PRESERVE[@]};
do
ENDING=".${i};"
UUDebugLog "Checking ending ${ENDING}"
if [[ "${ORIGINAL_OLD_BUNDLE_ID_LINE}" == *${ENDING} ]]
then
UUDebugLog "Preserving ${ENDING} bundle suffix"
NEW_BUNDLE_ID_LINE="PRODUCT_BUNDLE_IDENTIFIER = ${BUNDLE_ID}.${i};"
UUDebugLog "OLD_BUNDLE_ID_LINE: ${OLD_BUNDLE_ID_LINE}"
UUDebugLog "NEW_BUNDLE_ID_LINE: ${NEW_BUNDLE_ID_LINE}"
sed -i "" -e "s/${OLD_BUNDLE_ID_LINE}/${NEW_BUNDLE_ID_LINE}/g" "${PBXPROJECT_PATH}"
fi
done
NEW_BUNDLE_ID_LINE="PRODUCT_BUNDLE_IDENTIFIER = ${BUNDLE_ID};"
UUDebugLog "OLD_BUNDLE_ID_LINE: ${OLD_BUNDLE_ID_LINE}"
UUDebugLog "NEW_BUNDLE_ID_LINE: ${NEW_BUNDLE_ID_LINE}"
sed -i "" -e "s/${OLD_BUNDLE_ID_LINE}/${NEW_BUNDLE_ID_LINE}/g" "${PBXPROJECT_PATH}"
}
function UUStripSimulatorSlices
{
if [ $# != 1 ]
then
echo "Usage: UUStripSimulatorSlices [Binary Path]"
exit 1
fi
local BINARY_PATH=$1
THIN_PATH="${BINARY_PATH}_thin"
lipo "${BINARY_PATH}" -remove i386 -remove x86_64 -output "${THIN_PATH}"
UUCheckReturnCode $? "UUStripSimulatorSlices lipo remove failed"
rm -rf "${BINARY_PATH}"
UUCheckReturnCode $? "UUStripSimulatorSlices remove fat binary failed"
mv "${THIN_PATH}" "${BINARY_PATH}"
UUCheckReturnCode $? "UUStripSimulatorSlices copy thin binary failed"
}
function UUGetFullPlistPath
{
if [ $# -lt 3 ]
then
echo "Usage: UUGetFullPlistPath [full path to xcode project] [configuration] [output variable] "
exit 1
fi
local PROJECT_PATH=$1
local CONFIGURATION=$2
local OUTPUT_VAR=$3
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${CONFIGURATION}" "PROJECT_DIR" PROJECT_DIR
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${CONFIGURATION}" "INFOPLIST_FILE" INFO_PLIST_FILE
UUDebugLog "UUGetFullPlistPath-PROJECT_DIR: ${PROJECT_DIR}"
UUDebugLog "UUGetFullPlistPath-INFO_PLIST_FILE: ${INFO_PLIST_FILE}"
PLIST_PATH="${PROJECT_DIR}/${INFO_PLIST_FILE}"
if [[ ${INFO_PLIST_FILE} == /* ]]
then
UUDebugLog "UUGetFullPlistPath-INFO_PLIST_FILE is absolute path, don't append project path"
PLIST_PATH="${INFO_PLIST_FILE}"
fi
eval $OUTPUT_VAR="'${PLIST_PATH}'"
}
function UUSetBuildNumber
{
if [ $# -lt 3 ]
then
echo "Usage: UUSetBuildNumber [full path to xcode project] [configuration] [fixed version] "
exit 1
fi
local PROJECT_PATH=$1
local CONFIGURATION=$2
BUILD_VERSION=$3
UUGetFullPlistPath "${PROJECT_PATH}" "${CONFIGURATION}" FULL_PLIST_PATH
UUDebugLog "UUSetBuildNumber-FULL_PLIST_PATH: ${FULL_PLIST_PATH}"
UURevertChanges "${FULL_PLIST_PATH}"
if [ -z ${BUILD_VERSION} ] # Empty version string
then
UUReadBundleShortVersionString "${FULL_PLIST_PATH}" CURRENT_VERSION
BUILD_VERSION=${CURRENT_VERSION}
UUIsGitRepo IS_GIT_REPO
if [ ${IS_GIT_REPO} == 1 ]
then
UUReadGitRevisionNumber GIT_REV_NUMBER
BUILD_VERSION="${CURRENT_VERSION}.${GIT_REV_NUMBER}"
fi
UUDebugLog "UUSetBuildNumber-CURRENT_VERSION=${CURRENT_VERSION}"
UUDebugLog "UUSetBuildNumber-GIT_REV_NUMBER=${GIT_REV_NUMBER}"
UUDebugLog "UUSetBuildNumber-BUILD_VERSION=${BUILD_VERSION}"
else
UUWriteBundleVersionShort "${FULL_PLIST_PATH}" "${BUILD_VERSION}"
fi
UUWriteBundleVersion "${PLIST_PATH}" "${BUILD_VERSION}"
}
function UUMakeArchive
{
if [ $# -lt 6 ]
then
echo "Usage: UUMakeArchive [full path to xcode project] [scheme name] [full path to export plist] [crashlytics group alias] [crashlytics notes path] [output dir] "
exit 1
fi
CWD=$(pwd)
local PROJECT_PATH=$1
local SCHEME_NAME=$2
local EXPORT_PLIST_FILE=$3
local CRASHLYTICS_GROUP_ALIAS=$4
local CRASHLYTICS_NOTES_PATH=$5
local OUTPUT_DIR=$6
CONFIG_NAME="${SCHEME_NAME}"
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${CONFIG_NAME}" "FULL_PRODUCT_NAME" FULL_PRODUCT_NAME
UUDebugLog "FULL_PRODUCT_NAME: ${FULL_PRODUCT_NAME}"
FULL_PRODUCT_NAME_NO_SPACES=`UURemoveSpaces "${FULL_PRODUCT_NAME}"`
PROJECT_NAME_NO_SPACES="${FULL_PRODUCT_NAME_NO_SPACES/.app/}"
OUTPUT_FILE_NAME="${PROJECT_NAME_NO_SPACES}.xcarchive"
OUTPUT_ARCHIVE_PATH="${OUTPUT_DIR}/${OUTPUT_FILE_NAME}"
OUTPUT_ARCHIVE_ZIP_PATH="${PROJECT_NAME_NO_SPACES}_${BUILD_VERSION}_${CONFIG_NAME}.xcarchive.zip"
UUGenerateArchive "${PROJECT_PATH}" "${SCHEME_NAME}" "${CONFIG_NAME}" "${OUTPUT_ARCHIVE_PATH}"
UUMakeIpa "${OUTPUT_ARCHIVE_PATH}" "${EXPORT_PLIST_FILE}" "${OUTPUT_DIR}"
UUZipFolder "${OUTPUT_ARCHIVE_PATH}" "${OUTPUT_ARCHIVE_ZIP_PATH}"
UUDeleteFile "${OUTPUT_ARCHIVE_PATH}"
OUTPUT_IPA_NAME="${PROJECT_NAME_NO_SPACES}_${BUILD_VERSION}_${CONFIG_NAME}.ipa"
mv "${OUTPUT_DIR}/${SCHEME_NAME}.ipa" "${OUTPUT_DIR}/${OUTPUT_IPA_NAME}"
FULL_OUTPUT_IPA_NAME="${OUTPUT_DIR}/${OUTPUT_IPA_NAME}"
UUUploadIpaToCrashlytics "${PROJECT_PATH}" "${FULL_OUTPUT_IPA_NAME}" "${CRASHLYTICS_GROUP_ALIAS}" "${CRASHLYTICS_NOTES_PATH}"
}
function UUMakeIpa
{
if [ $# -lt 3 ]
then
echo "Usage: UUMakeIpa [full path to archive] [full path to export plist] [output dir] "
exit 1
fi
local ARCHIVE_PATH=$1
local EXPORT_PLIST_FILE=$2
local OUTPUT_DIR=$3
xcodebuild \
-exportArchive \
-archivePath "${ARCHIVE_PATH}" \
-exportOptionsPlist "${EXPORT_PLIST_FILE}" \
-exportPath "${OUTPUT_DIR}"
UUCheckReturnCode $? "Make IPA"
}
function UUUploadIpaToCrashlytics
{
if [ $# -lt 4 ]
then
echo "Usage: UUUploadProjectToCrashlytics [full path to xcode project] [full ipa path] [crashlytics group alias] [crashlytics notes path] "
exit 1
fi
local PROJECT_PATH=$1
local IPA_FULL_PATH=$2
local CRASHLYTICS_GROUP_ALIAS=$3
local CRASHLYTICS_NOTES_PATH=$4
if [ ! -z ${CRASHLYTICS_GROUP_ALIAS} ]
then
UUExtractCrashlyticsKeyAndSecret "${PROJECT_PATH}" CRASHLYTICS_API_KEY CRASHLYTICS_BUILD_SECRET
UUFindFolder "../" "Crashlytics.framework" CRASHLYTICS_PATH
COCOAPODS_CRASHLYTICS_PATH=../Pods/Crashlytics
UUDebugLog "COCOAPODS_CRASHLYTICS_PATH=${COCOAPODS_CRASHLYTICS_PATH}"
if [ -d "${COCOAPODS_CRASHLYTICS_PATH}" ]
then
UUDebugLog "Crashlytics folder found under cocoa pods, using fixed path for submit file"
CRASHLYTICS_PATH=${COCOAPODS_CRASHLYTICS_PATH}
fi
UUDebugLog "CRASHLYTICS_PATH: ${CRASHLYTICS_PATH}"
UUDebugLog "CRASHLYTICS_API_KEY: ${CRASHLYTICS_API_KEY}"
UUDebugLog "CRASHLYTICS_BUILD_SECRET: ${CRASHLYTICS_BUILD_SECRET}"
UUDebugLog "CRASHLYTICS_GROUP_ALIAS: ${CRASHLYTICS_GROUP_ALIAS}"
UUDebugLog "CRASHLYTICS_NOTES_PATH: ${CRASHLYTICS_NOTES_PATH}"
UUDebugLog "IPA_FULL_PATH: ${IPA_FULL_PATH}"
if [ ! -z ${CRASHLYTICS_GROUP_ALIAS} ]
then
UUUploadToCrashlytics "${CRASHLYTICS_API_KEY}" "${CRASHLYTICS_BUILD_SECRET}" "${CRASHLYTICS_PATH}" "${CRASHLYTICS_GROUP_ALIAS}" "${CRASHLYTICS_NOTES_PATH}" "${IPA_FULL_PATH}"
fi
fi
}
function UUMakeBuildFixed
{
if [ $# -lt 9 ]
then
echo "Usage: UUMakeBuildFixed [full path to xcode project] [scheme name] [full path to export plist] [cert path] [cert password] [crashlytics group alias] [crashlytics notes path] [fixed version] [output dir] "
exit 1
fi
local PROJECT_PATH=$1
local SCHEME_NAME=$2
local EXPORT_PLIST_FILE=$3
local CERT_PATH=$4
local CERT_PASSWORD=$5
local CRASHLYTICS_GROUP_ALIAS=$6
local CRASHLYTICS_NOTES_PATH=$7
local FIXED_VERSION=$8
local OUTPUT_DIR=$9
TMP_KEYCHAIN_PATH=""
UUExtractFolder "${PROJECT_PATH}" REVERT_FOLDER
UUDebugLog "Revert Folder: ${REVERT_FOLDER}"
trap 'UUCleanupAfterBuild ${TMP_KEYCHAIN_PATH} ${REVERT_FOLDER}' EXIT
UUSetBuildNumber "${PROJECT_PATH}" "${SCHEME_NAME}" "${FIXED_VERSION}"
UUMakeTempKeychain "${CERT_PATH}" "${CERT_PASSWORD}" TMP_KEYCHAIN_PATH
UUMakeArchive "${PROJECT_PATH}" "${SCHEME_NAME}" "${EXPORT_PLIST_FILE}" "${CRASHLYTICS_GROUP_ALIAS}" "${CRASHLYTICS_NOTES_PATH}" "${OUTPUT_DIR}"
}
function UUCleanupAfterBuild
{
UUDebugLog "Doing final cleanup"
KEYCHAIN_PATH=$1
REVERT_PATH=$2
if [ ! -z "${KEYCHAIN_PATH}" ]
then
UUDebugLog "Cleaning up temporary keychain"
UUCleanupBuildKeychain "${KEYCHAIN_PATH}" -v
else
UUDebugLog "No keychain to cleanup"
fi
UUDebugLog "Reverting code, REVERT_PATH: ${REVERT_PATH}"
UURevertChanges "${REVERT_PATH}"
}
function UUInstallProvisioningProfile
{
if [ $# -lt 1 ]
then
echo "Usage: UUInstallProvisioningProfile [full path to profile] "
exit 1
fi
local PROVISION_PROFILE_PATH=$1
PROVISION_PROFILE_LOC=~/Library/MobileDevice/Provisioning\ Profiles/
mkdir -p "${PROVISION_PROFILE_LOC}"
UUCopyFile "${PROVISION_PROFILE_PATH}" "${PROVISION_PROFILE_LOC}"
}
function UUMakeBuild
{
if [ $# -lt 7 ]
then
echo "Usage: UUMakeBuild [full path to xcode project] [scheme name] [path to provisioning profile] [path to certificate] [certificate password] [output dir] [ipa export type] [fixed version] [crashlytics group alias] [crashlytics notes path] "
exit 1
fi
CWD=$(pwd)
local PROJECT_PATH=$1
local SCHEME_NAME=$2
local PROVISION_PROFILE_PATH=$3
local CERT_PATH=$4
local CERT_PASSWORD=$5
local OUTPUT_DIR=$6
local IPA_EXPORT_TYPE=$7
local BUILD_VERSION=$8
local CRASHLYTICS_GROUP_ALIAS=$9
local CRASHLYTICS_NOTES_PATH=${10}
local UPLOAD_TO_CRASHLYTICS=0
if [ ! -z ${CRASHLYTICS_GROUP_ALIAS} ]
then
UPLOAD_TO_CRASHLYTICS=1
fi
local HAS_FIXED_VERSION=0
if [ ! -z ${BUILD_VERSION} ]
then
HAS_FIXED_VERSION=1
fi
UUDebugLog "CRASHLYTICS_GROUP_ALIAS: ${CRASHLYTICS_GROUP_ALIAS}"
UUDebugLog "UPLOAD_TO_CRASHLYTICS: ${UPLOAD_TO_CRASHLYTICS}"
UUDebugLog "BUILD_VERSION: ${BUILD_VERSION}"
UUDebugLog "HAS_FIXED_VERSION: ${HAS_FIXED_VERSION}"
PROVISION_PROFILE_LOC=~/Library/MobileDevice/Provisioning\ Profiles/
ARCHIVE_CONFIGURATION=Release
UUExtractFileName "${PROJECT_PATH}" PROJECT_NAME_WITH_EXTENSION
UUExtractFileNameNoExtension "${PROJECT_PATH}" PROJECT_NAME
UUExtractFileExtension "${PROJECT_PATH}" PROJECT_EXTENSION
UUExtractFolder "${PROJECT_PATH}" PROJECT_FOLDER
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${SCHEME_NAME}" "PROJECT_DIR" PROJECT_DIR
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${SCHEME_NAME}" "PROJECT_FILE_PATH" PROJECT_FILE_PATH
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${SCHEME_NAME}" "INFOPLIST_FILE" INFO_PLIST_FILE
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${SCHEME_NAME}" "FULL_PRODUCT_NAME" FULL_PRODUCT_NAME
UUDebugLog "PROJECT_DIR: ${PROJECT_DIR}"
UUDebugLog "PROJECT_FILE_PATH: ${PROJECT_FILE_PATH}"
UUDebugLog "INFO_PLIST_FILE: ${INFO_PLIST_FILE}"
UUDebugLog "FULL_PRODUCT_NAME: ${FULL_PRODUCT_NAME}"
local PBXPROJECT_PATH="${PROJECT_FILE_PATH}/project.pbxproj"
UUIsGitRepo IS_GIT_REPO
UUIsSvnRepo IS_SVN_REPO
UUDebugLog "IS_GIT_REPO: ${IS_GIT_REPO}"
UUDebugLog "IS_SVN_REPO: ${IS_SVN_REPO}"
FULL_PRODUCT_NAME_NO_SPACES=`UURemoveSpaces "${FULL_PRODUCT_NAME}"`
PLIST_PATH="${PROJECT_DIR}/${INFO_PLIST_FILE}"
if [[ ${INFO_PLIST_FILE} == /* ]]
then
UUDebugLog "INFO_PLIST_FILE is absolute path, don't append project path"
PLIST_PATH="${INFO_PLIST_FILE}"
fi
PROJECT_NAME_NO_SPACES="${FULL_PRODUCT_NAME_NO_SPACES/.app/}"
PROJECT_NAME_NO_SPACES_NO_UNDERSCORES="${PROJECT_NAME_NO_SPACES//_/}"
UUExtractFileName "${PROVISION_PROFILE_PATH}" PROFILE_NAME_WITH_EXTENSION
PROVISION_PROFILE_DEST_PATH="${PROVISION_PROFILE_LOC}${PROFILE_NAME_WITH_EXTENSION}"
UUDebugLog "PROJECT_PATH: ${PROJECT_PATH}"
UUDebugLog "PROJECT_NAME_WITH_EXTENSION: ${PROJECT_NAME_WITH_EXTENSION}"
UUDebugLog "PROJECT_NAME: ${PROJECT_NAME}"
UUDebugLog "PROJECT_EXTENSION: ${PROJECT_EXTENSION}"
UUDebugLog "PROJECT_FOLDER: ${PROJECT_FOLDER}"
UUDebugLog "INFO_PLIST_FILE: ${INFO_PLIST_FILE}"
UUDebugLog "PLIST_PATH: ${PLIST_PATH}"
UUDebugLog "PROJECT_NAME_NO_SPACES: ${PROJECT_NAME_NO_SPACES}"
UUDebugLog "PROJECT_NAME_NO_SPACES_NO_UNDERSCORES: ${PROJECT_NAME_NO_SPACES_NO_UNDERSCORES}"
UUDebugLog "PROFILE_NAME_WITH_EXTENSION: ${PROFILE_NAME_WITH_EXTENSION}"
UUDebugLog "ARCHIVE_CONFIGURATION: ${ARCHIVE_CONFIGURATION}"
if [ ${IS_GIT_REPO} == 1 ]
then
UURevertGitChanges "${PLIST_PATH}"
UURevertGitChanges "${PROJECT_FILE_PATH}"
fi
if [ ${IS_SVN_REPO} == 1 ]
then
UURevertSvnChanges "${PLIST_PATH}"
UURevertSvnChanges "${PBXPROJECT_PATH}"
fi
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "TeamName" TEAM_NAME
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "ApplicationIdentifierPrefix:0" APP_IDENTIFIER_PREFIX
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "TeamIdentifier:0" TEAM_IDENTIFIER
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" ":Entitlements:application-identifier" APP_IDENTIFIER
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "Name" PROVISION_PROFILE_NAME
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "UUID" PROVISION_PROFILE_GUID
CODE_SIGNING_IDENTITY="iPhone Distribution: ${TEAM_NAME}"
UUDebugLog "TEAM_NAME: ${TEAM_NAME}"
UUDebugLog "TEAM_IDENTIFIER: ${TEAM_IDENTIFIER}"
UUDebugLog "APP_IDENTIFIER_PREFIX: ${APP_IDENTIFIER_PREFIX}"
UUDebugLog "APP_IDENTIFIER: ${APP_IDENTIFIER}"
UUDebugLog "PROVISION_PROFILE_NAME: ${PROVISION_PROFILE_NAME}"
UUDebugLog "PROVISION_PROFILE_GUID: ${PROVISION_PROFILE_GUID}"
APP_IDENTIFIER_PREFIX_WITH_DOT="${APP_IDENTIFIER_PREFIX}."
BUNDLE_ID="${APP_IDENTIFIER/${APP_IDENTIFIER_PREFIX_WITH_DOT}/}"
UUDebugLog "BUNDLE_ID: ${BUNDLE_ID}"
if [[ ${BUNDLE_ID} == *"*"* ]]
then
BUNDLE_ID="${BUNDLE_ID/'*'/${PROJECT_NAME_NO_SPACES_NO_UNDERSCORES}}"
fi
UUDebugLog "BUNDLE_ID: ${BUNDLE_ID}"
if [ ${HAS_FIXED_VERSION} == 0 ]
then
UUReadBundleShortVersionString "${PLIST_PATH}" CURRENT_VERSION
BUILD_VERSION=${CURRENT_VERSION}
if [ ${IS_GIT_REPO} == 1 ]
then
UUReadGitRevisionNumber GIT_REV_NUMBER
BUILD_VERSION="${CURRENT_VERSION}.${GIT_REV_NUMBER}"
fi
UUDebugLog "CURRENT_VERSION=${CURRENT_VERSION}"
UUDebugLog "GIT_REV_NUMBER=${GIT_REV_NUMBER}"
UUDebugLog "BUILD_VERSION=${BUILD_VERSION}"
fi
if [ ${HAS_FIXED_VERSION} == 1 ]
then
UUWriteBundleVersionShort "${PLIST_PATH}" "${BUILD_VERSION}"
fi
# do this before mucking with bundle id changes
UUExtractCrashlyticsKeyAndSecret "${PROJECT_FILE_PATH}" CRASHLYTICS_API_KEY CRASHLYTICS_BUILD_SECRET
UUWriteBundleVersion "${PLIST_PATH}" "${BUILD_VERSION}"
#UUWriteBundleIdentifier "${PLIST_PATH}" "${BUNDLE_ID}"
UUUpdateProductBundleIdentifier "${PROJECT_FILE_PATH}" "${BUNDLE_ID}"
UUUpdateProvisioningProfile "${PROJECT_FILE_PATH}" "${CODE_SIGNING_IDENTITY}" "${PROVISION_PROFILE_GUID}" "${PROVISION_PROFILE_NAME}"
UUUpdateTeamIdentifier "${PROJECT_FILE_PATH}" "${TEAM_IDENTIFIER}"
UUUpdateProvisioningStyle "${PROJECT_FILE_PATH}"
if [ ! -z "${UU_WATCH_EXT_PLIST_PATH}" ]
then
UUDebugLog "Updating watch app extension plist"
WATCH_BUNDLE_ID="${BUNDLE_ID}.watchkitapp"
UUDebugLog "UU_WATCH_EXT_PLIST_PATH: ${UU_WATCH_EXT_PLIST_PATH}"
UUDebugLog "WATCH_BUNDLE_ID: ${WATCH_BUNDLE_ID}"
UUUpdateWatchAppBundleIdentifier "${UU_WATCH_EXT_PLIST_PATH}" "${WATCH_BUNDLE_ID}"
fi
if [ ! -z "${UU_WATCH_PLIST}" ]
then
UUDebugLog "Updating watch app plist"
UUWritePlistString "${UU_WATCH_PLIST}" "WKCompanionAppBundleIdentifier" "${BUNDLE_ID}"
fi
KEYCHAIN_NAME=${PROJECT_NAME_NO_SPACES}-${BUILD_VERSION}
KEYCHAIN_PATH=~/Library/Keychains/${KEYCHAIN_NAME}.keychain
KEYCHAIN_PASS=masterpassword
UUDebugLog "KEYCHAIN_NAME: ${KEYCHAIN_NAME}"
UUSetupBuildKeychain ${KEYCHAIN_PATH} ${KEYCHAIN_PASS} ${CERT_PATH} ${CERT_PASSWORD} -v
UUCopyFile "${PROVISION_PROFILE_PATH}" "${PROVISION_PROFILE_DEST_PATH}"
OUTPUT_FILE_NAME="${PROJECT_NAME_NO_SPACES}_${BUILD_VERSION}_${IPA_EXPORT_TYPE}"
OUTPUT_ARCHIVE_PATH="${OUTPUT_DIR}/${OUTPUT_FILE_NAME}.xcarchive.zip"
OUTPUT_ARCHIVE_TEMP_PATH="/tmp/${OUTPUT_FILE_NAME}.xcarchive"
OUTPUT_IPA_PATH="${OUTPUT_DIR}"
OUTPUT_IPA_FULL_PATH="${OUTPUT_DIR}/${OUTPUT_FILE_NAME}.ipa"
UUGenerateArchive "${PROJECT_PATH}" "${SCHEME_NAME}" "${ARCHIVE_CONFIGURATION}" "${OUTPUT_ARCHIVE_TEMP_PATH}"
UUGenerateIpa "${OUTPUT_ARCHIVE_TEMP_PATH}" "${OUTPUT_IPA_PATH}" "${TEAM_IDENTIFIER}" "${IPA_EXPORT_TYPE}"
UUDeleteFile "${OUTPUT_ARCHIVE_PATH}"
UUZipFolder "${OUTPUT_ARCHIVE_TEMP_PATH}" "${OUTPUT_ARCHIVE_PATH}"
UU_IPA_OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_FILE_NAME}.ipa"
UU_IPA_OUTPUT_PATH_NO_VERSION="${UU_IPA_OUTPUT_PATH/${BUILD_VERSION}_/}"
mv "${OUTPUT_DIR}/${SCHEME_NAME}.ipa" "${UU_IPA_OUTPUT_PATH}"
if [ ${UPLOAD_TO_CRASHLYTICS} == 1 ]
then
UUFindFolder "../" "Crashlytics.framework" CRASHLYTICS_PATH
COCOAPODS_CRASHLYTICS_PATH=../Pods/Crashlytics
UUDebugLog "COCOAPODS_CRASHLYTICS_PATH=${COCOAPODS_CRASHLYTICS_PATH}"
if [ -d "${COCOAPODS_CRASHLYTICS_PATH}" ]
then
UUDebugLog "Crashlytics folder found under cocoa pods, using fixed path for submit file"
CRASHLYTICS_PATH=${COCOAPODS_CRASHLYTICS_PATH}
fi
UUDebugLog "CRASHLYTICS_PATH: ${CRASHLYTICS_PATH}"
UUDebugLog "CRASHLYTICS_API_KEY: ${CRASHLYTICS_API_KEY}"
UUDebugLog "CRASHLYTICS_BUILD_SECRET: ${CRASHLYTICS_BUILD_SECRET}"
UUDebugLog "CRASHLYTICS_GROUP_ALIAS: ${CRASHLYTICS_GROUP_ALIAS}"
UUDebugLog "CRASHLYTICS_NOTES_PATH: ${CRASHLYTICS_NOTES_PATH}"
UUDebugLog "OUTPUT_IPA_FULL_PATH: ${OUTPUT_IPA_FULL_PATH}"
UUUploadToCrashlytics "${CRASHLYTICS_API_KEY}" "${CRASHLYTICS_BUILD_SECRET}" "${CRASHLYTICS_PATH}" "${CRASHLYTICS_GROUP_ALIAS}" "${CRASHLYTICS_NOTES_PATH}" "${OUTPUT_IPA_FULL_PATH}"
fi
UUCleanupBuildKeychain "${KEYCHAIN_PATH}" -v
if [ ${IS_GIT_REPO} == 1 ]
then
UURevertGitChanges "${PLIST_PATH}"
UURevertGitChanges "${PROJECT_FILE_PATH}"
fi
if [ ${IS_SVN_REPO} == 1 ]
then
UURevertSvnChanges "${PLIST_PATH}"
UURevertSvnChanges "${PBXPROJECT_PATH}"
fi
UUDeleteFile "${PROVISION_PROFILE_DEST_PATH}"
UUDeleteFile "${OUTPUT_ARCHIVE_TEMP_PATH}"
}
function UUMakeFrameworkBuild
{
if [ $# -lt 7 ]
then
echo "Usage: UUMakeFrameworkBuild [full path to xcode project] [scheme name] [path to provisioning profile] [path to certificate] [certificate password] [output dir] [fixed version] "
exit 1
fi
CWD=$(pwd)
local PROJECT_PATH=$1
local SCHEME_NAME=$2
local PROVISION_PROFILE_PATH=$3
local CERT_PATH=$4
local CERT_PASSWORD=$5
local OUTPUT_DIR=$6
local BUILD_VERSION=$7
local HAS_FIXED_VERSION=0
if [ ! -z ${BUILD_VERSION} ]
then
HAS_FIXED_VERSION=1
fi
UUDebugLog "BUILD_VERSION: ${BUILD_VERSION}"
UUDebugLog "HAS_FIXED_VERSION: ${HAS_FIXED_VERSION}"
PROVISION_PROFILE_LOC=~/Library/MobileDevice/Provisioning\ Profiles/
ARCHIVE_CONFIGURATION=Release
UUExtractFileName "${PROJECT_PATH}" PROJECT_NAME_WITH_EXTENSION
UUExtractFileNameNoExtension "${PROJECT_PATH}" PROJECT_NAME
UUExtractFileExtension "${PROJECT_PATH}" PROJECT_EXTENSION
UUExtractFolder "${PROJECT_PATH}" PROJECT_FOLDER
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${ARCHIVE_CONFIGURATION}" "PROJECT_DIR" PROJECT_DIR
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${ARCHIVE_CONFIGURATION}" "PROJECT_FILE_PATH" PROJECT_FILE_PATH
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${ARCHIVE_CONFIGURATION}" "INFOPLIST_FILE" INFO_PLIST_FILE
UUExtractXcodeBuildSetting "${PROJECT_PATH}" "${ARCHIVE_CONFIGURATION}" "FULL_PRODUCT_NAME" FULL_PRODUCT_NAME
local PBXPROJECT_PATH="${PROJECT_FILE_PATH}/project.pbxproj"
UUIsGitRepo IS_GIT_REPO
UUIsSvnRepo IS_SVN_REPO
UUDebugLog "IS_GIT_REPO: ${IS_GIT_REPO}"
UUDebugLog "IS_SVN_REPO: ${IS_SVN_REPO}"
FULL_PRODUCT_NAME_NO_SPACES=`UURemoveSpaces "${FULL_PRODUCT_NAME}"`
PLIST_PATH="${PROJECT_DIR}/${INFO_PLIST_FILE}"
PROJECT_NAME_NO_SPACES="${FULL_PRODUCT_NAME_NO_SPACES/.app/}"
PROJECT_NAME_NO_SPACES_NO_UNDERSCORES="${PROJECT_NAME_NO_SPACES//_/}"
UUExtractFileName "${PROVISION_PROFILE_PATH}" PROFILE_NAME_WITH_EXTENSION
PROVISION_PROFILE_DEST_PATH="${PROVISION_PROFILE_LOC}${PROFILE_NAME_WITH_EXTENSION}"
UUDebugLog "PROJECT_PATH: ${PROJECT_PATH}"
UUDebugLog "PROJECT_NAME_WITH_EXTENSION: ${PROJECT_NAME_WITH_EXTENSION}"
UUDebugLog "PROJECT_NAME: ${PROJECT_NAME}"
UUDebugLog "PROJECT_EXTENSION: ${PROJECT_EXTENSION}"
UUDebugLog "PROJECT_FOLDER: ${PROJECT_FOLDER}"
UUDebugLog "INFO_PLIST_FILE: ${INFO_PLIST_FILE}"
UUDebugLog "PLIST_PATH: ${PLIST_PATH}"
UUDebugLog "PROJECT_NAME_NO_SPACES: ${PROJECT_NAME_NO_SPACES}"
UUDebugLog "PROJECT_NAME_NO_SPACES_NO_UNDERSCORES: ${PROJECT_NAME_NO_SPACES_NO_UNDERSCORES}"
UUDebugLog "PROFILE_NAME_WITH_EXTENSION: ${PROFILE_NAME_WITH_EXTENSION}"
UUDebugLog "ARCHIVE_CONFIGURATION: ${ARCHIVE_CONFIGURATION}"
if [ ${IS_GIT_REPO} == 1 ]
then
UURevertGitChanges "${PLIST_PATH}"
UURevertGitChanges "${PROJECT_FILE_PATH}"
fi
if [ ${IS_SVN_REPO} == 1 ]
then
UURevertSvnChanges "${PLIST_PATH}"
UURevertSvnChanges "${PBXPROJECT_PATH}"
fi
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "TeamName" TEAM_NAME
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "ApplicationIdentifierPrefix:0" APP_IDENTIFIER_PREFIX
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "TeamIdentifier:0" TEAM_IDENTIFIER
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" ":Entitlements:application-identifier" APP_IDENTIFIER
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "Name" PROVISION_PROFILE_NAME
UUExtractMobileProvisionValue "${PROVISION_PROFILE_PATH}" "UUID" PROVISION_PROFILE_GUID
CODE_SIGNING_IDENTITY="iPhone Distribution: ${TEAM_NAME}"
UUDebugLog "TEAM_NAME: ${TEAM_NAME}"
UUDebugLog "TEAM_IDENTIFIER: ${TEAM_IDENTIFIER}"
UUDebugLog "APP_IDENTIFIER_PREFIX: ${APP_IDENTIFIER_PREFIX}"
UUDebugLog "APP_IDENTIFIER: ${APP_IDENTIFIER}"
UUDebugLog "PROVISION_PROFILE_NAME: ${PROVISION_PROFILE_NAME}"
UUDebugLog "PROVISION_PROFILE_GUID: ${PROVISION_PROFILE_GUID}"
APP_IDENTIFIER_PREFIX_WITH_DOT="${APP_IDENTIFIER_PREFIX}."
BUNDLE_ID="${APP_IDENTIFIER/${APP_IDENTIFIER_PREFIX_WITH_DOT}/}"
UUDebugLog "BUNDLE_ID: ${BUNDLE_ID}"
if [[ ${BUNDLE_ID} == *"*"* ]]
then
BUNDLE_ID="${BUNDLE_ID/'*'/${PROJECT_NAME_NO_SPACES_NO_UNDERSCORES}}"
fi
UUDebugLog "BUNDLE_ID: ${BUNDLE_ID}"
if [ ${HAS_FIXED_VERSION} == 0 ]
then
UUReadBundleShortVersionString "${PLIST_PATH}" CURRENT_VERSION
BUILD_VERSION=${CURRENT_VERSION}
if [ ${IS_GIT_REPO} == 1 ]
then
UUReadGitRevisionNumber GIT_REV_NUMBER
BUILD_VERSION="${CURRENT_VERSION}.${GIT_REV_NUMBER}"
fi
UUDebugLog "CURRENT_VERSION=${CURRENT_VERSION}"
UUDebugLog "GIT_REV_NUMBER=${GIT_REV_NUMBER}"
UUDebugLog "BUILD_VERSION=${BUILD_VERSION}"
fi
if [ ${HAS_FIXED_VERSION} == 1 ]
then
UUWriteBundleVersionShort "${PLIST_PATH}" "${BUILD_VERSION}"
fi
UUWriteBundleVersion "${PLIST_PATH}" "${BUILD_VERSION}"
UUWriteBundleIdentifier "${PLIST_PATH}" "${BUNDLE_ID}"
UUUpdateProductBundleIdentifier "${PROJECT_FILE_PATH}" "${BUNDLE_ID}"
UUUpdateProvisioningProfile "${PROJECT_FILE_PATH}" "${CODE_SIGNING_IDENTITY}" "${PROVISION_PROFILE_GUID}" "${PROVISION_PROFILE_NAME}"
KEYCHAIN_NAME=${PROJECT_NAME_NO_SPACES}-${BUILD_VERSION}
KEYCHAIN_PATH=~/Library/Keychains/${KEYCHAIN_NAME}.keychain
KEYCHAIN_PASS=masterpassword
UUDebugLog "KEYCHAIN_NAME: ${KEYCHAIN_NAME}"
UUSetupBuildKeychain ${KEYCHAIN_PATH} ${KEYCHAIN_PASS} ${CERT_PATH} ${CERT_PASSWORD} -v
UUCopyFile "${PROVISION_PROFILE_PATH}" "${PROVISION_PROFILE_DEST_PATH}"
TMP_OUTPUT_PATH="/tmp/${SCHEME_NAME}-slices"
rm -rf "${TMP_OUTPUT_PATH}"
mkdir "${TMP_OUTPUT_PATH}"
SDK=iphoneos
SLICE_OUTPUT="${TMP_OUTPUT_PATH}/${SDK}"
mkdir "${SLICE_OUTPUT}"
INPUT_A="${SLICE_OUTPUT}/${FULL_PRODUCT_NAME}/${PROJECT_NAME}"
LIB_OUTPUT="${SLICE_OUTPUT}/${FULL_PRODUCT_NAME}"
UUGenerateBuild "${PROJECT_PATH}" "${SCHEME_NAME}" "${SDK}" "${ARCHIVE_CONFIGURATION}" "${SLICE_OUTPUT}"
SDK=iphonesimulator
SLICE_OUTPUT="${TMP_OUTPUT_PATH}/${SDK}"
mkdir "${SLICE_OUTPUT}"
INPUT_B="${SLICE_OUTPUT}/${FULL_PRODUCT_NAME}/${PROJECT_NAME}"
UUGenerateBuild "${PROJECT_PATH}" "${SCHEME_NAME}" "${SDK}" "${ARCHIVE_CONFIGURATION}" "${SLICE_OUTPUT}"
FAT_OUTPUT_FILE="${TMP_OUTPUT_PATH}/${PROJECT_NAME}"
lipo "${INPUT_A}" "${INPUT_B}" -create -output "${FAT_OUTPUT_FILE}"
rm -rf "${INPUT_A}"
cp "${FAT_OUTPUT_FILE}" "${INPUT_A}"
cp -av "${LIB_OUTPUT}" "${OUTPUT_DIR}"
zip -r --exclude=*.DS_Store* --exclude=*.gitignore* ${OUTPUT_DIR}/${PROJECT_NAME}iOS_${BUILD_VERSION}_Symbols.zip ${TMP_OUTPUT_PATH}
rm -rf "${TMP_OUTPUT_PATH}"
UUCleanupBuildKeychain "${KEYCHAIN_PATH}" -v
if [ ${IS_GIT_REPO} == 1 ]
then
UURevertGitChanges "${PLIST_PATH}"
UURevertGitChanges "${PROJECT_FILE_PATH}"
fi
if [ ${IS_SVN_REPO} == 1 ]
then
UURevertSvnChanges "${PLIST_PATH}"
UURevertSvnChanges "${PBXPROJECT_PATH}"
fi
UUDeleteFile "${PROVISION_PROFILE_DEST_PATH}"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment