Xcode打包:shell脚本配置打包服务器,解放双手!

对于IOS开发者来讲,日常打包交付给测试组人员是经常的繁琐事儿,每一次都需要程序员使用Xcode进行Achieve或者使用命令行XcodeBuild打包,无论用哪一种方式少不了打包,等待编译,签名,压缩,提交云盘或者直接拷贝传输给测试团队。

这一过程,耗费了程序员的大好时光,对于一位开发者来说,是绝对不能容忍这种重复劳动的!

其实,本机配置和服务器配置是一个道理。

无非就这三步骤:打包,签名,压缩ZIP上传给测试

但是,我们的程序和能具有多种配置环境,比如有线上正式服务器,线下测试服务器,有测试开发证书,有发布证书,所以我们给测试的app版本是至少三种情况:测试服务器测试证书,线上服务器测试证书,线上服务器正式证书(发布)。而这么多的环境,如果实现一键打包,或者选择打哪一种包,就需要我们好好规划一下了!

自动打包前提准备

  • 规划好config版本,在Xcode中可以设置Debug,Release,AppStore等设置信息。(如下图四个配置)
  • 规划好编译临时文件的目录,编译后IPA,xcarchive(会压缩为ZIP)文件的路径,一般在我们工程某个目录下。
  • 将上一步骤中的IPA,ZIP文件拷贝到测试可以下载的目录里。

 

Xcode打包:shell脚本配置打包服务器,解放双手!

至此,我们的决策就已经OK了!

  1. #!/bin/sh
  2. build_config=$1
  3. build_path=$2
  4. build_profile_path=$3
  5. build_out_path=$4
  6. build_sign_out=$5
  7. echo "============"
  8. echo "build_config:"$build_config
  9. echo "build_path:"$build_path
  10. echo "build_profile_path:"$build_profile_path
  11. echo "build_out_path:"$build_out_path
  12. echo "build_sign_out:"$build_sign_out
  13. echo "============"
  14. project_name="myApp_Name"
  15. # 编译临时文件夹
  16. build_temp_path=$build_path"/build"
  17. if [ $build_config == "clean" ]
  18. then
  19.     echo "Perform Clean\n"
  20.     if [ -d "$build_temp_path" ]
  21.     then
  22.         rm -r "$build_temp_path"
  23.         exit
  24.     fi
  25. else
  26.     if [ "$build_config" = "Release" ]; then
  27.         #测试证书,线上服务器配置标记,用于xcodebuild命令行参数
  28.         config_name="Release"
  29.         #测试证书
  30.         provisioningProfile="myAppleTestProfile"
  31.         #以下两个命令主要是:把SVN或者本项目中的证书文件,提交到打包服务器的证书目录,以供打包服务器需要
  32.         cp $build_path"/Release/Cers/360test/360CameraTestPush.mobileprovision" "$build_profile_path/"
  33.         cp $build_path"/Release/Cers/360test/com.360camera.push.HGNotificationExtend_provision.mobileprovision" "$build_profile_path/"
  34.     elif [ "$build_config" = "TestServer" ]; then
  35.         config_name="TestServer"
  36.         provisioningProfile="360CameraTestPush"
  37.         cp $build_path"/Release/Cers/360test/360CameraTestPush.mobileprovision" "$build_profile_path/"
  38.         cp $build_path"/Release/Cers/360test/com.360camera.push.HGNotificationExtend_provision.mobileprovision" "$build_profile_path/"
  39.     elif [ "$build_config" = "Appstore" ]; then
  40.         config_name="Appstore"
  41.         #测试证书
  42.         provisioningProfile="360FamilyGuardAppstore_Product"
  43.         cp $build_path"/Release/Cers/appstore/myApp_NameAppstore_Product.mobileprovision" "$build_profile_path/"
  44.         #如果有子target或者extention ,可能需要其他证书
  45.         cp $build_path"/Release/Cers/appstore/myApp_NameExtendNotificationAppStore_Product.mobileprovision" "$build_profile_path/"
  46.     fi
  47.     info_path=$build_path"/$project_name/app/entry/Info.plist"
  48.     echo "info_path:$info_path"
  49.     build_bundle_version=$(date +%Y%m%d%H%M)
  50.     build_version="$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$info_path")"
  51.     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_bundle_version}" "$info_path"
  52.     # 编译产物目录
  53.     dest_path=$build_temp_path"/${config_name}_iphoneos"
  54.     #拼接编译产物IPA或者ZIP名字: myApp_Name_Release_5.5.9_201612301610
  55.     dest_file_name="myApp_Name"_${config_name}_${build_version}_${build_bundle_version}
  56.     archive_path=$dest_path"/${dest_file_name}.xcarchive"
  57.     ipa_path=$dest_path"/${dest_file_name}.ipa"
  58.     zip_file="$dest_file_name.zip"
  59.     zip_path=$dest_path"/$zip_file"
  60.     project_file=$build_path"/myApp_Name.xcodeproj"
  61.     echo "project_file:"$project_file
  62.     echo "xcodebuild start.\n"
  63.     xcodebuild clean -project "$project_file"
  64.     xcodebuild -project "$project_file" -scheme "myApp_Name" -sdk "iphoneos" -configuration "$config_name" -archivePath "$archive_path" archive
  65.     echo " Package ipa."
  66.     xcodebuild -exportArchive -archivePath "$archive_path" -exportPath "$ipa_path" -exportProvisioningProfile "$provisioningProfile"
  67.    # 保存当前目录,保证一会切回
  68.     dest_old_path=$PWD
  69.      # 进入编译产物目录,对xcarchive文件进行zip压缩,然后
  70.     cd $dest_path
  71.     zip -r "$zip_file" "$dest_file_name.xcarchive"
  72.     cd $dest_old_path;
  73.     echo "copycopy dest."
  74.     # 备份产出为签名输出
  75.     # 把xcodebuild -exportArchive产生的IPA,ZIP文件复制到测试可以下载到的目录
  76.     cp $zip_path $build_out_path
  77.     cp $ipa_path $build_out_path
  78.     cp $zip_path $build_sign_out
  79.     cp $ipa_path $build_sign_out
  80.     echo "build success."
  81. fi
  82. exit

那么怎么使用以上的脚本呢?根据以上脚本的设计,我们可以给出调用规则:(新建立一个startBuild,输入如下代码,终端运行startBuild)

  1. #!/bin/sh
  2. ./360HomeGuard_ForShuidiYouhua_check/buildInfo/qbuild.sh "clean"
  3. ./360HomeGuard_ForShuidiYouhua_check/buildInfo/qbuild.sh "Appstore" "/Users/xieyinchao/Documents/branch_box_2/360HomeGuard_ForShuidiYouhua_check" "/Users/xieyinchao/Library/MobileDevice/Provisioning Profiles" "./out"  "./signout"

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

  1. avatar 编码王 0

    这篇文章棒极了,解了我的燃眉之急,搞了好几天的自动打包终于搞好了!