前言
作为iOS客户端开发的小哥们,一定都有过一天给测试人员、产品组打包N次的经历。如果每次都手动打包的话,不仅浪费了开发人员的时间,让测试小姐姐煎熬等待也是件不厚道的事情。
所以自动化打包在此时就显得尤为重要了。有了自动化打包工具,开发小哥只需要运行打包工具,剩下的事情就交给自动化打包工具就好了。工具会自动打包,并将ipa包上传至fir,如果有需要还可以让工具自动发送消息通知测试小姐姐可以测试了。O(∩_∩)O哈哈哈~
基本命令
xcodebuildArchiveipaxcodebuildarchivexcodebuild archive -workspace xxx.xcworkspace -scheme xxx -configuration Release -archivePath ${ARCHIVE_PATH} CONFIGURATION_BUILD_DIR=${BUILD_DIR}
-workspace-scheme-configuartion-archivePathCONFIGURATION_BUILD_DIR
exportxcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportOptionsPlist ${EXPORT_OPTIONS_PLIST_PATH} -exportPath ${EXPORT_DIR}
-archivePath-exportOptionsPlist-exportPath
第二步中的配置文件特别重要,是你打包为测试包或者发布版本的关键。稳妥起见,请手动打包一次,从生成的目录中获取
xcodebuild -usage
如何使用
因为目前正在学习Golang,所以使用Golang来完成自动化打包工具的开发,本次打包的目标为测试版本,需要发布版本的小伙伴可根据原理执行修改。
1、创建项目
首先创建一个Golang项目,添加main.go文件,因项目简单,所以所有代码均写在main.go文件中。
2、配置文件
config.json
{
"scheme":"构建的工程名称", // eg.我的项目叫TShop
"path":"工程根目录路径", // eg. "~/Desktop/TShop_SVN"
"workspace":"工作空间文件名", // 即项目中.xcworkspace后缀名文件的名称
"archPath":"保存Archive文件的路径+Archive文件名", // eg. "~/Desktop/autoArchive/TShop"
"exportPath":"导出ipa文件的路径",
"config": "第二步中需要用到的配置文件的路径",
"apiToken":"你注册的fir的Api Token"
}
3、在main.go中解析配置json文件
在main.go中创建type
type buildInfo struct {
Path string `json:"path"`
Workspace string `json:"workspace"`
Scheme string `json:"scheme"`
ArchPath string `json:"archPath"`
ExportPath string `json:"exportPath"`
Config string `json:"config"`
ApiToken string `json:"apiToken"`
}
在main函数中解析json
func main() {
file := "config.json" // 应改为你的配置文件的路径
content, err := ioutil.ReadFile(file)
if err != nil {
panic(err.Error())
}
var info buildInfo
err = json.Unmarshal(content, &info)
if err != nil {
panic(err.Error())
}
}
4、Archive
创建Archive函数来执行第一步的命令
func Archive(info buildInfo) {
err := os.Chdir(info.Path)
if err != nil {
panic(err.Error())
}
workspace := info.Workspace + ".xcworkspace"
archCommand := exec.Command("xcodebuild", "archive", "-workspace", workspace, "-scheme", info.Scheme, "-archivePath", info.ArchPath)
archCommand.Stdout = os.Stdout
err = archCommand.Run()
if err != nil {
panic(err.Error())
}
}
5、Export
func Export(info buildInfo) {
arch := info.ArchPath + ".xcarchive"
export := exec.Command("xcodebuild", "-exportArchive", "-archivePath", arch, "-exportOptionsPlist", info.Config, "-exportPath", info.ExportPath)
export.Stdout = os.Stdout
err := export.Run()
if err != nil {
panic(err.Error())
}
}
在main函数末尾调用Archive(info)和Export(info)并运行即可自动打包生成ipa文件。
6、上传至fir
fir publish APP_FILE_PATH -T API_TOKEN
APP_FILE_PATH-T
在main.go中创建Upload函数
func Upload(info buildInfo) {
ipaPath := info.ExportPath + info.Scheme + ".ipa"
upload := exec.Command("fir", "publish", ipaPath, "-T", info.ApiToken)
upload.Stdout = os.Stdout
err := upload.Run()
if err != nil {
panic(err.Error())
}
}
然后在main函数的末尾调用Upload(info),即可将生成的ipa上传至fir。
最后的main函数
func main() {
file := "config.json"
content, err := ioutil.ReadFile(file)
if err != nil {
panic(err.Error())
}
var info buildInfo
err = json.Unmarshal(content, &info)
if err != nil {
panic(err.Error())
}
Archive(info)
Export(info)
Upload(info)
}
go run main.go
O(∩_∩)O
完