美文网首页第三方库
iOS自动打包流程

iOS自动打包流程

作者: sennnnn | 来源:发表于2019-12-04 15:26 被阅读0次

    由于公司业务所以上网查询了一些关于iOS自动打包流程.

    一种是以shell脚本为主的打包,一种是以jenkins作为服务器自动打包.

    在两种脚本都适配过之后,发现jenkins过于操作过于复杂(不论是从学习的成本还是打包上,都过于复杂还不如喝杯奶茶静静等待Xcode-Project-Archive这个自带的打包.所以本文不介绍jenkins方式.

    直接进入主题shell打包,冲冲冲.

    shell脚本打包(0成本学习.

    教程環境篇

    由于本文照顾从零开始的iOS小白所以会教一些环境配置,HomeBrew,RVM,Ruby,Fir-Cli如果安装了可以直接跳过.直接看后面的打包步骤。

    • 首先安装HomeBrew,打開你的終端輸入並回車.
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    

    如果出現終端出現這個錯誤
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    請試試看個人熱點(我連接公司網絡會出現,但是使用了個人熱點是沒有問題的.
    或者尝试另一位简书大神的方案安装homebrew报错

    • 之後我們安裝RVM,我在嘗試的過程發現坑還挺多的.
      这个是官网的安装流程.
      RVM在線安裝
    • 在線安裝 打開終端輸入並回車(筆者失敗了.)
    gpg --keyserver [hkp://pool.sks-keyservers.net](hkp://pool.sks-keyservers.net) --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
    

    如果提示gpg: 从公钥服务器接收失败:No route to host
    則是可能因為你沒有安裝gpg.
    請使用

    brew install gpg
    

    brew reinstall gnupg
    

    重新安裝

    但是筆者還是失敗,所以選擇放棄了.

    • 離線安裝方式
      RVM離線安裝

    • 離線安裝 打開終端依次輸入並回車

    curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz
    
    mkdir rvm && cd rvm
    
    tar --strip-components=1 -xzf ../rvm-stable.tar.gz
    
    ./install --auto-dotfiles
    
    source ~/.rvm/scripts/rvm
    
    上面的命令依次是選擇離線包-创建文件夹-解包-安装-加载环境
    • 接著我們開始利用rvm安裝ruby

    這個命令可以用查看當前ruby版本.

    rvm list known
    

    下載指定版本2.4.0版本

    rvm install 2.4.0
    

    默認版本2.4.0

    rvm user 2.4.0 --default
    

    如果不行的話也可以使用HomeBrew安裝指令

    brew install ruby
    

    檢查是否安裝成功

    rvm - v
    

    成功將會返回當前版本號.
    例如:rvm 1.29.9 (manual) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]

    • 紧接着安装Fir-Cli即可,打開終端輸入並回車.
    sudo gem install -n /usr/local/bin fir-cli
    
    自動打包篇

    首先我們需要自己寫關於shell腳本的,創建一個.sh文件.

    #!/bin/bash
    # iOS打包脚本
    # author: senfor
    # version: 1.0
    # Update: 2019.12.9
    
    #name,version
    function recordArchiveLog() {
    #   打包Log路径
    LogPath="${WorkPath}/archive.log"
    
    #   上次打包时间
    RecordTime=$(head -1 $LogPath)
    #   获取git记录
    Git_log=$(git log --pretty=format:"%h - %an, %ad : %s"  --since="${RecordTime}")
    
    echo -e "\n\n----------------------------------------------------">>"${LogPath}"
    echo -e "[$1] [$2] [$APP_BuildVersion] \n[$(date)]">>"${LogPath}"
    echo -e '----------------------------------------------------'>>"${LogPath}"
    #   更新Log记录时间
    UpdateTime=$(date +%Y-%m-%dT%H:%M:%S | sed 's/-0/-/g')
    sed -i "" "s/$RecordTime/$UpdateTime/g" "${LogPath}"
    
    if [[ -z $Git_log ]];
    then
    echo "Git_log is empty."
    else
    echo "Git_log is not empty."
    #   写入到日志
    echo -e "${Git_log}" >> "${LogPath}"
    fi
    
    }
    
    
    #-------------------------   变量定义  -------------------------
    
    Targets_Name="redEvnStore"
    
    #   获取脚本文件存放路径
    ShellPath=$(cd "$(dirname "$0")"; pwd)
    readonly ShellPath
    
    #  .xcodeproj所在路径
    WorkPath="${ShellPath}"
    readonly WorkPath
    
    #   plist文件路径
    PlistFile_Path="${WorkPath}/${Targets_Name}/Info.plist"
    readonly PlistFile_Path
    
    #   APP名
    APP_DisplayName=$(/usr/libexec/PlistBuddy -c "Print CFBundleDisplayName" $PlistFile_Path)
    readonly APP_DisplayName
    
    #   APP版本
    APP_Version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${PlistFile_Path})
    #   构建版本号
    APP_BuildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${PlistFile_Path})
    
    #IPA包文件夹名
    IPA_Name=`date +%Y-%m-%d_%H-%M`
    #   打包路径
    IPA_Path="${WorkPath}/build_release_${IPA_Name}"
    #   打包开始时间
    Archive_Start_Time=`date +%s`
    SLEEP_TIME=0.3
    
    
    #-------------------------   变量定义  -------------------------
    
    #-------------------------   代码执行  -------------------------
    
    #echo -e "\033[36;1m 内容 \033[0m"
    #  配置编译模式
    echo -e "\033[36;1m 请选择 编译模式 (输入序号, 按回车即可) \033[0m"
    echo -e "\033[36;1m 1. Debug \033[0m"
    echo -e "\033[36;1m 2. Release \033[0m"
    read parameter
    sleep ${SLEEP_TIME}
    Build_Configuration_Selectd="${parameter}"
    
    # 判读用户是否有输入
    if [[ "${Build_Configuration_Selectd}" == "1" ]]; then
    Configuration="Debug"
    elif [[ "${Build_Configuration_Selectd}" == "2" ]]; then
    Configuration="Release"
    else
    echo -e "\033[31m \n您输入 BUILD_CONFIGURATION 参数无效!!!\n \033[0m"
    exit 1
    fi
    
    
    #   配置是否上传蒲公英
    echo -e "\033[36;1m 请选择 是否上传蒲公英 (输入序号, 按回车即可) \033[0m"
    echo -e "\033[36;1m 1. 上传 \033[0m"
    echo -e "\033[36;1m 2. 不上传 \033[0m"
    read parameter
    sleep ${__SLEEP_TIME}
    UploadPGYER="${parameter}"
    
    # 拷贝项目代码到工作目录
    cd $ShellPath
    TEMP_F="temp"
    echo -e "\033[36;1m (0x04)-->配置工程文件路径... \033[0m"
    
    Project_Name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
    #创建IPA文件夹
    mkdir -p $IPA_Path
    
    if [[ -z $Project_Name ]]; then
    echo -e "\033[31m ERROR-错误401:找不到需要编译的工程,编译APP中断. \033[0m"
    exit 401
    fi
    
    echo ""
    
    # 编译打包
    #打包完的程序目录
    App_Dir="${IPA_Path}/${Targets_Name}.app"
    #dSYM的路径
    DSYM_Dir="${IPA_Path}/${Targets_Name}.app.dSYM"
    
    #编译工程
    echo -e "\033[36;1m (0x08)-->开始编译,耗时操作,请稍等... \033[0m"
    xcodebuild -configuration "${Configuration}" -workspace "${ShellPath}/${Project_Name}".xcworkspace -scheme "${Targets_Name}" -arch arm64 ONLY_ACTIVE_ARCH=NO TARGETED_DEVICE_FAMILY=1 DEPLOYMENT_LOCATION=YES CONFIGURATION_BUILD_DIR="${IPA_Path}" clean build
    
    #查询编译APP是否成功
    if [ ! -d "${App_Dir}" ]; then
    echo ""
    echo -e "\033[31m --> ERROR-错误501:找不到编译生成的APP, 编译APP失败. \033[0m"
    exit 1
    else
    echo -e "\033[36;1m (0x08) 编译APP完成! √ \033[0m"
    fi
    
    echo ""
    echo -e "\033[36;1m (0x09)-->开始打包请稍等... \033[0m"
    echo ""
    
    IPA_APP_DIR="${ShellPath}/${APP_DisplayName}_${APP_Version}_${IPA_Name}"
    mkdir "${IPA_APP_DIR}"
    
    #创建打包生成目录
    IPA_BuildPath="${IPA_APP_DIR}/${APP_DisplayName}_v${APP_Version}_build${APP_BuildVersion}.ipa"
    APP_PATH="${IPA_APP_DIR}/${APP_DisplayName}_${APP_Version}.app"
    SYM_PATH="${APP_PATH}.dSYM"
    
    cd "${IPA_APP_DIR}"
    mkdir "Payload"
    cp -r "${App_Dir}" "Payload"
    zip -r "${IPA_BuildPath}" "Payload"
    
    #查询打包是否成功
    if [ ! -f "${IPA_BuildPath}" ]; then
    echo -e "\033[36;1m ---------------------------------------------------- \033[0m"
    echo -e "\033[31m --> ERROR-错误501:找不到签名生成的IPA包,打包APP失败. \033[0m"
    exit 1
    else
    echo -e "\033[36;1m (0x09) 打包APP完成! √ \033[0m"
    echo ""
    fi
    
    #拷贝过来.app.dSYM到输出目录
    mv "${DSYM_Dir}" "${SYM_PATH}"
    
    rm -rf "${IPA_Path}"
    date_end='expr date + %s'
    
    times='expr $date_end + $date_starts'
    
    echo -e "\033[36;1m (0x0A)-->Nice Worker! -->打包成功!  GET √ \033[0m"
    echo -e "\033[36;1m ---------------------------------------------------- \033[0m"
    echo -e "\033[36;1m 本地安装包--->  ${IPA_APP_DIR} \033[0m"
    echo -e "\033[36;1m 耗时: ${times} s \033[0m"
    echo -e "\033[36;1m 完成时间: `date` \033[0m"
    echo -e "\033[36;1m ---------------------------------------------------- \033[0m"
    
    #   记录打包数据
    recordArchiveLog ${APP_DisplayName} ${APP_Version}
    open "${IPA_APP_DIR}"
    
    
    if [[ "${UploadPGYER}" == "1" ]]; then
    #   上传
    #   蒲公英Key
    PGYER_User_Key="修改成你的蒲公英KEY"
    PGYER_API_Key="修改成你的蒲公英KEY"
    #   上传蒲公英
    curl -F "file=@${IPA_BuildPath}" \
    -F "uKey=$PGYER_User_Key" \
    -F "_api_key=$PGYER_API_Key" \
    "http://www.pgyer.com/apiv1/app/upload"
    
    echo -e "\033[36;1m ${IPA_BuildPath} 上传 ${APP_DisplayName}.ipa 包 到 pgyer 成功 \033[0m"
    elif [[ "${UploadPGYER}" == "2" ]]; then
    echo "------------------------ 不上传蒲公英 打包结束 ------------------------"
    
    echo -e "\033[36;1m ${IPA_BuildPath} ------------------------ 不上传蒲公英 打包结束 ------------------------ \033[0m"
    else
    echo "\n您输入的参数无效!!!\n"
    echo -e "\033[31m --> \n您输入的参数无效!!!\n \033[0m"
    fi
    
    exit 0
    #-------------------------   代码执行  -------------------------
    
    

    其中你需要修改的為,這個項目的名

    Targets_Name="redEvnStore"
    

    如果你需要上傳到蒲公英則需要修改蒲公英的key

    PGYER_User_Key="修改成你的蒲公英KEY"
    PGYER_API_Key="修改成你的蒲公英KEY"
    

    之後你把這個.sh文件放到打包工程的目錄下,既和.xcodeproj同一级的目录.
    准备完成后
    打開你的終端輸入並回車
    輸入cd 後把你的工程路徑拖入到終端,會自動生成路徑

    cd 工程目錄.
    

    輸入你的sh名稱,例如你保存的.sh文件為abc.sh 則終端輸入./abc.sh ,既下方xxx改为abc即可.

    ./xxx.sh
    

    脚本编译出现错误集合(不定时更新

    xcodebuild报错

    xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
    

    解决如下--打開終端輸入並回車

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

    参考
    腳本為Jecky丶所寫,非常感謝.
    shell腳本教程
    xcodebuild命令

    相关文章

      网友评论

        本文标题:iOS自动打包流程

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