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

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

作者: 华语新空 | 来源:发表于2019-06-19 00:10 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/kqdzfctx.html