1. 程式人生 > >【iOS】Jenkins Gitlab持續整合打包平臺搭建

【iOS】Jenkins Gitlab持續整合打包平臺搭建

1. 相關概念

Jenkins

  • Jenkins,一個用Java編寫的開源的持續整合工具,提供了軟體開發的持續整合服務,可監控並觸發持續重複的工作,具有開源,支援多平臺和外掛擴充套件,安裝簡單,介面化管理等特點。更多介紹參考維基介紹.

Gitlab

  • GitLab是一個利用Ruby on Rails開發的開源應用程式,實現一個自託管的Git專案倉庫,可通過Web介面進行訪問公開的或者私人專案,更多介紹參考維基介紹.

持續整合

  • 持續整合, 簡稱CI(continuous integration).
  • CI作為敏捷開發重要的一步,其目的在於讓產品快速迭代的同時,儘可能保持高質量.
  • CI一種可以增加專案可見性,降低專案失敗風險的開發實踐。其每一次程式碼更新,都要通過自動化測試來檢測程式碼和功能的正確性,只有通過自動測試的程式碼才能進行後續的交付和部署.
  • CI 是團隊成員間(產研測)更好地協調工作,更好的適應敏捷迭代開發,自動完成減少人工干預,保證每個時間點上團隊成員提交的程式碼都能成功整合的,可以很好的用於對Android/iOS專案的打包.

蒲公英

  • 蒲公英(pgyer)為移動開發者提供App免費測試分發應用的服務平臺,支援iOS與Android,簡單兩步分發應用。類似的還有fir.im等.

2. 流程結構

簡單繪製了下Jenkins的一個流程,如下圖:

IBM Developer上也有一個看似更復雜一點的圖,如下圖

持續互動流程圖:

3.平臺搭建

Jenkins安裝和啟動

安裝:

  • 依賴於Java環境,首先安裝和配置Java環境
  • 官網下載Jenkins,雙擊安裝,如果是Mac電腦,會自動生成全域性變數jenkins
  • 修改引數: jenkins + 相關引數,如
    jenkins –httpPort=8888 #更換埠號,當預設埠8080被佔用,或指定特定埠時。

啟動

  • 手動啟動: java -jar jenkins.war
  • 後臺啟動(預設埠): nohup java -jar jenkins.war &
  • 後臺啟動(指定埠): nohup java -jar jenkins.war -httpPort=88 &
  • 後臺啟動(HTTPS): nohup java -jar jenkins.war -httpsPort=88 &

Jenkins外掛安裝

外掛安裝

操作: Manage Jenkins -> Manage Plugins -> Available -> Search -> Click to install,如下圖所示

實用外掛

  • iOS專用:Xcode integration
  • Android專用:Gradle plugin
  • Gitlab外掛:GitLab Plugin 和 Gitlab Hook Plugin
  • Git外掛: Git plugin
  • GitBuckit外掛: GitBuckit plugin
  • 簽名證書管理外掛: Credentials Plugin 和Keychains and Provisioning Profiles Management
  • FTP外掛: Publish over FTP
  • 指令碼外掛: Post-Build Script Plug-in
  • 修改Build名稱/描述(二維碼): build-name-setter / description setter plugin
  • 獲取倉庫提交的commit log: Git Changelog Plugin
  • 自定義全域性變數: Environment Injector Plugin
  • 自定義郵件外掛: Email Extension Plugin
  • 獲取當前登入使用者資訊: build-user-vars-plugin
  • 顯示程式碼測試覆蓋率報表: Cobertura Plugin
  • 來展示生成的單元測試報表,支援一切單測框架,如junit、nosetests等: Junit Plugin
  • 其它: GIT plugin / SSH Credentials Plugin

Jenkins系統設定

操作: Manage Jenkins -> Configure System

  • Jenkins內部shell UTF-8 編碼設定,如下圖所示

  • Jenkins Location和Email設定,如下圖所示

  • E-mail Notification,設定如下如所示

Jenkis系統設定3Jenkis系統設定3

Jenkins Jobs配置

Jobs基礎配置

配置編譯引數

例如,如果需要打包者自行選擇打包型別,如需要編譯Release/Debug/Test等不同版本的包,那需要配置Jobs的編譯引數,配置方法如下圖所示:

Jenkins編譯設定-引數設定2Jenkins編譯設定-引數設定2

你還可以配置一些其它引數,例如:

Jenkins編譯設定-引數設定3Jenkins編譯設定-引數設定3

配置完後,build介面中就會出現,如下如所示:

Jenkins編譯設定-引數設定1Jenkins編譯設定-引數設定1

配置匿名使用者許可權

後面打包的應用釋出時,如果懶得自己搭建伺服器,就用Jenkins的,但釋出出去的連結需要登入才能訪問,這時候你可以設定匿名使用者的訪問許可權,這樣匿名使用者可以下載訪問你提供的應用連結了,非常取巧的方法,如下圖:

Jenkins編譯設定-引數設定4.pngJenkins編譯設定-引數設定4.png

Jobs原始碼庫配置(Gitlab為例)

配置SSH

操作: Manage Jenkins -> Credentials -> Global credentials (unrestricted) -> Add Credentials

  1. 本機生成SSH:ssh-keygen -t rsa -C “Your email” , 生成過程中需設定密碼,最終生成id_rsa和id_rsa.pub(公鑰)
  2. 本機新增祕鑰到SSH:ssh-add 檔名(需輸入管理密碼)
  3. Gitlab上新增公鑰:複製id_rsa.pub裡面的公鑰新增到Gitlab
  4. Jenkins上配置金鑰到SSH:複製id_rsa.pub裡面的公鑰新增到Jenkins(private key選項)

新建Job

在Jenkins中,所有的任務都是以”Job”為單位的。在進行操作前,你需要新建一個Job,Job新建比較簡單,只需要在Jenkins管理的首頁左側,點選“New Job”,一般選擇free-style software project,再輸入Job的名字即可。

配置Gitlab

在新建的任務(Jobs)中,Gitlab原始碼配置如下圖:需要輸入git倉庫和build分支,公鑰使用上面配置SSH生成的公鑰。

Jobs觸發條件配置

Jenkins支援多種觸發器配置,包括:

  • 定期進行構建(Build periodically),定時器使用示例如下:

    H(25-30) 18 1-5: 工作日下午6點25到30分之間進行build
    H 23 1-5:工作日每晚23:00至23:59之間的某一時刻進行build
    H(0-29)/15 :前半小時內每隔15分鐘進行build(開始時間不確定)
    H/20 :每隔20分鐘進行build(開始時間不確定)

  • 根據提交進行構建(Build when a change is pushed to GitHub)

  • 定期檢測程式碼更新,如有更新則進行構建(Poll SCM)

Jobs構建方式/編譯 配置

Jenkins支援多種編譯配置方式,包括:

  • Xcode: iOS編譯配置(安裝Xcode integration外掛)
  • Invoke Gradle script: Android編譯配置(安裝Gradle plugin外掛)
  • Exceute Shell: 指令碼方式

對於iOS應用的構建,如果選擇Xcode方式構建,需要配置好開發者證書,具體參考後面簽名和整數問題。
推薦使用Exceute Shell方式,簡單有效。

Jobs構建後處理

Artifacts和郵件通知配置,參考下圖

Jenkins專案設定-Archive-minJenkins專案設定-Archive-min

可藉助Email Extension Plugin 外掛進行詳細配置,具體可參考此文

Jenkins專案設定-郵件-minJenkins專案設定-郵件-min

釋出

  • FTP伺服器, 最傳統的方式,可助蒲公英或者fir.im(安裝對應的Jenkins外掛)。
  • 專業的Artifacts儲存倉庫, 比如Nexus, Artifactory等。

iOS的釋出可能希望用到OTA,可參考此文

這裡分享一個我寫的shell指令碼模板(已開源),可以用於iOS的plist檔案自動建立以及OTA簡單釋出頁面的自動建立,參考此連結獲取原始碼, 歡迎Star.

自動生成一個簡單HTML介面,如下圖,點選Install即可安裝:

Jenkis釋出1Jenkis釋出1

注意,這裡iOS7.1以後限定必須要要用https,所以需要對jenkins設定下https,參考下面”後記” 中的Jenkins Https設定

Last Show

構建成功後最終的結果如下如所示:

4. 後記

簽名和證書問題(iOS)

Jenkins Https Support

查詢Jenkins Https相關命令:
java -jar jenkins.war –help | grep -i https

說明:下面以Mac為例.

KeyStore方式

  • 生成: keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass 密碼 -dname “cn=WEB”
  • 使用: java -jar jenkins.war –httpPort=-1 –httpsPort=8080 –httpsKeyStore=/目錄/keystore.jks –httpsKeyStorePassword=密碼。
  • 注意: 第一次使用時需要將”WEB”證書匯入,匯入步驟為:Chrome匯出證書 -> 安裝證書 -> 設定證書”全部允許”, 圖解步驟可參考下面實用參考中的第5篇文章.

Certificate方式

  • 生成:
  1. openssl genrsa -out server.key 1024
  2. openssl req -new -key server.key -out server.csr
  3. openssl x509 -req -in server.csr -signkey server.key -out server.crt
  • 使用:java -jar jenkins.war –httpsPort=8088 –httpsCertificate=/path/server.crt –httpsPrivateKey=/path/server.key
  • 注意:①同上 ②iOS手機需要匯入cer證書

實用參考

5. Refs

文章有更新, 請移步檢視

========  

相關推薦

iOSJenkins Gitlab持續整合打包平臺搭建

1. 相關概念 Jenkins Jenkins,一個用Java編寫的開源的持續整合工具,提供了軟體開發的持續整合服務,可監控並觸發持續重複的工作,具有開源,支援多平臺和外掛擴充套件,安裝簡單,介面化管理等特點。更多介紹參考維基介紹. Gitlab GitLab是一個利用

Jenkins Gitlab持續整合打包平臺搭建

更多精彩請直接訪問SkySeraph個人站點:www.skyseraph.com 相關概念 Jenkins Jenkins,一個用Java編寫的開源的持續整合工具,提供了軟體開發的持續整合服務,可監控並觸發持續重複的工作,具有開源,支援多平臺和

iOSJenkins持續集成iOS

edi 節點 path num nco visio os包 接下來 運行   今天項目經理說讓APP端做一下用Jenkins做持續集成,因為之前沒有做過,所以就開始了解,終於在鍵哥的幫助下,完成了持續集成的功能,感動的不行,在這裏感謝鍵哥。   因為公司的Jenkins是搭

jenkins+gitlab持續整合圖文教程

需要準備的環境:1、jdk2、maven3、git安裝jenkins2、穩定版本下載安裝:sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.re

關於持續整合打包平臺Jenkins配置和構建指令碼實現細節

在《使用Jenkins搭建iOS/Android持續整合打包平臺》一文中,我對如何使用Jenkins搭建iOS/Android持續整合打包平臺的基礎概念和實施流程進行了介紹。本文作為配套,對搭建持續整合打包平臺中涉及到的執行命令、構建指令碼(build.py),以及Jenkins的配置進行詳細的補充說明。

docker-compose 安裝Jenkins+gitlab持續整合

version: "3.1" services: namenode: image: jenkins/jenkins:2.83 container_name: jenkins ports: - 9090:8080 -

IOS使用jenkins進行持續整合2

上一篇,自己嘗試進行持續整合,研究的不深入,這兩天,為公司搭建持續整合環境,以及內部發布系統,瞭解的更多了,所以分享出來。 這篇主要介紹一些其他東西,不重複介紹上一篇的內容。 如果使用jenkins進行ios持續整合,需要xcode外掛支援,所以先下載xcode外掛,而且後

Jenkins+Gitlab+Sonar程式碼檢查平臺搭建-Jenkins定製發郵件

配置jenkins 配置enable的郵件外掛 配置job 最坑的是要改hosts(純屬集團郵件伺服器問題~) 來來來 程式碼走起我們測發郵件 yum -y install sendmail service sendmail restart 奪偉

Jenkins Pipeline+Maven+Gitlab持續整合構建

  1.以下全是個人理解,此文全是在實際工作環境中實現,如果您是想看著這篇部落格去練習,可能有些環境您沒法搭建(maven庫,編譯順序),得問問一個搞開發的朋友,開發得提供些東西,或者,您可以通過此文件,學習到pipeline指令碼的知識,您可以去除掉用mvn  build這一項,其他的

ansible+gitlab+Jenkins實現持續整合

ansible簡介:   一、ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。   二、ansible是基於模組工作的,本身沒有批

iOSXcode9 自動化指令碼打包

由於從Xcode8開始不再支援xcrun來匯出ipa包(不是完全不可用,需要手動拷貝Xcode7.x版本中的PackageApplication檔案到高版本Xcode中的對應的路徑下,路徑地址:/Applications/Xcode 7.3.app/Conten

gitlab + jenkins + salt持續整合

目的:主要是瞭解持續整合方面的知識,分析gitlab的對於svn的優勢,瞭解gitlab和jenkins的原理,再配合指令碼和salt做一個簡易的持續整合。環境我使用三臺機器做測試: 三臺機器系統都是c

AndroidJenkins自動化打包到蒲公英(Mac版)

最近專案不是很忙,所以花了兩天時間研究了一下android的自動化打包,方便別人也方便自己。 目錄 1、準備過程 (1)配置adb 如圖,可以開啟終端,輸入adb version檢視是否已經配置好adb,已經配置好的同志可以跳過此環

IOSIOS開發總結,持續更新...

給一個view截圖 UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UI

工程化知識點淺談持續整合與灰度釋出

一、持續整合       持續整合(Continuous integration,簡稱CI)是一種軟體開發實踐,即團隊開發成員經常整合它們的工作,通常每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘快地發現整合錯誤。許多團隊

06JenkinsGitlab 自動觸發構建以及釘釘通知

寫在前面的話   在某些時候,我們希望能夠實現這樣一個功能,當用戶提交東西到 gitlab 上的時候,希望它能夠自動觸發構建,釋出到我們需要的環境。 目前我們內部有做類似的需求:產品提交原型到 gitlab,然後 gitlab 分支變動觸發 Jenkins 構建,將最新的產品原型釋出到 ngi

iOS代理傳值與塊代碼傳值

ring 方法 nslog 設置代理 轉載 adf delegate alloc 代理傳值 主線程與子線程常常須要進行數據的傳遞。不同的類之間,不同的控制器之間都須要。 並且常常須要監聽一個動作的完畢。而後才去做對應事件。(代理是一對一的關系)。 一、代理傳值 代理

iOSUICollectionView自己定義Layout之蜂窩布局

with top http reserve src 布局 step object .com 網上的UICollectionView的Layout布局,其cell的形狀多為矩形和圓形。 本篇博文將正六邊形作為cell的基本形狀,為您展現獨特的蜂窩布局效果及實現源代碼。 幫

Jenkins怎麽啟動和停止服務

class jenkins配置 con 曾經 每次 一個 sta base dsm 筆者沒有把Jenkins配置到tomcat中,每次都是用命令行來啟動Jenkins。但是遇到一個問題:Jenkins一直是開著的,想關閉也關閉不了。百度了一些資料,均不靠譜(必須吐槽一下百

iOSUIDynamicAnimator動畫

set translate logs enc ica cgpoint isp mat .cn 創建動畫 1 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:sel