前言

作为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
      完