基於Jenkins搭建iOS持續集成開發環境

原創 2017-03-06php

關鍵點html

  • Jenkins安裝及配置
  • Pipeline建立及配置
  • ruby的版本管理工具rbenv安裝
  • fastlane安裝
  • 常見構建問題
  • 相關工具及技術網站推薦

CI持續集成

什麼是持續集成 ?java

持續集成: 是一種軟件開發實踐,團隊開發成員常常集成他們的工做,一般每一個成員天天至少集成一次,也就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘快地發現集成錯誤。團隊發現這個過程能夠大大減小集成的問題,讓團隊可以更快的開發內聚的軟件。
參考文章阮一峯日誌node

Jenkins安裝及配置

  • 經過pkg包安裝    在 Mac 環境下,咱們須要先安裝 JDK,而後在 jenkins 的官網 下載最新的 pkg 包,雙擊安裝便可。安裝好後在瀏覽器中輸入 localhost:8080 會出現如圖則表示安裝成功:
    啓動頁面ios

  • 經過war包安裝 若是Mac/windows上安裝了Tomcat 能夠直接將war包拷貝到tomcat/webapps,進入到war包所在目錄啓動Jenkins:git

    java -jar jenkins.war --httpPort=8080
  • 經過 [homebrew] (http://brew.sh/) 方式安裝github

    brew install jenkins
  • 經過Docker安裝
       首先在Docker官網下載安裝配置Docker, 而後參考此網站介紹在Docker環境下安裝Jenkinsweb

  • 默認配置 安裝好Jenkins後,選擇安裝推薦的插件便可:
    安裝默認插件chrome

  • 建立登陸用戶
    建立登陸用戶docker

  • Manage Jenkins
    Manage Jenkins Jenkins URL

  • 建立Node節點
       分佈式構建(在Jenkins的配置中叫作節點),分佈式構建可以讓同一套代碼在不一樣的環境(如:Windows和Linux系統)中編譯、測試等。
    Master節點:至關於Server的概念
    Slave節點:至關於Agent的概念
    更多介紹請查看Jenkins Master/Slave
    建立Node 建立Node 配置Node

配置Node時幾個重要參數介紹

  • Name:節點名稱
  • Description:節點描述,支持中文
  • Remote root directionary:節點的根目錄 (注意:若是目錄不存在,會自動建立目錄。可是必須對該目錄有讀寫權限,不然會報錯:hudson.util.IOException2: Failed to copy xxxx)
  • Labels:標記(又叫作標籤)用來對多節點分組,標記之間用空格分隔.例如'iOSMobile AndrodMobile',將會把一個節點標記上'iOSMobile'和'AndrodMobile'.
  • Launch method:運行方式有四個選項。建議選擇第一、2種方式配置。詳細以下: 【推薦】Launch slave agents on Unix machines via SSH 在Unix(包括Linux)機器上通 過SSH通道鏈接節點 (適用於Unix和Linux) Host:節點主機的ip地址 Credentials:憑據(若是爲空或者不可選擇,請在系統管理→Manage Credentials中配置。 Port:端口默認22

ruby環境安裝

   在mac上計算機已經安裝了ruby,在終端下輸入命令:ruby --version 爲了能更好的管理ruby版本,咱們使用rbenv工具

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv  
$ cd ~/.rbenv && src/configure && make -C src

   安裝成功後執行 rbenv init 按照終端輸出的提示將 eval "$(rbenv init -)" 拷貝到指定文件(注意: 若是你是使用的iterm2 則拷貝至~/.zshrc 不然拷貝至./bash_profile

配置好之後,從新開啓一個終端,咱們安裝ruby 2.4.0版本

$ rbenv install -l       # 查看ruby可用版本  
$ rbenv install 2.3.0   # 安裝ruby2.3.0  
$ gem install bundler  # 安裝ruby gems  
$ rbenv rehash        	 # 成功操做後,執行rehash操做  
$ rbenv global 2.3.0   # ruby 系統全局環境  
$ rbenv local 2.3.0     # ruby 本地環境  
$ rbenv shell 2.3.0     # ruby做用於當前終端環境

注意: 因爲rbenv可能與另外一個ruby環境管理工具rvm發生衝突,可使用rvm implode 完全刪除rvm

Pipeline 建立及配置

Pipeline建立
  1. 設置Pipeline名稱
  2. 選擇單線程Pipeline (在現目前項目中建立單線程已可以知足條件,多線程Multibranch Pipeline暫不知如何使用,後續補上)
  3. 建立Pipeline時,能夠根據一個已有的Pipeline建立
    建立Pipeline
Pipeline配置
  • General配置
    General配置
  • Build Trggers配置
    Build Trggers配置
  • Pipeline scripts
       配置以下,包含了:
    • 代碼檢出
    • 單元測試
    • 生成測試報告
    • 修改版本號
    • 功能測試
    • 構建
    • 發佈App
node('Mobile') {
    stage('SVN Checkout') {
        checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[credentialsId: 'sclocman', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://svn地址信息']], workspaceUpdater: [$class: 'CheckoutUpdater']])
        sh "svn upgrade #{HOME}/.JenkinsAgent"
    }  
    stage('Unit Testing') {
        dir('./fastlane') {
            // sh 'source ~/.bash_profile && bundle exec fastlane ios test'
        }
    }  
    stage('Generate Test Report') {
        dir('./fastlane') {
            // sh 'source ~/.bash_profile && bundle exec fastlane ios test_report'
        }
    }
    stage('Update the Version NO.') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios update_version'
        }
    }  
    stage('Functional Testing') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios function_test'
        }
    }  
    stage('Build') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios build config:Debug'
        }
    }  
    stage('Release Version') {
        dir('./fastlane') {
            sh 'source ~/.bash_profile && bundle exec fastlane ios deploy config:Debug' 
        }
    }
}

fastlane

$ xcode-select --install    #確保安裝了最新的xcode command line tools  
$  sudo gem install fastlane -NV   # 安裝fastlane
  • fastlane使用 首先進入你所在工程的目錄下,而後執行:
$ fastlane init

按照提示進行便可。成功後你的目錄工程下會多出一個fastlane目錄,更多fastlane使用請參考。

構建故障排查

  • 構建版本error #1

找不到打包的ipa,形成不能上傳蒲公英,couldn't open file "/Users/apple/.JenkinsAgent/workspace/locmanYZY-Test/fastlane/fastlane_build/fastlane/result/archive/Debug/ipa/Debug.ipa
緣由:未在Pipeline配置打包stage

#27

  • 構建版本error #2

打包未簽名,Code signing is required for product type 'Application' in SDK 'iOS 10.2
緣由:Agent機器爲配置對應證書及Profile

  • 構建版本error #3

Could not find lane 'ios build_app_for_simulator'. Available lanes: ios test, ios build_ipa, ios build_simulator_app, ios deploy_to_pgyer, ios update_build_number 緣由:stage配置執行的lane找不到,直接參考提示修改便可

![](http://upload-images.jianshu.io/upload_images/2010692-84a3e4a957aaaf3a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 構建版本error #4

    Runnning script '[CP] Embed pods Frameworks' 緣由:須要證書受權

  • 構建版本error #5

curl error SSLRead
配置curl ssl:

$ php -i |grep "SSL Version"  #看看SSL Version的信息
		SSL Version => SecureTransport
		
		// 執行下面命令
		$ brew tap homebrew/dupes
		$ brew tap homebrew/versions
		$ brew tap homebrew/php
		
		$ brew install --with-openssl curl
		
		$ brew install \
    			--with-apache \
    			--with-homebrew-curl \
   				--with-homebrew-openssl \
    			--without-snmp php55
    	$ php -i | grep "SSL Version"  #若是看到如下,則操做成功
		SSL Version => OpenSSL/1.0.1j
	```  
	 ![](http://upload-images.jianshu.io/upload_images/2010692-e5e8a70d4f1021ad.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

#### 結後語
- **相關工具推薦**

	* [iTerm 2](http://www.iterm2.com/downloads.html) 一款能夠替代Mac自帶終端的軟件,爲了使其用起來順手能夠參考[Mac配置終端環境 iTerm2 + Zsh + Oh My Zsh + tmux](http://www.tuicool.com/articles/FFN7Vbq)
	
	* [PostMan](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en) 接口測試工具,屬於chrome插件,也能夠是APP模式,可是須要安裝了chrome才能使用
	* [Atom](https://atom.io/) 用法等參考[Atom中文社區](https://atom-china.org/) ,[知乎](https://www.zhihu.com/question/22867204)上有對此款軟件的評價
	* [Sublime](http://www.sublimetext.com/)
	* [alfred](https://www.alfredapp.com/) 用了你就知道有多方便,付費版本功能更多,能夠自定義overflow
	
- **相關技術網站推薦**
	* [Thoutworks技術雷達](https://www.thoughtworks.com/radar) 同時能夠參考Thoutworks公司[逸言](http://agiledon.github.io/blog/2013/04/17/thoughtworks-developer-reading-radar/)的博客
	* [infoQ](https://www.infoq.com/) 實踐驅動的社區資訊站點,致力於促進軟件開發領域知識與創新的傳播,包含有:架構、移動、運維、雲計算、AI、大數據、容器等技術新聞,有中文版面
	* 有問題上 [stackoverflow](http://stackoverflow.com)
	* [ruby](https://ruby-china.org/) 瞭解學習相關ruby技術
	* iOS 測試相關技術學習

 	| 技術框架  | 單元測試       | 截屏測試        | 功能測試  |
	|--------| ------------- |:-------------:| :--------:|
	| Quick   | ✅ Swift(BDD)|   ❎          |     ❎   |
	| Nimble  | ✅ Swift(斷言)|  ❎           |     ❎   |
	| KIWI    | ✅ OC(BDD/斷言/Mock)|   ❎    |     ❎   |
	| FBSnapshotTestCase| ❎  |   ✅          |     ❎   |
	| Calabash | ❎           |   ❎          |     ✅   |
	| Appium   | ❎           |   ❎          |     ✅   |

   本文參考了不少blog、github、stackoverflow的文章及問題,感謝做者的分享!特別感謝ThoughtWorks的周教練耐心指導!本文提到的**後續補充問題及深刻詳解**將會持續更新,也歡迎各位修改文檔使其更加豐富細緻。
相關文章
相關標籤/搜索