jenkins配置
**3种打包构建
app-debug:
开发证书,dev配置文件,脚本中Configuration设置为Debug
app-adhoc
生产证书,Adhoc配置文件,脚本中Configuration设置为Adhoc
app-release
生产证书,Appstore配置文件,脚本中Configuration设置为Release
**流程
-->jenkins选对相应构建进行打包
-->打包完成后,发送至蒲公英。获取二维码,链接。
-->打包完成后,将ipa,dysm文件存储在私有服务器,获取对应的链接。
-->钉钉群通知。包含的信息:包名,版本号,构建号,分支名,构建环境, 蒲公英二维码,蒲公英ipa安装链接,ipa文件下载链接,dysm文件下载链接。
Configurations
三种环境配置
Debug:
1,打development包(开发证书,jkdj_dev配置文件)。
2,工程内通过#if DEBUG进行判断,
3,可在该环境下测试某些需开发证书的情况,比如开发证书推送的测试。
4,该环境下加入debug面板(目前的私有JKDJ_DebugKit库),可进行API环境切换,性能调试等
Adhoc:
1,打adhoc包(生产证书,jkdj_Adhoc配置文件)
2,工程内通过#if ADHOC进行判断,
3,可在该环境下测试某些需生产证书的情况,比如生产证书推送的测试。
4,该环境下加入debug面板(目前的私有JKDJ_DebugKit库),可进行API环境切换,性能调试等
5,该环境也可作为日常测试包
Release:
1,打Appstore包(生产证书,jkdj_Appstore配置文件)。
2,该环境不再导入debug面板,API环境固定为生产环境
3,仅供appstore
API配置
API_Dev:开发环境API
API_Test:测试环境API
API_Pre:预先发环境API
API_Dis:生产环境API
GCC_PREPROCESSOR_DEFINITIONS='$$(inherited) $(ApiEnvironment) '
工程配置
1、在Project中新增一种环境配置Adhoc
2、在Target- HealthManager的build Setting目录下配置该环境下预定义宏ADHOC=1
3,podfile导入debug私有库,仅仅在Debug,Adhoc环境
pod 'JKDJ_DebugKit', '2.0', :configurations => ['Debug','Adhoc'] #复星健康debug面板(包含环境切换,性能调试能)Plain Text
4,宏判断,例
debug面板
#if (defined(DEBUG) || defined(ADHOC))
[[JKDebugManager shareManager] show];
#else
#endif
api环境
- (NSString *)hostUrl{
#if (defined(DEBUG) || defined(ADHOC))
{
#ifdef API_Dev
return API_Dev_URL; //开发环境
#endif
#ifdef API_Test
return API_Test_URL; //测试环境
#endif
#ifdef API_Pre
return API_Uat_URL; //预发环境
#endif
#ifdef API_Dis
return API_Distribute_URL; //生产环境
#endif
NSUserDefaults * def = [NSUserDefaults standardUserDefaults];
NSString * host = [def objectForKey:NSUserDefault_HostUrl];
if ([NSString isEmpty:host]) {
return API_Distribute_URL; //生产环境
}else if ([host rangeOfString:@"api.health2m"].location != NSNotFound) {
return API_Distribute_URL;
} else{
return host;
}
}
#else
{
return API_Distribute_URL; //生产环境
}
#endif
}
自动化打包脚本 (目前使用)
#复星健康自动化打包脚本
#参数 ARCHIVE_TYPE
#{
# DEVELOPMENT->开发包
# ADHOC->Adhoc包,日常包
# APPSTORE->删除appstore的包
#}
#
#实例 bash JKAutoBuild.sh DEVELOPMENT
function auto() { #构建包
#打包类型
ARCHIVE_TYPE=$1
#编译模式
BUILD_TYPE="Debug"
EXPORT_TYPE="Develop"
if [[ $ARCHIVE_TYPE == "DEVELOPMENT" ]]; then
BUILD_TYPE="Debug"
EXPORT_TYPE="Develop"
elif [[ $ARCHIVE_TYPE == "ADHOC" ]]; then
BUILD_TYPE="Release"
EXPORT_TYPE="Adhoc"
elif [[ $ARCHIVE_TYPE == "APPSTORE" ]]; then
BUILD_TYPE="Release"
EXPORT_TYPE="AppStore"
else
echo "defult"
fi
# 工程名
APP_NAME="HealthManager"
# workspace名
WORK_SPACE="HealthManager.xcworkspace"
#包名(Package)
BUNDLEID==`xcodebuild -showBuildSettings | grep PRODUCT_BUNDLE_IDENTIFIER | tr -d 'PRODUCT_BUNDLE_IDENTIFIER ='`
#info.plist路径
project_infoplist_path="./${APP_NAME}/Info.plist"
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
#取build值
bundleVersion=`xcodebuild -showBuildSettings | grep CURRENT_PROJECT_VERSION | tr -d 'CURRENT_PROJECT_VERSION ='`
#时间
DATE="$(date +%Y%m%d)"
# IPA路径
IPAPATH="${APP_NAME}_${BUILD_TYPE}_V${bundleShortVersion}_B${bundleVersion}_${DATE}"
# xcarchive
XCARCHIVE="${APP_NAME}_${BUILD_TYPE}_V${bundleShortVersion}_B${bundleVersion}_${DATE}.xcarchive"
#IPA输入路径
IPAPATHOUT="./build/${IPAPATH}/${APP_NAME}.ipa"
#dYSM文件目录
dYSMPATHOUT="./build/${XCARCHIVE}/dSYMs/${APP_NAME}.app.dSYM"
#上传appstore
##账号
parameter_username=""
#独立密码
parameter_password=""
# 开始计时
SECONDS=0
echo "\n\n\033[32m -----------------------Xcode打包-----------------------\033[0m\n\n\n"
# 清理
echo "\n\n\033[32m +++++++++++++++++清理中+++++++++++++++++\033[0m\n\n\n"
xcodebuild -workspace "${WORK_SPACE}" -scheme "${APP_NAME}" -configuration "${BUILD_TYPE}" clean
# 编译
echo "\n\n\033[32m +++++++++++++++++编译中+++++++++++++++++\033[0m\n\n\n"
xcodebuild -workspace "${WORK_SPACE}" -sdk iphoneos -scheme "${APP_NAME}" -archivePath "./build/${XCARCHIVE}" -configuration "${BUILD_TYPE}" archive
# 打包
echo "\n\n\033[32m +++++++++++++++++打包中++++++++++++++++++\033[0m\n\n\n"
xcodebuild -exportArchive -archivePath "./build/${XCARCHIVE}" -exportPath "./build/${IPAPATH}" -exportOptionsPlist "./ExportOptionsPlist/${EXPORT_TYPE}ExportOptionsPlist.plist" -allowProvisioningUpdates
# 验证
if [ -f ${IPAPATHOUT} ] ; then
echo "\n\n\033[32m +++++++++++++++++打包成功,用时 ${SECONDS}s ++++++++++++++++++\033[0m\n\n\n"
else
echo "\n\n\033[32m +++++++++++++++++打包失败++++++++++++++++++\033[0m\n\n\n"
fi
echo "\n\n\033[32m -----------------------上传到蒲公英-----------------------\033[0m\n\n\n"
#蒲公英上的user Key
uKey="4371fb11c6bbccb4c613ae93ded1fef0"
#蒲公英上的API Key
apiKey="789438bcbd5da6f7b5620f0ed143e72f"
#蒲公英版本更新描述,这里取git最后一条提交记录作为描述
MSG=`git log -1 --pretty=%B`
#要上传的ipa文件路径
echo $IPAPATHOUT
# 执行上传至蒲公英的命令
echo "++++++++++++++upload+++++++++++++"
curl -F "file=@${IPAPATHOUT}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "buildUpdateDescription=${MSG}" http://www.pgyer.com/apiv2/app/upload > uploadResponse.json
#cat uploadResponse.json
echo
echo "++++++++++++++提取上传响应信息+++++++++++++"
uploadResult=`cat $WORKSPACE/uploadResponse.json`
url1=`echo "${uploadResult##*"buildQRCodeURL"}"`
urlLength=`expr ${#url1} - 6`
url2=`echo ${url1:3:$urlLength}`
buildQRCodeURL=`echo $url2 | sed 's:\\\/:\/:g'`
if [ ! $buildQRCodeURL ]; then
echo "~~~~~~~~~~~~~~~~~~~上传失败~~~~~~~~~~~~~~~~~~~"
else
echo "~~~~~~~~~~~~~~~~~~~上传成功~~~~~~~~~~~~~~~~~~~"
echo "构建版本:${bundleShortVersion}"
echo "二维码链接:${buildQRCodeURL}"
fi
echo "buildQRCodeURL=${buildQRCodeURL}\r\nbuildVersion=${bundleShortVersion}">> uploadResult.txt
echo "\n\n\033[32m -----------------------上传钉钉群通知-----------------------\033[0m\n\n\n"
curl 'https://oapi.dingtalk.com/robot/send?access_token=48c80fea344d28d6a4c5d2965013a1dd3f54976d01ee39951f39c9b68a4d6f3c' \
-H 'Content-Type: application/json' \
-d "{'msgtype':'markdown','markdown':{'title':'复星健康iOS端','text':'### 复星健康iOS端 \n * 构建分支 => ${Branch_Tag} \n * 构建环境 => ADHOC \n ![screenshot](${buildQRCodeURL}) \n>'}}"
echo "\n\n\033[32m -----------------------上传dSYM文件-----------------------\033[0m\n\n\n"
#只有appstore包才上传bugly
if [[ ${EXPORT_TYPE} == "AppStore" ]]; then
zip -rj "${dYSMPATHOUT}.zip" ${dYSMPATHOUT}
curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=0de566a9-f35a-4d29-b9c4-b7fff662ebe0&app_id=a8b0724bed" --form "api_version=1" --form "app_id=a8b0724bed" --form "app_key=0de566a9-f35a-4d29-b9c4-b7fff662ebe0" --form "symbolType=2" --form "bundleId=${BUNDLEID}" --form "productVersion=${bundleShortVersion}" --form "channel=AppStore" --form "fileName=${APP_NAME}.app.dSYM.zip" --form "file=@${dYSMPATHOUT}.zip" --verbose
else
echo "not upload budly"
fi
echo "\n\n\033[32m -----------------------上传AppStore-----------------------\033[0m\n\n\n"
#只有appstore包才上传appstore
if [[ ${EXPORT_TYPE} == "AppStore" ]]; then
#验证账号密码
if [ ${#parameter_username} != 0 -a ${#parameter_username} != 0 ]
then
echo "\n\033[32m****************\n开始上传AppStore\n****************\033[0m\n"
#验证APP
altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
"${altoolPath}" --validate-app \
-f "$IPAPATHOUT" \
-u "$parameter_username" \
-p "$parameter_password" \
--output-format xml
#上传APP
"${altoolPath}" --upload-app \
-f "$IPAPATHOUT" \
-u "$parameter_username" \
-p "$parameter_password" \
--output-format xml
echo "\n\033[32m****************\n上传AppStore完毕\n****************\033[0m\n"
fi
fi
}
auto $1