美文网首页iOS DeveloperGo语言iOS点点滴滴
Golang实现iOS自动打包并上传fir

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

作者: 慕_風 | 来源:发表于2018-07-11 10:10 被阅读48次

    前言

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

    相关文章

      网友评论

        本文标题:Golang实现iOS自动打包并上传fir

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