iOS shell实现自动打包修改网络环境、自动命名并上传svn

iOS shell实现自动打包修改网络环境、自动命名并上传svn

设计自动打包的原因

对于多个项目的情况下,测试包要的频繁,而且手动切换网络的时候,有时可能写错了还不知道,对于我们iOS来说,我们的线上包和测试包是不一样的证书有区别,防止测试看的包和我们打的线上包不一致的情况发生,自动打包就尤为重要,省区自动命名导出上传svn等没有智商的工作.自动打包方便了我们,我今天讲的是使用xcode自带的xcodebuild来打包,使用它来做打包的原因是,成本低,不用在安装一些第三方插件什么的.

1修改网络环境

修改网络环境 参数网络环境

将网络全局文件修改为如下方式进行网络切换 我是放在ServiceConstant这个文件中,你可以自定义文件

// 在此处切换环境变量 1:生产环境 2:预发布环境 3:测试环境外 4:测试环境内 
#define APPType 1
#if APPType == 1 // 生产cs
#define kAPPBaseUrl       @""
#elif APPType == 2 // 预发布
#define kAPPBaseUrl        @""
#elif APPType == 3 // 测试 外
#define kAPPBaseUrl        @“”          
#else          //测试 内
#define kAPPBaseUrl        @“”  
#endif

modifyServicehost(){
    #判断参数是否为空
    if [ ! -n "$1" ]
    then
    echo "请输入参数:网络环境:1:生产环境 2:预发布环境 3:测试环境外 4:测试环境内 5:appstore线上环境" 
    exit
    fi

    xhlhost=${1}
    #-gt    检测左边的数是否大于右边的,如果是,则返回 true。
    #-lt    检测左边的数是否小于右边的,如果是,则返回 true。
    if [[ $xhlhost -gt 5 || $xhlhost -lt 1 ]]
    then
    echo "请输入参数:网络环境:1:生产环境 2:预发布环境 3:测试环境外 4:测试环境内 5:appstore线上环境" 
    exit
    fi

    modifyHost=$xhlhost
    if [ $xhlhost == 5 ];then #线上appStore环境
        modifyHost=1
    fi

    #修改网络环境
    echo $modifyHost
    for ServiceConstant in 1 2 3 4
    do
    #修改网络状态,Constant/ServiceConstant.h自己的文件路径
    sed -i "" "s/#define APPType ${ServiceConstant}/#define APPType ${modifyHost}/g" ${projectName}/Constant/ServiceConstant.h
    done

    severPath=''
    case $xhlhost in
    1)  severPath='生产环境'
    ;;
    2)  severPath='预发布环境'
    ;;
    3)  severPath='测试环境'
    ;;
    4)  severPath='测试环境'
    ;;
    5)  severPath='appstore线上环境'
    ;;
    esac
    #检测网络是否成功
    if [ `grep -c "#define APPType $modifyHost" ${projectName}/Constant/ServiceConstant.h` -eq '0' ]; then
        echo "网络没有修改成功.请检查ServiceConstant.h文件"
        exit
    else
        echo '网络环境切换:'$severPath'  成功'
    fi
    #调用打包
    iosBuildIpa $xhlhost
}

iOS使用xcodebuild打包

创建2个pilst表,一个表示appStore的,一个表示develpent开发环境的


image.png

image.png

image.png

image.png
#自动打包脚本 参数网络环境
iosBuildIpa(){
    xhlhost=$1
    echo $xhlhost
    # 删除build包
    if [[ -d build ]]; then
    rm -rf build -r
    fi

    #工程名
    project_name=$projectName

    #打包模式 Debug/Release
    development_mode=Debug

    #scheme名
    scheme_name=$projectName
    appStoreExport=$projectPath/AppStoreExportOptionsPlist.plist
    #plist文件所在路径
    if [ $xhlhost == 5 ]
    then #线上appStore环境
        exportOptionsPlistPath=$appStoreExport
        echo 'appstore线上包正在打.....'
    else
        exportOptionsPlistPath=$projectPath/DevelopmentExportOptionsPlist.plist
        echo '测试包正在打.....'
    fi


    #导出.ipa文件所在路径
    exportFilePath=~/Desktop/XHL_AAU/${appName}`date +%Y-%m-%d`'-ipa'

    echo '*** 正在 清理工程 ***'
    xcodebuild \
    clean -configuration ${development_mode} -quiet  || exit
    echo '*** 清理完成 ***'


    echo '*** 正在 编译工程 For '${development_mode}
    xcodebuild \
    archive -workspace ${project_name}.xcworkspace \
    -scheme ${scheme_name} \
    -configuration ${development_mode} \
    -archivePath build/${project_name}.xcarchive  || exit
    echo '*** 编译完成 ***'


    echo '*** 正在 打包 ***'
    xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
    -configuration ${development_mode} \
    -exportPath ${exportFilePath} \
    -exportOptionsPlist ${exportOptionsPlistPath} \
    -quiet || exit

    if [ -e $exportFilePath/$scheme_name.ipa ]; then
        echo "*** .ipa文件已导出 ***"
#        cd ${exportFilePath}
#        echo "*** 开始上传.ipa文件 ***"
        echo ${exportFilePath} "包名"
        echo $exportFilePath/$scheme_name.ipa "ipa路径"
        if [[ $xhlhost == 5 || $xhlhost == 1 ]]
            then
            #备份dSYM
            archive_path=build/${project_name}.xcarchive
        dsym_path=${archive_path}/dSYMs/${project_name}.app.dSYM/Contents/Resources/DWARF/${project_name}
            cp -R "${dsym_path}" "${exportFilePath}/${project_name}.dSYM"
        fi
#        #此处上传分发应用
#        echo "*** .ipa文件上传成功 ***"
    else
        echo "*** 创建.ipa文件失败 ***"
    fi
    echo '*** 打包完成 ***'
    renameIpa $xhlhost $exportFilePath/$scheme_name.ipa

    #线上环境同时导出一个线上包
    if [ $xhlhost == 1 ]
        then #线上appStore环境
            echo '*** 正在 打appStore包 ***'
            xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
            -configuration ${development_mode} \
            -exportPath ${exportFilePath}/'appstore' \
            -exportOptionsPlist ${appStoreExport} \
            -quiet || exit
            echo '*** appstore包打包完成 ***'
            renameIpa 5 ${exportFilePath}/'appstore'/$scheme_name.ipa
        fi
    # 删除build包
    if [[ -d build ]]; then
    rm -rf build -r
    fi
}

对导出的ipa包进行重命名,我们这里是要求的时间—V版本号—构建号—环境

原理:将ipa解压,取出里面的plist表获取版本号和构建号,重命名

#修改文件名 第一个参数网络环境,第二个参数ipa路径
renameIpa(){
    #脚本接收一个参数是ipa路径
    severHost=$1
    #ipa路径
    IPA_FILE=$2
    #解压路径
    IPA_DIR=.ipaTemp

    #删除临时解包目录
    if [ -d "$IPA_DIR" ]; then
        echo "rm ipatemp"
        rm -rf "${IPA_DIR}"
    else
        echo "mkdir ipatemp"
        mkdir -p "${IPA_DIR}"
    fi

    #解包IPA
    if [[ -f "$IPA_FILE" ]]; then
    echo "unzip $IPA_FILE begin ..."
    unzip -q "$IPA_FILE" -d "$IPA_DIR"
    if [[ $? != 0 ]]; then
    echo "unzip $IPA_FILE failed"
    exit 2
    else
    echo "unzip $IPA_FILE successed"
    fi
    fi

    # 定位到*.app目录
    appDir="$IPA_DIR/Payload/`ls "$IPA_DIR/"Payload`"
    infoPlist="${appDir}/Info.plist"
    echo $appDir
    echo ${infoPlist}

    #构建号
    CFBundleVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" $infoPlist`
    echo 'CFBundleVersion:'$CFBundleVersion
    #版本号
    CFBundleShortVersionString=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" $infoPlist`
    echo 'CFBundleShortVersionString:'$CFBundleShortVersionString


    ls_date=`date +%Y%m%d`
    echo $ls_date
    severStr='' #ipa环境命名
    case $severHost in
    1)  severStr='prod_1'
    ;;
    2)  severStr='ready_1'
    ;;
    3)  severStr='test_1'
    ;;
    4)  severStr='test_1'
    ;;
    5)  severStr='prod' #appstore线上环境
    ;;
    esac
    ipaName=$ls_date"_V"${CFBundleShortVersionString}'_'${CFBundleVersion}'_'$severStr'.ipa'
    echo $ipaName
    echo $IPA_FILE

    newIpaName=$(dirname "$IPA_FILE")
    newIpaPath="$newIpaName/$ipaName" #命名后的文件
    echo $newIpaName
    echo $newIpaPath
    mv -f "$IPA_FILE" $newIpaPath

#    if [ ! -f "$newIpaPath" ];then
#        echo '重命名成功 $newIpaPath'
#    else
#        echo "重命名失败"
#        exit
#    fi
    echo '重命名成功'
    rm -rf "${IPA_DIR}"
    uploadSvn $severHost $newIpaPath
}

上传svn或者蒲公英

#上传svn路径
#第一个个参数网络环境,第二个参数本地ipa路径
uploadSvn(){
    echo '上传svn.......'
    severHost=$1 #网络环境地址 正式环境,测试环境,预发布
    ipaPath=$2
    severPath='' #ipa路径
    case $severHost in
        1)  severPath='生产环境'
        ;;
        2)  severPath='预发布环境'
        ;;
        3)  severPath='测试环境'
        ;;
        4)  severPath='测试环境'
        ;;
        esac
    ipaFile=${ipaPath##*/} #获取目录下的文件
    echo $ipaFile
    echo $severPath
    if [ $severHost == 5 ];then #线上appStore环境
        svnPath="" svn appStore线上路径
    else
        svnPath=“”svn路径 测试路径
    fi
    echo $svnPath
    svn delete -m "修改文件"  $svnPath
    svn import -m "New Import" $ipaPath $svnPath
    echo '上传svn成功'
    echo "请到${svnPath}查看"

    #自动上传到蒲公英

#    curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload
#    USER_KEY='d9382d83bcdf6e5ce6e4361e9e63bbeb'
#    API_KEY='1c9264c3a4e879976950a3f4787cd396'
#    curl -F "file=@{$ipaPath}" \
#    -F "uKey={$USER_KEY}" \
#    -F "_api_key={$API_KEY}" \
#    https://www.pgyer.com/apiv1/app/upload
}

注意的点,

1.网络请求必须在ServiceConstant.h文件中

2.ServiceConstant.h文件中的网络请必须用宏定义域变异判断操作

#define APPType 4

这句代码格式不能改,包括空格

3.必须保证项目能跑起来,不报错

4.在执行过程中可能需要输入你的svn账号和密码

5.保证项目证书环境


image.png

执行打包

1.cd到AAU目录下

2.执行./AAU.sh 中间屏幕就会一直滚动起来,并打印一些日志,注意看是否有错

执行完整代码

cd AAU所在目录
./AAU.sh 1 //带参数:1线上,2予发布,3测试外网,4测试内网这个可能跟你代码中自己判断有区别,自己对照

到这一步,所有打包流程都完成了,在svn查看自己包是否打包成功

执行中的可能遇到的错误错误解决

执行./AAU.sh 提示没有权限

chmod a+x ./AAU.sh
后面从新执行 ./AAU.sh 参数

xcode-select 报错
执行

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

/Applications/Xcode.app/Contents/Developer是你xcode路径,请选择最新xcode路径

参考:

iOS自动化打包 ---- xcodebuild 命令详解

Xcode命令行脚本打包

XZ_iOS命令行打包和Python脚本打包出现错误的解决

shell脚本语言学习

你可能感兴趣的:(iOS shell实现自动打包修改网络环境、自动命名并上传svn)