美文网首页
iOS自动化打包发布(二)- Linux Shell脚本自动打包

iOS自动化打包发布(二)- Linux Shell脚本自动打包

作者: Jecky丶 | 来源:发表于2018-09-07 16:10 被阅读538次
    2018-09-07 16.43.32.gif

    前言

    在上一篇文章中iOS自动化打包发布(一)介绍了如何使用Fastlane进行自动打包,但是笔者还是认为前期准备工作实在有些繁琐,因此将新研究的打包脚本在此分享给广大猿友们。

    支持AdHoc、AppStore、Enterprise、Development模式打包

    废话不多说,直接上代码。
    #!/bin/bash
    # 打包脚本
    # Mail:  271296246@qq.com
    # Update: 2018.9.6
    # github地址 https://github.com/JKKKKKKKen/AutoArchive
    #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="ArchiveTest"
    
    #   获取脚本文件存放路径
    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
    #-------------------------   代码执行  -------------------------
    
    
    
    • 在你的项目中新建一个.sh文件,和.xcodeproj文件同级。
    • 将上述代码拷贝至文件中
    • Targets_Name="ArchiveTest"改成你的项目名
    • 如需要将打包好的ipa文件自动上传蒲公英,需配置
    PGYER_User_Key="修改成你的蒲公英KEY"
    PGYER_API_Key="修改成你的蒲公英KEY"
    

    OK,准备工作完成!简单吧!

    开始打包,如我项目中的.sh文件名为jk_archive.sh

    • 第一步 打开终端
    $ cd jk_archive.sh文件所在的文件夹
    
    • 第二步 执行./jk_archive.sh
    根据提示选择你需要打包的配置,然后双手就可以放开键盘,悠闲地喝茶啦!

    附上demo地址Demo,如果帮助到您,烦请给颗小星星!3Q!

    相关文章

      网友评论

          本文标题:iOS自动化打包发布(二)- Linux Shell脚本自动打包

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