iOS自動化打包部署踩坑記

幸福的小木子發表於2019-04-06

前記

由於為了提高工作效率,採用自動打包來解決問題,一開始在網上也是找到了很多的教程,還是很有信心的完成這個踩坑,但是沒想到坑比想象得多。有的文章甚至是抄襲、過時,導致沒能按照教程直接實現。
網上的教程多數是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!
    複製程式碼

    瞬間就想到是許可權問題,有人直接找到那個資料夾進行更改許可權,是不是發現沒有許可權?,於是乎就直接使用以下命令:

    sudo chown -R $(whoami) /usr/local
    複製程式碼

    接著你會發現絲毫沒有作用,於是乎又找到了新的命令:

    sudo chown -R $(whoami) $(brew --prefix)/*
    複製程式碼

    ??,還是沒用,是不是覺得我的天啊,其實解決辦法很簡單,前面說的別折騰這麼多,直接解除安裝重灌吧

    解除安裝?:

    /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,要麼使用配置高的伺服器裝虛擬機器再裝蘋果系統。還有一些細節未填補,後續加上。

相關文章