Golang实现iOS自动打包并上传fir

发布于 2018-07-13 作者 超级苦工 312次 浏览 版块 分享

前言

作为iOS客户端开发的小哥们,一定都有过一天给测试人员、产品组打包N次的经历。如果每次都手动打包的话,不仅浪费了开发人员的时间,让测试小姐姐煎熬等待也是件不厚道的事情。
所以自动化打包在此时就显得尤为重要了。有了自动化打包工具,开发小哥只需要运行打包工具,剩下的事情就交给自动化打包工具就好了。工具会自动打包,并将ipa包上传至fir,如果有需要还可以让工具自动发送消息通知测试小姐姐可以测试了。O(∩_∩)O哈哈哈~

基本命令

本次将使用 xcodebuild:命令, 生成Archive、导出ipa
(ps: 据说还有其他命令也可以实现,就让其他小伙伴来介绍吧。)
使用xcodebuild命令有两个步骤:
第一步:archive:编译打包成Archive 和Xcode操作「Product -> Archive」一致
xcodebuild archive -workspace xxx.xcworkspace -scheme xxx -configuration Release -archivePath ${ARCHIVE_PATH} CONFIGURATION_BUILD_DIR=${BUILD_DIR}

参数说明
-workspace:指定工作空间文件xxx.xcworkspace
-scheme: 指定构建工程名称
-configuartion: [Debug/Release]可选项,选择Debug或者Release构建
-archivePath: 保存生成.xcarchive包路径
CONFIGURATION_BUILD_DIR: build时的文件路径(主要包含.a文件、XXX.app文件和XXX.app.dSYM文件)如果不需要用到XXX.app.dSYM文件中的二进制文件(有些第三方崩溃统计需要用到此文件),可以不加此项。

第二步:export:将生成的xxx.xcarchive文件导出成xxx.ipa。和Xcode操作「Organizer -> Archives -> Export」一致
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportOptionsPlist ${EXPORT_OPTIONS_PLIST_PATH} -exportPath ${EXPORT_DIR}

参数说明
-archivePath: 第一步中生成xxx.xcarchive文件的路径
-exportOptionsPlist: 导出过程中需要的配置文件路径
-exportPath: 导出ipa的保存目录

特别说明
第二步中的配置文件特别重要,是你打包为测试包或者发布版本的关键。稳妥起见,请手动打包一次,从生成的目录中获取

以上两步就是自动化打包的核心,如果以上命令中有不明白或有误的地方,可通过命令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-cli上传ipa,需要下载安装fir-cli,请自行查看git,按说明安装。
上传命令 fir publish APP_FILE_PATH -T API_TOKEN

参数说明
APP_FILE_PATH: 生成的.ipa文件的路径
-T: fir账号的API Token
(publish的其他参数请查看文档)

在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即可完成自动打包并上传fir的全部流程。
也可以使用go命令将该工具生成为可执行文件。以后需要打测试包的时候,双击自动化打包工具就完成了所有流程,是不是很方便呢?

O(∩_∩)O
      完

收藏
暂无回复