傻瓜式-iOS自動化分發部署-持續化集成方案【Fastlane+蒲公英+Jenkins】

如需轉載請備註地址~ 謝謝 ~

技術資料分享www.jianshu.com/p/e162b6b19…html

關注公衆號獲取更多

使用初衷

公司產品版本比較多,不少版本都須要獨立化部署。致使產生了每一個地址須要打包,每次打包就是一件麻煩的事情,經常一下午的時間過去了卻都浪費在打包這件事情上了。So....研究了下Fastlane+Jenkins+蒲公英。能夠方便的發佈和管理版本。看到爬了不少坑。寫出來讓你們參考下,遇到問題了能夠私信我。盡我所能幫助你。java

基礎名詞

  • Ruby,一種簡單快捷的面向對象(面向對象程序設計)腳本語言
  • RVM是一個命令行工具,它容許您輕鬆地安裝,管理和使用從解釋器到多組gems多個ruby環境。
  • Gems RubyGems簡稱gems,是一個用於對 Ruby組件進行打包的 Ruby 打包系統。例如常常用的cocoapods就須要 gem 來管理。
  • Fastlane是Felix Krause大神寫的fastlane是一套使用Ruby寫的自動化工具集,用於iOS和Android的自動化打包、發佈等工做。
  • pgyer/fir 第三方發佈測試平臺。

爬坑攻略

若是你在安裝期間想很順利的話,請務必按照步驟去作,本教程只針對Mac。python

此文檔是二次更新的,由於第一次寫的時候,就根據安裝記錄寫出來了,第二次在別的機器上部署的時候,就出現了各類問題,就感受這是寫了個P啊。。。。P P P -_-~!git

因此此次就進行了二次加工,雖然變成了二手的,可是更有內涵哦~~~github

Ruby處理

使用Mac的小夥伴都應該能感覺的OSX的好處,本人對Mac中毒很深,要是讓我說一點什麼很差的話,就是價格過高。web

各類環境,系統都自帶了,ruby,python等等,且不會出現全家桶的問候。shell

迴歸正體接着說ruby,Mac系統自帶ruby,可是是給系統本身使用,權限很小,因此在平時使用過程當中,會出現不少問題,並且版本通常都比較低,因此大多人都在本身使用RVM來管理本身使用的ruby.數據庫

參照此文檔來安裝 RVM使用ruby 使用RVM來管理rubybootstrap

ruby安裝完成以後,來進行下一步。api

Fastlane 安裝初始化

image

  • 確保你已經安裝了最新版本的Xcode命令行工具:
xcode-select --install
複製代碼
  • 官方文檔支持三種方式安裝,我使用的是ruby,剛纔不是使用RVM來管理本身的ruby 麼,接下來咱們來安裝fastlane
方法 os支持 描述
Homebrew 蘋果系統 brew cask install fastlane
安裝程序腳本 蘋果系統 下載zip文件。而後雙擊install腳本(或在終端窗口中運行)。
RubyGems 帶有Ruby版本> 2.0.0 gem install fastlane -NV

若是使用的是系統自帶的ruby,可能會報錯沒有權限。

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory. ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /usr/bin directory.
複製代碼

查看本身是否使用的是本身管理的ruby

which ruby
> 返回/Users/seven/.rvm/rubies/ruby-2.4.1/bin/ruby
> 則說明已經使用RVM管理的Ruby了非系統自帶的。
> 若是是usr/bin這個目錄下的則說明還在使用系統自帶的,可能會出現一系列權限的問題,請更換。
複製代碼

若是你非要使用系統自帶的,也能夠,也可能出現問題,也可能沒事,跟系統版本也有關係,

下面給出系統自帶問題的一些些方法。如跟我同樣使用非系統自帶ruby,請跳過此步驟。

> 方法一:sudo gem install fastlane -NV //提高權限,部分系統權限仍是不夠。
> 方法二:安裝到別的目錄使用指定目錄安裝: sudo gem install -n /usr/local/bin fastlane
> 方法三:仍是使用RVM管理ruby
複製代碼
  • 初始化

安裝完畢後,在終端進入到你的項目目錄下。初始化fastlane

fastlane init
複製代碼

若是沒有報錯,就跳過此條繼續 報錯Exit status of command 'bundle exec pod install' was 1 instead of 0. bundler: failed to load command: pod (/usr/local/bin/pod) 解決方法:在項目根目錄下 fastlane/Fastfile 修改文件中的cocoapods ' cocoapods(use_bundle_exec: false)'

按照提示輸入開發者帳號(付費帳號) 輸入Bundle Identifier 用於初始化配置,後期可在配置文件改。隨便輸入 根據提供的信息,fastlane會自動爲您生成一個配置。

您能夠看到新建立的./fastlane目錄,包含Appfile和Fastfile文件。

最有趣的文件是fastlane/Fastfile,其中包含分發您的應用程序所需的全部信息。

這樣就完成了初始化

蒲公英插件安裝

初始化完畢後直接在終端輸入

//fastlane fastlane search_plugins//列出可用插件
fastlane add_plugin pgyer//安裝插件
複製代碼

image.png

插件安裝成功
./fastlane目錄下會生成Pluginfile的一個文件。
插件安裝不成功,就是fastlane安裝的有問題。

配置Fastlane


文件名 描述
Appfile 從 Apple Developer Portal 獲取和項目相關的信息 詳情
Fastfile 核心文件,存放lane任務
Deliverfile deliver的配置文件,從 iTunes Connect 獲取和項目相關的信息詳細
metadata 同步iTC中的元數據
screenshots 同步iTC中的截圖

fastlane工具集是配置fastlane最重要的

文件名 描述
match 證書和配置文件管理工具會重置證書,推薦新項目使用。🌟🌟🌟🌟🌟
cert 自動建立管理iOS代碼簽名證書,會去自動建立證書,永遠不會撤銷現有的證書。如不能建立會報錯。
sigh 用來建立、更新、下載、修復Provisioning Profile的工具
gym 自動化編譯打包工具.shenzhen的代替品.🌟🌟🌟🌟🌟
pem 自動生成、更新推送配置文件
produce 若是你的產品還沒在iTunes Connect(iTC)或者Apple Developer Center(ADC)創建,produce能夠自動幫你完成這些工做
deliver 自動上傳截圖,APP的元數據,二進制(ipa)文件到iTunes Connect
snapshot 自動截圖(基於Xcode7的UI test)
frameit 能夠把截的圖片自動套上一層外邊框
pilot 管理TestFlight的測試用戶,上傳二進制文件
boarding 創建一個添加測試用戶界面,發給測試者,可自行添加郵件地址,並同步到iTunes Connect(iTC)
scan 自動運行測試工具,而且能夠生成漂亮的HTML報告
spaceship 爲pilot,boarding和deliver等工具提供和 iTC 和 ADC 的交互API。spaceship原本是個獨立的項目,後來被Fastlane收編進來
WatchBuild 是一個獨立的iTC監控工具,開啓WatchBuild能夠監控iTC上的文件狀態,彈出MacOS自帶的Notification
supply Android自動上傳到Google Play工具(若是有時間,我想把國內提供API的Android Store都寫個插件自動上傳,這個問題從10年我剛開始工做就以爲是個痛點)
screengrab Android的自動截圖工具

關於fastfile:

  • 裏面存放了不少lane,每一個lane至關於按順序執行的工做流。每一個lane能夠存放多個action,action能夠看作具體的執行動做
  • 生命週期
執行順序 方法名 說明
1 before_all 在執行 lane 以前只執行一次
2 before_each 每次執行 lane 以前都會執行一次
3 lane 自定義的任務
4 after_each 每次執行 lane 以後都會執行一次
5 after_all 在執行 lane 成功結束以後執行一次
6 error 在執行上述狀況任意環境報錯都會停止並執行一次
  • 任務定義
定義 是否必須 說明 備註
desc false 方法描述 可屢次使用打到換行的目的
name true 方法名 符號化的方法名
options false 方法參數 返回 Hash 類型
task true 方法主體 參考 ruby 的方法代碼且支持 ruby 代碼
  • 一個簡單的lane
lane :deploy do
  # 執行 pod instasll
  cocoapods
  # 執行 carthage bootstrap
  carthage
  # 增長build版本號
  increment_build_number
  # 編譯代碼
  gym
  # 發佈到Apple Store
  deliver(force: true)
end
複製代碼
  • fastlane示例
  • 這個是我本身 配置到蒲公英的。同時導出ipa到./build文件夾下,以版本號和打包時間命名。這樣就保留了每一版本包了。

只須要項目根目錄下執行便可

fastlane topgyer desc:更新內容
複製代碼
desc "上傳到測試版本到蒲公英"
  desc "生成本地版本"
  lane :topgyer do|option|
    
    #自動增長build
    # increment_build_number

    #自動生成證書
    cert

    #自動生成配置文件
    # sigh(force: true)//我使用的是手動配置關閉這個。如需自動則打開便可

    #gym配置,打包輸出。

    #fastlane gym --export_method ad-hoc
    #fastlane gym --export_method enterprise
    #fastlane gym --export_method app-store
    scheme_name = "xxxx"//應用名詞

    #獲取version和build版本號
    version = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleShortVersionString")
    build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion")
    
    #導出路徑
    output_directory = "./build"
    
    #導出名稱
    output_name = "#{scheme_name}_#{version}_#{build}_#{option[:desc]}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"

    gym(
      export_method: "enterprise",//企業帳號
      scheme: scheme_name, //名詞
      clean: true,//是否清理上次編譯
      output_directory: output_directory,//導出路徑
      output_name: output_name//導出名詞
     )

    pgyer(api_key: "1212121", user_key: "121212", update_description: "#{option[:desc]}")//蒲公英設置查看key

  end
複製代碼
  • 手動配置證書。 fastlane初始化Gym

    fastlane gym init

    會生成一個Gymfile的文件。增長下面代碼,同時不要使用自動生成配置文件這個選項sigh(force: true)

export_options(
	 provisioningProfiles: { 
	"com.xxx.xxx" => "profilesName",#包名 證書配置文件名稱
	"com.xxx.xxxxxx" => "profilesName1"
  })
複製代碼
  • scheme 設置 沒有在gym或者fastfile寫應用的名字的話。打包的時候會自動檢測當前目錄下的文件。列出來供你選擇。
    也能夠設置一下在gym中直接賦值,或者fastfile中增長便可。
  • 關閉 Enable Bitcode.若是開啓會報錯。
  • 設置完成便可測試打包上傳到蒲公英fastlane topgyer desc:更新內容

Fastlane問題彙總

使用過程當中出現了不少問題,大部分問題都已經有人躺過水了,因此有問題先去看看issues

gym編譯報錯解決不了請先檢查三遍證書是否有問題

初始化報錯請檢查安裝路徑是否有問題。

問題 | 解決方案

---|--- ruby -v 版本低於2.0.0 | gem版本不對 請升級ruby請更新gems cocoapods沒有放到Gemfile中| Gemfile文件中增長cocoapods fastlane init 提示sudo|請檢查ruby路徑。若是沒問題請檢查user目錄下.bash_profile。環境變量設置是否有效。export PATH="HOME/.fastlane/bin:PATH" 若是初始化成功|其餘的問題大部分都是證書問題了。 The generated archive is invalid, this can have various reasons:Usually it's caused by the Skip Install option in Xcode, set it to NO |xcode中修改build settings Skip Install 選項爲NO

Jenkins持續集成


在持續集成(Continuous integration,簡稱CI)這塊,Jenkins無疑是目前使用的比較多的一個開源框架

jekins.png

JDK

系統要求:必須安裝JDK 1.5以上版本,推薦安裝最新版本的JDK[注意不支持java9]。能夠經過如下命令查看是否安裝JDK和JDK版本。JDK下載連接 如需卸載請看下文

java -version
複製代碼

1.png
JDK

  • java卸載方法 以Mac爲例子 [shift +cmd+g] 前往文件夾

1
刪除所選版本

  • 在系統偏好設置面板移除Java

Snip20180126_14.png

  • JDK安裝

下載完畢JDK後如圖按照提示安裝便可

Snip20180126_15.png
java

安裝 Jenkins

Jenkins的官網 下載最新的 war 包。

推薦使用【Long-term Support (LTS)穩定版】

war 包

下載完成後,打開終端,進入到 war 包所在目錄直接運行,也能夠將war包丟在Tomcat的webapp目錄下面。

終端方式執行如下命令:

java -jar jenkins.war//默認對端口是8080如需指定可更改
java -jar jenkins.war --httpPort=8888 //指定8888端口兩者選一便可
複製代碼

初始化Jenkins

待Jenkins啓動後,在瀏覽器頁面輸入如下地址:

http://localhost:8888//端口指定的多少寫多少
複製代碼
注意不要關閉終端

第一次運行會出現以下界面,提示須要填寫指定路徑文件裏面的內容(該內容也能夠在終端上面看到)。

jenkins.png

根據提示目錄打開initialAdminPassword文件,複製出密碼,填寫,Continue.

Jenkins用戶/secrets/目錄是沒有讀寫權限的。修改權限。

安裝推薦的插件
等待進度條完成···
建立管理員用戶
next
設置完成

這樣Jenkins初始化完畢了,能夠快樂的使用了。仍是介紹下如何使用吧。

Jenkins使用

  • 啓動方式

上文說了,如何初始化進入Jenkins,那麼若是我關了再次怎麼進入呢。別急hold~~~ 兩種方式均可以

  • 方式一 跟初始化同樣,進入war包所在目錄經過命令啓動,
java -jar jenkins.war
複製代碼
  • 方式二 運行命令來建立配置文件
sudo touch /Library/LaunchDaemons/org.jenkins-ci.plist
複製代碼

若是您使用了不一樣的用戶名,請務必在plist中使用它。須要指定用戶名,不然會以系統根用戶的身份運行,這會讓您在使用Jenkins時遇到麻煩

plist內容以下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>Jenkins</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpListenAddress=127.0.0.1</string>
      <string>--httpPort=8080</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>jenkins</string>
  </dict>
</plist>
複製代碼

如今能夠從新啓動或者運行下方命令來查看運行在http://localhost:8888的Jenkins 。

sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
複製代碼

Jenkins配置

系統管理

插件管理

使用默認方式安裝的基本插件都包含了,若是有須要能夠本身來管理插件

image.png

安全配置

在工做中可能要在Jenkins中建立用戶,這樣你的團隊的其餘成員就能夠訪問本身的工做。首先打開左側菜單中的「管理Jenkins」頁面,而後轉到「配置全局安全性」。

啓用安全性,若是不那麼將容許任何登陸用戶作任何事情。

  • 進入系統管理 -> Configure Global Security -> 點擊」啓用安全」 。啓用安全下面選擇,「Jenkins專有用戶數據庫」,勾選容許用戶能夠註冊。而後在「受權策略」中選擇「任何用戶能夠作任何事(沒有任何限制)」。固然,也可使用LDAP身份認證機制,直接使用外部統一的身份機制來作認證。
  • 返回註冊一個帳戶,登陸以後再次進入安全管理。勾選「登陸用戶能夠作任何事」,這樣就只有登陸用戶才能作操做了。

image.png

建立項目

  • 「新建」 —> 勾選「構建一個自由風格的軟件項目」
    Snip20180801_112.png
  • General
    image.png
  • 源碼管理--Git
    image.png
  • 設置源碼的倉庫,以便讓 Jenkins 知道咱們的 iOS 項目的代碼在哪裏。由於個人代碼放在本身的倉庫中(若是你用 Github 等其餘倉庫也是相似),因此要先告訴 Jenkins 如何獲取代碼。RepositoryUrl就是git地址

首先,咱們須要配置 SSH,咱們能夠在 Jenkins 的證書管理中添加 SSH。在 Jenkins 管理頁面,選擇「Credentials」,而後選擇「Global credentials (unrestricted)」,點擊「Add Credentials」,以下圖所示,咱們填寫本身的 SSH 信息,而後點擊「Save」,這樣就把 SSH 添加到 Jenkins 的全局域中去了。

Snip20180801_118.png

  • 類型SSH
  • userName 就是git中的名字 能知道是誰上傳下載的就能夠
  • PrivateKey ssh中的私鑰,/Users/用戶名/.ssh/id_rsa
  • Passphrase git密碼。
  • 關於如何獲取SSH你們能夠看文尾,熟悉的人應該都會,不在此介紹
  • 回到剛剛新建的任務中,在源碼管理中,選擇 Git,按下圖填好相關信息。注意:Credentials 不須要選擇。
  • 同時也試了使用帳號密碼的Credentials。選擇你帳號密碼建立的Credentials也能夠。默認使用上邊方法便可。

image.png

自動測試忽略,不須要設置觸發器。

構建環境設置

  • 直接用 fastlane 這個工具,因此這裏不須要特別設置。

構建設置

  • 選擇使用shell進行構建 更新內容本身維護
cd /users/xxx/xxx   //你項目根目錄
fastlane topgyer desc:更新內容!
複製代碼

構建後增長步驟

  • 能夠郵件通知人員,逗號隔開,通知構建失敗

來個總體截圖

12.png

開始構建

  • 返回面板會發現本身剛纔新建的任務

image.png

  • 點擊任務名稱進入詳情、能夠修改任務配置項和構建版本

image.png

  • 點擊構建
  • 休息一會
  • 登錄蒲公英就會發現多了一個版本。

構建日誌查看

  • 構建失敗或者想看到輸出的,能夠在任務詳情,構建歷史中,選擇構建中的版本。

image.png

  • 選擇Console Output便可看到控制檯輸出

image.png

  • 截取下最後輸出success送給你

image.png

節點管理能夠參考如下,暫時不介紹

blog.csdn.net/birthmarkqi… www.jianshu.com/p/047362b11…

附加 SSH

SSH keys

SSH key 可讓你在你的電腦和Code服務器之間創建安全的加密鏈接。 先執行如下語句來判斷是否已經存在本地公鑰:

cat ~/.ssh/id_rsa.pub
複製代碼

若是你看到一長串以 ssh-rsassh-dsa開頭的字符串, 你能夠跳過 ssh-keygen的步驟。

提示: 最好的狀況是一個密碼對應一個ssh key,可是那不是必須的。你徹底能夠跳過建立密碼這個步驟。請記住設置的密碼並不能被修改或獲取。

你能夠按以下命令來生成ssh key:

ssh-keygen -t rsa -C "你的郵箱@xx.com"
複製代碼

這個指令會要求你提供一個位置和文件名去存放鍵值對和密碼,你能夠點擊Enter鍵去使用默認值。

用如下命令獲取你生成的公鑰:

cat ~/.ssh/id_rsa.pub
複製代碼

複製這個公鑰放到你的我的設置中的SSH/My SSH Keys下,請完整拷貝從ssh-開始直到你的用戶名和主機名爲止的內容。

若是打算拷貝你的公鑰到你的粘貼板下,請參考你的操做系統使用如下的命令:

Windows:

clip < ~/.ssh/id_rsa.pub
複製代碼

Mac:

pbcopy < ~/.ssh/id_rsa.pub
複製代碼

GNU/Linux (requires xclip):

xclip -sel clip < ~/.ssh/id_rsa.pub
複製代碼
相關文章
相關標籤/搜索