iOS自动化打包

news/2024/7/20 22:37:18 标签: ios, objective-c, xcode

测试阶段一般会发生这样的场景,测试拼命的提 Bug,开发拼命的改 Bug,改完重新打包发给测试进行复测,那这个过程中频繁的打包肯定是不可避免的。

如果使用 Xcode 打包,在打包期间我们是无法改剩余的 Bug 或进行其他模块的开发的,那这个时候我们能干什么呢?

哈哈哈,当然是去接杯咖啡或者泡杯茶了,不然还能干啥?

自动打包

好了,言归正传,其实这个打包过程我们可以脱离 Xcode,改用xcodebuild命令进行打包,相关核心命令包括:

xcodebuild clean

xcodebuild archive

xcodebuild -exportArchive

详细脚本见下节。

如果有需要帮助的,可以通过公众号联系我。

一般自动打包都会专门使用一台 Mac 作为打包机(一般是 Mac Mini,大厂会有专门的打包集群),在打包机上安装 jenkins 用来做自动化构建,关于 jenkins 这块我就不展开讲了,有兴趣的可以去查阅相关资料。我简单讲下中间的流程:

  1. 开发者提交代码到 gitlab;

  1. 可在 gitlab 配置相应的触发条件,如 push、tag 等,满足触发条件会发送 webhook 消息到 jenkins(webhook地址是提前在 jenkins 中配置好的);

  1. jenkins 收到通知后,就会执行配置好的构建任务;

  1. 构建任务内部拉取最新代码,进行一系列操作,如根据 jenkins 任务参数修改代码中的一些参数等,最后进行打包

  1. 打包成功后,将安装包上传到分发平台(蒲公英等外部平台或者自研的内部平台),上传成功后便可以将下载链接等相关信息通过 webhook 发送到企业微信群、钉钉群等团队沟通工具中,通知相关人员打包成功。

iOS自动化打包流程

这套体系搭建完成之后,对于开发人员而言打包就是修改 Bug,push 代码了。

上面只是一条简单的自动化打包流程,其实中间涉及的很多点没有展开,特别打包数量上了一定量级之后。

那有的读者所在公司可能没有专门的打包机,那这种情况我觉得就没有必要在自己的机器上再安装 jenkins 了,直接在终端执行脚本就可以了。步骤如下:

  1. 建立新的打包目录,其中包含源代码、打包脚本以及打包生成文件等目录;(不要直接使用开发工程目录,否则打包的时候还是不可以修改代码)

  1. 代码提交后,执行打包目录下的打包脚本,脚本内部需要添加拉取最新代码操作,拉取之后进行打包。

附录

该脚本只包含了 iOS 通用的打包步骤,大家可根据业务需求进行调整,如git pull拉取最新代码等操作。

如果复制不方便,也可以直接从打包脚本地址[1]进行下载。

#!/bin/sh

# 注意事项
# 1、如果提示permission denied:./package.sh , 则先附加权限,命令如下:chmod 777package.sh
# 2、请根据自己项目的情况选择使用 workspace 还是 project 形式,目前默认为 workspace 形式

### 需要根据自己项目的情况进行修改,XXX都是需要进行修改的,可搜索进行修改 ###

# Project名称
PROJECT_NAME=XXX

## Scheme名
SCHEME_NAME=XXX

## 编译类型 Debug/Release二选一
BUILD_TYPE=XXX

## 项目根路径,xcodeproj/xcworkspace所在路径
PROJECT_ROOT_PATH=XXX

## 打包生成路径
PRODUCT_PATH=XXX

## ExportOptions.plist文件的存放路径,该文件描述了导出ipa文件所需要的配置
## 如果不知道如何配置该plist,可直接使用xcode打包ipa结果文件夹的ExportOptions.plist文件
EXPORTOPTIONSPLIST_PATH=XXX


## workspace路径
WORKSPACE_PATH=${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcworkspace

## project路径
PROJECT_PATH=${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcodeproj

### 编译打包过程 ###

echo "============Build Clean Begin============"

## 清理缓存

## project形式
# xcodebuild clean -project ${PROJECT_PATH}-scheme ${SCHEME_NAME}-configuration ${BUILD_TYPE}|| exit

## workspace形式
xcodebuild clean -workspace ${WORKSPACE_PATH}-scheme ${SCHEME_NAME}-configuration ${BUILD_TYPE}|| exit

echo "============Build Clean End============"

#获取Version
VERSION_NUMBER=`sed -n '/MARKETING_VERSION = /{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' ${PROJECT_PATH}/project.pbxproj`
# 获取build
BUILD_NUMBER=`sed -n '/CURRENT_PROJECT_VERSION = /{s/CURRENT_PROJECT_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' ${PROJECT_PATH}/project.pbxproj`

## 编译开始时间,注意不可以使用标点符号和空格
BUILD_START_DATE="$(date +'%Y-%m-%d_%H-%M')"

## IPA所在目录路径
IPA_DIR_NAME=${VERSION_NUMBER}_${BUILD_NUMBER}_${BUILD_START_DATE}

##xcarchive文件的存放路径
ARCHIVE_PATH=${PRODUCT_PATH}/IPA/${IPA_DIR_NAME}/${SCHEME_NAME}.xcarchive
## ipa文件的存放路径
IPA_PATH=${PRODUCT_PATH}/IPA/${IPA_DIR_NAME}

# 解锁钥匙串 -p后跟为电脑密码
security unlock-keychain -p XXX

echo  "============Build Archive Begin============"
## 导出archive包

## project形式
# xcodebuild archive -project ${PROJECT_PATH}-scheme ${SCHEME_NAME}-archivePath ${ARCHIVE_PATH}

## workspace形式
xcodebuild archive -workspace ${WORKSPACE_PATH}-scheme ${SCHEME_NAME}-archivePath ${ARCHIVE_PATH}-quiet || exit

echo "============Build Archive Success============"


echo "============Export IPA Begin============"
## 导出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVE_PATH-exportPath ${IPA_PATH}-exportOptionsPlist ${EXPORTOPTIONSPLIST_PATH}-quiet || exit

if[-e ${IPA_PATH}/${SCHEME_NAME}.ipa ];
    then
    echo "============Export IPA SUCCESS============"
    open ${IPA_PATH}else
    echo "============Export IPA FAIL============"
fi


# 删除Archive文件,可根据各自情况选择是否保留
# rm -r ${ARCHIVE_PATH}


### 上传过程 ###

## 上传app store

ALTOOL_PATH="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"

# 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码
# "$ALTOOL_PATH"--validate-app -f ${IPA_PATH}/${SCHEME_NAME}.ipa -u XXX-p XXX-t ios --output-format xml

# "$ALTOOL_PATH"--upload-app -f ${IPA_PATH}/${SCHEME_NAME}.ipa -u  XXX-p XXX-t ios --output-format xml

## 上传到蒲公英
echo "============Upload PGYER Begin============"

## 具体参数可见 http://www.pgyer.com/doc/view/api#uploadApp
PGYER_UPLOAD_RESULT=`curl \
-F "file=@${IPA_PATH}/${SCHEME_NAME}.ipa" \
-F "buildInstallType=XXX" \
-F "buildPassword=XXX" \
-F "buildUpdateDescription=XXX" \
-F "_api_key=XXX" \
https://www.pgyer.com/apiv2/app/upload`

echo "============Upload PGYER SUCCESS============"
## 返回结果码,其中0为成功上传,因为返回结果中带回来的有中文显示乱码,无法利用jq解析


## 如需上传到fim,可查阅 https://www.betaqr.com/docs/publish 文档


### 如需脚本在执行过程中给用户提供选择,可使用以下Demo ###

#echo "Place enter the number you want to export? [ 1:app-store 2:ad-hoc] "
#read number
#    while([[ $number !=1]]&&[[ $number !=2]])
#    do
#        echo "Error! Should enter 1 or 2"
#        echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc] "
#        read number
#    done
#if[ $number ==1];
#    then
#    ####
#    else
#    ####
#fi

最后

新的一周要更加努力呀!


http://www.niftyadmin.cn/n/87887.html

相关文章

【线程同步工具】Semaphore源码解析

控制对资源的一个或多个副本的并发访问 Java API 提供了一种信号量机制 Semaphore。 一个信号量就是一个计数器, 可用于保护对一个或多个共享资源的访问。 当一个线程要访问多个共享资源中的一个时,它首先需要获得一个信号量。如果信号量内部的计数器的…

Spring AOP(AOP概念、组成、Spring AOP实现及实现原理)

文章目录1. Spring AOP 是什么2. 为什么要用 AOP3. 怎么学 Spring AOP4. AOP 组成5. Spring AOP 实现5.1 添加 Spring AOP 框架支持5.2 定义切面和切点5.3 实现通知方法5.4 使⽤ AOP 统计 UserController 每个⽅法的执⾏时间 StopWatch5.4 切点表达式说明 AspectJ6. Spring AOP…

华为OD机试真题Python实现【字母计数】真题+解题思路+代码(20222023

字母计数 题目 给出一个只包含字母的字符串, 不包含空格,统计字符串中各个子字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序输出各个字母及其出现次数 如果次数相同,按照自然顺序排序,且小写字母在大写字母之前 🔥🔥🔥🔥🔥👉👉👉👉👉�…

华为OD机试真题Python实现【第 k 长子串】真题+解题思路+代码(20222023)

第 k 长子串 题目 给定一个字符串 只包含大写字母 求在包含同一字母的子串中 长度第 K 长的子串 相同字母只取最长的子串 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 第一行 一个子串 1 < len <= 100 只包含大写字母 第…

php+vue加油站会员服务系统 java微信小程序

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 3.2网站性能需求分析 10 3.3网站功能分析 10 3.4系统…

C语言格式化输出总结:%d,%c,%s,%f, %lf,%m.nd,%m.nf,%m.ns 以及sprintf函数

凡事发生必将有益于我&#xff0c;高手&#xff0c;从来都不仅仅是具备某种思维的人&#xff0c;而是那些具备良好学习习惯的人&#xff0c;成为高手&#xff0c;无他&#xff0c;手熟尔&#xff01;加油在最近的学习之中&#xff0c;对于格式化输出这个知识点&#xff0c;这里…

插值查找算法

插值查找算法又称插值搜索算法 &#xff0c;是在二分查找算法 的基础上改进得到的一种查找算法。 插值查找算法只适用于有序序列&#xff0c;换句话说&#xff0c;它只能在升序序列或者降序序列中查找目标元素。 作为“改进版”的二分查找算法&#xff0c;当有序序列中的元素呈…

CentOS yum报错问题汇总(持续更新)

一、为 repo AppStream 下载元数据失败1.错误现象为 repo ‘AppStream’ 下载元数据失败错误&#xff1a;为 repo ‘AppStream’ 下载元数据失败2.错误原因1.网络连接不上如果出现该错误&#xff0c;请先确保服务器可以正常连接互联网。可以ping一下百度的域名&#xff0c;能pi…