转载

iOS自动化打包部署踩坑记

由于为了提高工作效率,采用自动打包来解决问题,一开始在网上也是找到了很多的教程,还是很有信心的完成这个踩坑,但是没想到坑比想象得多。有的文章甚至是抄袭、过时,导致没能按照教程直接实现。

网上的教程多数是jenkins的xcode插件、证书管理的教程,但是这里一个最坑的地方就是上传了描述文件的路径也无法进行识别,导致构建版本的时候无法正确配置证书,后来放弃了此方法。以及jenkins的安装方式也是各种坑,使用官网包安装之后执行脚本的时候经常出现权限的问题,无法通过更改权限来解决问题。坑很多,但是没有一一记录,本文采用jenkins+fastlane进行自动化打包,远程打包使用的局域网进行控制。本文讲述了一些环境的配置以及所遇到的坑。

安装Homebrew

  1. 查看安装脚本: https://raw.githubusercontent.com/Homebrew/install/master/install ,并复制全部内容保存为 brew_install.sh 文件

  2. 更换脚本 brew_install 中的以下部分,注意新版的 HomeBrew 中没有了 CORE_TAP_REPO 参数,变为: HOMEBREW_CORE_TAP ,下面第二行可能根据需要来更改

    BREW_REPO = "https://github.com/Homebrew/brew".freeze
    CORE_TAP_REPO = "https://github.com/Homebrew/homebrew-core".freeze
    复制代码

    更改为

    BREW_REPO="https://mirrors.ustc.edu.cn/brew.git".freeze
    CORE_TAP_REPO = "https://mirrors.ustc.edu.cn/homebrew-core.git".freeze
    复制代码
  3. 执行 brew_install 脚本(注意将xxx替换为文件真实路径):

    /usr/bin/ruby xxx/brew_install.sh
    复制代码
  4. 如果出现了以下情况:

    ==> Tapping homebrew/core
    Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
    复制代码

    我们之前切换了镜像源,但是还是会出现这个问题,也就是克隆homebrew-core出错,那我们就自己手动克隆:

    cd "$(brew --repo)"
    cd Library/Taps
    mkdir homebrew
    cd homebrew
    mkdir homebrew-core
    cd homebrew-core/
    git clone git clone git://mirrors.ustc.edu.cn/homebrew-core.git /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
    复制代码
  5. 安装完毕后可以执行: brew doctor 检查安装的brew是否有问题,会自动进行检查并安装缺少的部分

  6. 如果电脑已有homebrew,执行升级操作,如果出现下面错误字眼,不用折腾权限的问题了,老实重装吧:

    ERROR: /usr/local/ must be writeable!
    复制代码

    瞬间就想到是权限问题,有人直接找到那个文件夹进行更改权限,是不是发现没有权限:laughing:,于是乎就直接使用以下命令:

    sudo chown -R $(whoami) /usr/local
    复制代码

    接着你会发现丝毫没有作用,于是乎又找到了新的命令:

    sudo chown -R $(whoami) $(brew --prefix)/*
    复制代码

    :laughing::laughing:,还是没用,是不是觉得我的天啊,其实解决办法很简单,前面说的别折腾这么多,直接卸载重装吧

    卸载:grin::

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
    复制代码

    然后接着上面教程安装。

安装Java环境

  1. 因为 jenkins 需要在 Java 环境下运行,而且版本最好为 Java 8 (因为jenkins的需要的条件就是Java 8),否则可能会出现某些出乎意外的情况,例如下载插件可能会失败且进去后无法再下载安装

  2. 下载地址为:传送门

  3. 手动安装Java

安装jenkins

  1. 由于下载官网的安装包进行安装可能会出现jenkins运行时权限的问题、以及下载插件失败的可能性,所以最好是采用 Homebrew 方式安装。

  2. 执行安装命令: brew install jenkins 。还有一个长期支持的版本,在jenkins后面加 -lts 后缀,其他命令也需要加后缀**-lts**,长期支持安装命令: brew install jenkins-lts

  3. 完成后开始启用 jenkins

    第一种方式:jenkins
    第二种方式:open /usr/local/opt/jenkins/libexec/jenkins.war
    都是前台启动的,前者需要一个终端窗口来显示日志,关闭将会关闭jenkins,后者是隐藏的方式运行,可以关闭终端窗口
    推荐使用:brew services start jenkins
    此外还可以通过Mac系统的自带后台管理系统launchctl中的配置文件,存放于~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist,参数配置需自行google,brew的方式管理就是通过这个配置文件进行后台管理的,所以推荐使用这种方式
    复制代码
  4. 通过brew方式安装的jenkins目录存放于: ~/.jenkins , 工作空间路径: ~/.jenkins/workspace/

  5. 安装启动成功后会在终端显示初始密码,需要拷贝改密码进入jenkins,也可以在初始密码文件中拷贝初始密码:

    cat ~/.jenkins/secrets/initialAdminPassword
    复制代码
  6. jenkins 写脚本时需要设置环境变量,在终端输入如下命令,并将得到的环境变量设置到jenkins的全局环境变量中

    echo $PATH
    复制代码
  7. jenkins 写脚本时最好设置编码类型,且需注明脚本的工作路径

    export LANG=en_US.UTF-8
    export LANGUAGE=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
    
    ...
    
    cd $WORKSPACE #cd到工作路径
    ....
    fastlane xxx
    复制代码
  8. 无法在脚本里进行 **fastlane init **,所以在部署项目且为第一个项目时,cd到项目目录, sudo 命令执行:

    cd XXXX
    sudo fastlane init
    复制代码

    将在该目录下生成指定 fastlane 的配置文件,可以把事先准备的脚本配置复制fastlane目录下的 AppfileFastfile ,如果项目使用了 cocoapods 管理第三方库,还需在 Gemfile 配置文件添加一行:

    gem "cocoapods"
    复制代码

    当第二个项目部署时可以复制第一个项目的 fastlane 配置文件包括: GemfileGemfile.lockfastlane目录 两个文件一个目录拷贝至新的项目目录下,并更换 Appfilefastfile 的配置内容即可。

更新RubyGems

1.可能会由于版本的原因而无法安装fastlane,所以需要更新RubyGems。

2.淘宝维护的镜像源已不在维护,镜像源更改为: gem sources -a http://gems.ruby-china.com/

3.添加新镜像源(org的域名还在备案,所以用com):

gem sources -a http://gems.ruby-china.com/
复制代码

4.查看当前镜像源:

gem source -l
复制代码

5.删除老的镜像源:

gem source --remove https://ruby.taobao.org/
复制代码

6.如果安装或者升级的时候碰到权限不足的情况,如果使用 sudo 后还遇到这个情况:

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /usr/bin directory.
复制代码

使用如下命令解决:

gem update -n /usr/local/bin
复制代码

如果安装fastlane出错出现以下加载插件错误问题:

Error loading RubyGems plugin "/Users/yuguo/.rvm/rubies/ruby-2.2.2/lib/ruby/gems/2.2.0/gems/executable-hooks-1.3.2/lib/rubygems_plugin.rb": dlopen(/Users/yuguo/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/x86_64-darwin16/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
Referenced from: /Users/yuguo/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/x86_64-darwin16/openssl.bundle
Reason: image not found - /Users/yuguo/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/x86_64-darwin16/openssl.bundle (LoadError)
复制代码

重新安装最新Ruby版本:

curl -sSL https://get.rvm.io | bash -s stable
复制代码

如果出现以下字眼,执行第一条:

Please do one of the following:
* 'rvm reload'
* open a new shell
* 'echo rvm_auto_reload_flag=1 >> ~/.rvmrc' # for auto reload with msg.
* 'echo rvm_auto_reload_flag=2 >> ~/.rvmrc' # for silent auto reload.
复制代码
rvm reload
复制代码

列出Ruby的可用的版本列表

rvm list known 

#版本随自己选择
rvm install 2.6 
#查看版本号,如果为自己刚刚安装的版本则成功安装并应用最新版本
ruby -v
复制代码

接着上面的更新操作执行一遍就能安装fastlane了。

使用fastlane

  1. 安装fastlane的过程,使用gem安装,安装命令为:

    sudo gem install fastlane -NV -n /usr/local/bin
    复制代码
  2. 本地打包的话,可以在工程目录执行 fastlane init 命令进行初始化后,可以得到 Gemfile 、 fastlane/ 文件夹,如果使用的是 sudo 命令还会有一个 Gemfile.lock

  3. Gemfile文件配置如下:

    gem "fastlane"
    gem "cocoapods"` #当项目依赖了cocoapods管理第三方库需要添加这行
    复制代码
  4. fastlane/ 目录下的Appfile和 Fastfile 两个配置文件,其中 Appfile 的配置如下:

    app_identifier("com.xxx.xx.xxx") # 工程的Bundle id
    apple_id("xxxx@xx.com") # 苹果账号id,通常为邮箱
    复制代码
  5. Fastfile的配置如下:

    default_platform(:ios)  #申明打包平台
            platform :ios do
            
                desc "这是一个任务的描述介绍"
                lane :AP_Debug do       #这是申明一个fastlane命令,其中名称为 AP_Debug
                gym(
            
                    scheme: "AutoPackage",      #项目的target       
                    #导出ipa包类型,共有五种方案,分别为:app-store, ad-hoc, package, enterprise, development, developer-id
                    export_method:"ad-hoc",   
                    clean: true,                #打包前是否先clean一遍,一般打包前都是需要clean的
                    output_directory:"./build", #打包的ipa包存放目录
                    output_name:"AutoPackage-Beta.ipa",  #打包的ipa包名
                    #workspace: "xxx.xcodeproj", #打包的项目名称, xxx.xcodeproj 或者  xxx.xcworkspace
                    #slient: true, #是否不输出日志模式
                    #configuration: "Debug", #设置打包的类型
                    #buildlog_path: "xxx/xxx", #设置打包的日志存放目录
                    #codesigning_identity: "iPhone Developer xxx(xxx)", #设置当前打包模式的证书
                    #设置导出ipa的选项
                    export_options: {
                        #配置文件设置
                        provisioningProfiles: {
                        		#格式为 bundle id => 配置文件名称(不需要.mobileprovision后缀)
                            "com.xxx.xxx.xxx" => "xxx provision file name", 
                        }
                    }
                )
            end
            
            desc "这是一个新的项目"
            lane: xx_task_name do
            
            ......
            
            end
            
    end
    复制代码

6.执行上面定义的方法:

fastlane AP_Debug
复制代码

7.打包脚本需要导入当前电脑配置环境,可以在终端执行: echo $PATH , 把环境配置复制在打包shell脚本包

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export PATH=[上述环境配置]

echo $WORKSPACE;
cd $WORKSPACE;
#判断是否有fastlane配置文件
bundle exec fastlane fastfile_defined_name
复制代码

后记

因为ipa打包必须依赖于xcodebuild,而xcodebuild依赖于Mac OS系统,要么使用真机mac,要么使用配置高的服务器装虚拟机再装苹果系统。还有一些细节未填补,后续加上。

原文  https://juejin.im/post/5ca8c81e6fb9a05e6668ab56
正文到此结束
Loading...