IOS項目(二)自動打包--Jenkins

@TOC

一,Jenkins概述

Jenkins 是一款流行的開源持續集成(Continuous Integration)工具,廣泛用于項目開發,具有自動化構建、測試和部署等功能。Jenkins起源于Hudson(Hudson是商用的),主要用于持續、自動的構建/測試軟件項目、監控外部任務的運行(這個比較抽象,暫且寫上,不做解釋)。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。

在這里插入圖片描述

二,Jenkins安裝

1. 下載Jenkins官網

2. 安裝 JDK/Maven

export JAVA_HOME=/usr/java/jdk1.8.0_111
export MAVEN_HOME=/opt/apache-maven-3.3.9
  • 四種安裝方式:
  1. 離線安裝
## http://pkg.jenkins-ci.org/redhat/
wget http://pkg.jenkins-ci.org/redhat/jenkins-2.39-1.1.noarch.rpm ## 下載(也可以Windows下載再轉過來)
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins.io.key ## 公鑰
sudo yum -y install jenkins-*.noarch.rpm


  1. 在線安裝
## http://pkg.jenkins-ci.org/redhat/
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
sudo yum -y install jenkins


  1. 基于 Tomcat 安裝
  1. 免安裝方式
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
sudo java -jar jenkens.war ## 啟動服務,直至看到日志 `Jenkins is fully up and running`
curl http://localhost:8080/ ## Jenkins 已就緒


3. 調整配置文件

## sudo vim /etc/sysconfig/jenkins
JENKINS_USER="root" ## 原值 "jenkins" 必須修改,否則權限不足
JENKINS_PORT="8080" ## 原值 "8080" 可以不修改
## 還有開啟 HTTPS 相關參數,此處不打算開啟,故不作說明


安裝目錄: /usr/lib/jenkins
工作目錄: /var/lib/jenkins(對應于環境變量 JENKINS_HOME)

4. 啟動

sudo systemctl enable jenkins
sudo systemctl restart jenkins

查看日志文件: sudo tail -f /var/log/jenkins/jenkins.log

啟動后會生成文件 hudson.model.UpdateCenter.xml,需要修改它,
否則瀏覽器首次進入時會卡在“Jenkins 正在啟動,請稍后…”

## 原值: http://updates.jenkins-ci.org/update-center.json
## 新值: http://mirror.xmission.com/jenkins/updates/update-center.json
## 或者: http://mirror.xmission.com/jenkins/updates/current/update-center.json
sudo cat /var/lib/jenkins/hudson.model.UpdateCenter.xml
sudo sed -i 's/updates.jenkins-ci.org/mirror.xmission.com\/jenkins\/updates/g' /var/lib/jenkins/hudson.model.UpdateCenter.xml
sudo cat /var/lib/jenkins/hudson.model.UpdateCenter.xml
sudo systemctl restart jenkins

5. 防火墻放行

### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
### 重啟生效: sudo systemctl restart iptables

6. 卸載

如果要重裝,或者本機不需要 Jenkins,可卸載:

sudo systemctl stop jenkins
sudo systemctl disable jenkins
sudo yum -y remove jenkins
sudo rm -rf /var/{lib,log,cache}/jenkins /usr/lib/jenkins /root/.jenkins
sudo rm -rf `sudo find /{etc,var,run} -name "jenkins*"`

7. mac 下安裝

  • 使用osx系統自帶的homebrew來安裝jenkins
  1. 需要安裝至少java1.8 ,如果沒有安裝會有提示,下載jdk1.8
    在這里插入圖片描述
  2. java安裝完畢,繼續下面步驟,鏈接 launchd 配置文件
$ ln -sfv/usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents  
//如果要其他機器也可以訪問,把ip地址改為廣播地址:--httpListenAddress=0.0.0.0
$ launchctl load~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
  1. 命令行啟動Jenkins
$ jenkins
  1. 一切順利的話,打開瀏覽器輸入:http://localhost:8080/
    就能看到jenkins已經運行起來了,如果你更換了端口就是你后來設置的端口。

接下來打開Jenkins后會讓去一個填寫password的頁面如下圖,存儲password的地方就是圖片上那行紅色字體目錄下,使用終端 cat + 紅色字體路徑就看到了

在這里插入圖片描述

然后將我們得到的password輸入到“Administrator password“中,即可進入如下界面,接著安裝一些建議的插件(左邊的),安裝過程中,有的插件可能會安裝失敗,強烈建議點擊右下角的重試,直到把建議安裝的都裝好。(因為我這邊安裝之后,在Jenkins插件管理安裝插件一直失敗,如果這一步沒把有些必須的插件裝好,如git,只能一個個下載上傳插件就很麻煩)

在這里插入圖片描述

插件安裝完成后,可能會卡在如下界面,不會自動跳轉,刷新下界面即可:


在這里插入圖片描述

在刷新后的界面中注冊,輸入用戶名和密碼,建議輸入后點藍色按鈕保存完成,如下:


在這里插入圖片描述

注冊成功后,點擊”Start using Jenkins”

三,Jenkins配置

1. 登錄

瀏覽器進入 http://centos:8080/
首次進入需要輸入初始密碼來解鎖,初始密碼查看方法: sudo cat /var/lib/jenkins/secrets/initialAdminPassword

在這里插入圖片描述

進入 Jenkins 定制界面,讓選擇 Install suggested plugins 或 Select plugins to install 時,兩者都不要選,直接關閉,下一個界面點擊“Start using Jenkins”;
在這里插入圖片描述

修改登錄密碼:主界面右上角“注銷”鏈接的左邊的用戶名下拉菜單中點“設置”。

2. 安全設置

默認情況下,任何用戶都可以使用 Jenkins 進行發布。
可以進入相關設置:系統管理 / Configure Global Security,
選擇 Jenkins專有用戶數據庫,不要選中 允許用戶注冊;
選擇 登錄用戶可以做任何事,選中 Allow anonymous read access

3. 插件安裝方法

  • 離線安裝:
    手工下載(*.hpi): http://updates.jenkins-ci.org/download/plugins/
    進入:系統管理 / 管理插件 / 高級,然后上傳插件進行安裝。
    無需重啟 Jenkins 插件即生效。
  • 在線安裝:
    進入:系統管理 / 管理插件 / 可選插件
    查找并勾選所需插件,點擊“直接安裝”;
    無需重啟 Jenkins 插件即生效。如遇失敗可重試或離線安裝。


    在這里插入圖片描述

4. 工具設置

進入:系統管理 / Global Tool Configuration
JDK 下不勾選“自動安裝”,指定別名=JDK-1.8.0.111, JAVA_HOME=/usr/java/jdk1.8.0_111
Maven 下不勾選“自動安裝”,指定別名=Maven-3.3.9, MAVEN_HOME=/opt/apache-maven-3.3.9
點擊 Save 按鈕。
重啟 Jenkins 后生效:sudo systemctl restart jenkins

在這里插入圖片描述

5. 安裝ios打包需要插件

  1. 管理本地的keychain和iOS證書的插件Keychains and Provisioning Profiles Management
  2. 用于xcode構建Xcode integration

安裝方式:
方案一:在可選中搜索插件名 ,勾選安裝。若安裝報錯(參照安裝Jenkins時不能聯網安裝插件問題解決),如果還不行,直接進入方案二。

在這里插入圖片描述

方案二:去Jenkins-plug官網下載插件,然后選擇高級tab,上傳.hpi文件

在這里插入圖片描述

6. IOS 打包前配置

  1. 配置Keychains and Provisioning Profiles Management
    接下來配置Keychains and Provisioning Profiles Management,根據順序選擇首頁>系統管理>Keychains and Provisioning Profiles Management如圖


    在這里插入圖片描述

    需要上傳login.keychain文件,該文件獲取方法,在終端中輸入:

cd ~/Library/Keychains

在終端鍵入ls詳見下圖


在這里插入圖片描述

將login.keychain文件upload之后,會出現下圖的界面,根據需要將證書添加進去即可,但是由于macOS10.12以及以后的系統里面沒有login.keychain文件,只有login.keychain-db,可以復制出來刪除-db,也可以創建一個快捷方式名字叫做login.keychain,upload就好了。(上傳keychain,路徑用自己改名后的那個)
關于code sign ident 這個怎么來的 其實只是在keychain中找到對應的證書完整復制名字貼進去即可


在這里插入圖片描述

然后添加Provisioning Profiles,上傳方法和上傳login.keychain一樣,去選擇Provisioning Profiles文件,然后upload,然后結果如下圖,藍色框內的是固定格式的/Users/用戶名/Library/MobileDevice/Provisioning Profiles (這是固定格式,只需要把用戶名替換成自己的mac用戶名即可,可以試著用終端一層層進入 cd /Users/用戶名/Library/MobileDevice)
在這里插入圖片描述
  1. 配置任務
    然后創建一個任務,自由風格的任務,因為構建方法會有兩種,除了共同的地方,構建會分為兩部分解答,第一部分是macOS10.12以前的構建方法,但是由于Jenkins的Xcode和Mac的系統版本問題,所以建議使用第二種方法。

創建一個自由風格的任務,然后在選擇丟棄舊的構建,至于天數和保持的最大個數,按照自己的需求來就好,如圖


在這里插入圖片描述
  • 源碼管理
在這里插入圖片描述

Git: 支持主流的github 和gitlab代碼倉庫。因我們的研發團隊使用的是gitlab,所以下面我只會對該項進行介紹。
Repository URL:倉庫地址Credentials:憑證。可以使用HTTP方式的用戶名密碼,也可以是RSA文件。 但要通過后面的"ADD"按鈕添加憑證。
Branches to build:構建的分支。*/master表示master分支,也可以設置為其他分支。
源碼瀏覽器:你所使用的代碼倉庫管理工具,如github, gitlab. URL:填入上方的倉庫地址即可。
Version: 8.7 這個是我們gitlab服務器的版本。
Subversion:就是SVN,這里不作介紹。

在Repository URL里面添加你的git地址,我這里添加的是http的,如果你的項目是使用的ssh的,那么就將git開頭的地址填寫上,然后店家Add添加你的git帳號,如果你的事ssh的,將ssh的密匙填寫上,具體的自己百度一下就好咯,我就不多寫了,結果如圖


在這里插入圖片描述
  • 構建觸發器
    構建觸發器,顧名思義,就是構建任務的觸發器
在這里插入圖片描述

觸發遠程構建(例如,使用腳本): 該選項會提供一個接口,可以用來在代碼層面觸發構建。這里不做介紹,后期可能會用到。

Build after other projects are built: 該選項意思是"在其他projects構建后構建"。這里不作介紹,后期可能會用到該選項。

Build periodically: 周期性的構建。很好理解,就是每隔一段時間進行構建。日程表類似 linux crontab書寫格式。如下圖的設置,表示每隔30分鐘進行一次構建。

Build when a change is pushed to GitLab:當有更改push到gitlab代碼倉庫,即觸發構建。后面會有一個觸發構建的地址,一般被稱為webhooks。需要將這個地址配置到gitlab中,webhooks如何配置后面介紹。這個是常用的構建觸發器。

Poll SCM:該選項是配合上面這個選項使用的。當代碼倉庫發生改動,jenkins并不知道。需要配置這個選項,周期性的去檢查代碼倉庫是否發生改動。

構建觸發器,也就是什么時候觸發自動打包我這里填寫的是H 20 * * 這個意思就是H小時然后,后面跟著數字,在后面就是日月年,代表的我認為是每次都觸發,也就是每天每月每年,但是Jenkins的時間不是絕對的,一般都是在隨機在半點,也就是設置20點,大概會在20:30分左右會觸發,如果需要兩個時間,那么格式可以這樣H 20,22 * * *結果如圖

在這里插入圖片描述
  • 構建環境
    在構建環境里面勾選Keychains and Code Signing Identities和Mobile Provisioning Profiles,Keychains and Code Signing Identities是打包需要的證書,Mobile Provisioning Profiles是打包需要的配置文件,都是可以自己選擇的
在這里插入圖片描述

7. iOS 打包構建

接下來就是構建了,因為Jenkins對新版的Xcode插件兼容不好,只能用腳本來打包,但是老版本的Xcode可以使用Jenkins的Xcode插件,下面將構建一為使用Xcode插件的,構建二是腳本的

7.1 使用Xcode插件

在構建里面點擊增加構建步驟,然后點擊Xcode.General build settings在Target里面填寫你的項目名稱,Clean before build勾選YES,勾選Pack application, build and sign .ipa?,然后會有新的選項Export method是你要打的包的類型,就是你在手動打包的時候選額的ad-hoc或者Appstore那四個選項,這個按照你要打的類型填寫,.ipa filename pattern是你打出包ipa的名字,我的這里填寫了項目名字和-$(BUILD_DATE),意思就是在后面追加時間,Output directory是導出ipa的目錄,如果不填寫,會在Jenkins默認的目錄.

在這里插入圖片描述

Code signing & OS X keychain options勾選Unlock Keychain?,在Keychain path那里填寫${HOME}/Library/Keychains/login.keychain,意思是找到你的login.keychain(登陸鑰匙串),如果你的是復制出來改的名字,那么就填寫你相對應的目錄,Keychain password就是你電腦的登陸密碼。詳見圖

在這里插入圖片描述

Advanced Xcode build options勾選Clean test reports?,如果你使用了cocoapods那么填寫Xcode Workspace File,如果沒有使用cocoapods填寫Xcode Project Directory,然后填寫Build output directory就是你到處ipa的路徑,


在這里插入圖片描述

完成之后,回到任務操作頁面,點擊立即構建,如果配置沒問題基本就能構建成功。


在這里插入圖片描述

偶爾會出現報錯,點擊任務編號,也就是上圖的#4#5#6,然后進入任務詳情頁,進入控制臺輸出看看哪里出了問題,我之前是報了profile文件不匹配的error(target填錯了),然后改了就好了

在這里插入圖片描述

對應目錄生成了文件,所生成的內容也是需要自己選擇配置的

對應目錄生成了文件,所生成的內容也是需要自己選擇配置的

7.2 使用腳本構建

蒲公英上傳請參考:蒲公英
因為Jenkins對現在的Xcode9插件兼容性不好,打不了包,所以我們使用了xcodebuild打包,下面是腳本:

#!/bin/sh  #因為Jenkins打包可能是自動的,那么build號是不會自己再去修改然后push到git上面的,所以這個buildPlist就是修改build號的路徑。 

buildPlist="/Users/apple/.jenkins/workspace/longxin_a/eCloud/Build/LongHu/Config/eCloud-Info.plist"  
#這個獲取現在的 月日時分 用它來做build號 
buildNumber=$(date +"%m%d%H%M") 
 #修改plist文件需要/usr/libexec/PlistBuddy -c命令,CFBundleVersion是修改的這個build號,
# $buildNumber是你要修改的數值,$buildPlist是你修改哪個地方的plist文件。
 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$buildPlist" 
 #這個是獲取當前的build號,本來是用來看看有沒有修改成功的 #newBuildName=$(/usr/libexec/PlistBuddy -c "print :CFBundleVersion" "$buildPlist")
  #這個是打印,帶自動換行的打印 
  echo $newBuildName  
   #因為我怕他修改plist的時候需要時間,所以索性在這里我讓他等了3秒,當然你也可以去掉 sleep 3  
   #這個buildPath是到時候我生成xcarchive文件的路徑和打ipa時候需要找到xcarchive的路徑 
   buildPath="/Users/apple/.jenkins/workspace/longxin_a/build/Release-iphoneos/eCloud.xcarchive"  
   #這個路徑是我生成ipa的路徑 ipaPath="/Users/apple/Documents/longhuBuild/" 
    #這個是ExportOptions.plist的路徑,有這個就不用在用腳本寫證書了,這個plist你只要手動打過包,那么在生成ipa的文件夾里面就會有,找一個自己不經常修改的地方放在那里,寫上這個路徑就好,當然如果你不想這么做,想用shell語言設置證書,我會在 問題 列表里面有介紹 
    exportOptionsplistPath='/Users/apple/.jenkins/workspace/ExportOptions.plist'  
    #因為我使用了cocoapods所以這里用的-workspace,如果你沒有使用cocoapods使用-project,下面的命令都一樣 #這個命令主要是用來clean,clean的是Release的路徑,clean的是/Users/app***eCloud.xcworkspace路徑的eCloud, 
    xcodebuild -workspace /Users/apple/.jenkins/workspace/longxin_a/eCloud.xcworkspace -scheme eCloud -configuration "Release" clean 
     #這個是生成xcarchive,Release的 
     xcodebuild -workspace /Users/apple/.jenkins/workspace/longxin_a/eCloud.xcworkspace -scheme eCloud -archivePath ${buildPath} -configuration "Release" archive  
     #這個是將xcarchive文件打包成ipa 
     xcodebuild -exportArchive -archivePath ${buildPath} -exportPath ${ipaPath} -exportOptionsPlist ${exportOptionsplistPath} -allowProvisioningUpdates


8. 郵箱通知

Jenkins是有郵件通知的。現在開始設置,首先你已經安裝了插件Email Extension Plugin,這個在插件那里直接安裝就好這是第一步;然后進入系統管理->系統設置找到Jenkins Location模塊,在系統管理員郵件地址填寫你的系統管理郵箱,這個郵箱是你發送通知郵件的郵箱,然后找到Extended E-mail Notification模塊

在這里插入圖片描述
在這里插入圖片描述

然后找到構建后操作,點擊增加構建后的操作步驟點擊Editable Email Notification,在Project From里面寫上管理者郵箱,也就是發送郵件的郵箱,然后點擊Advanced Setting;里面有三個選項,分別是你在系統設置里面勾選的那幾個,根據需求填寫就好,我這里填寫的是Always,也就是無論構建成功還是失敗,Recipient List是接收者的郵箱,這里多個郵箱用英文逗號隔開——’,’

在這里插入圖片描述

9. 上傳到fir

  1. 先去下載fir插件
  2. 然后在Jenkins里面點擊系統管理->管理插件->高級,然后滑動到上傳插件那里,選擇剛才下載的插件,點擊上傳,等待上傳成功后,進入到你的項目配置里面滑動到最下面,也就是找到構建后操作,點擊增加構建后操作步驟,選擇Upload to fir.im,打開你的瀏覽器,打開fir官方網站,獲取方法見圖
在這里插入圖片描述
  1. 然后輸入你的IPA/APK Files (optional)這個是你ipa的路徑,如果不選擇,會是Jenkins默認的路徑這里有fir的官方文檔,根據fir的官方文檔即可就可以Jenkins上傳到fir文檔到此為止關于Jenkins整合Xcode的配置項并自動上傳到蒲公英差不多就說好了。

10. 修改密碼

jenkins 密碼錯誤去掉密碼登錄(mac路徑為/Users/用戶名/.jenkins)

Jenkins 修改登錄密碼

Jenkins 卸載

11. 相關配置

11.1 SSH Server配置
  1. 登錄jenkins -- 系統管理 -- 系統設置
  2. 在這里插入圖片描述

    SSH Servers: 由于jenkins服務器公鑰文件我已經配置好,所以之后新增SSH Servers 只需要配置這一項即可。
    Name: 自定義,需要全局唯一。
    HostName: 主機名,直接用ip地址即可。
    Username: 新增Server的用戶名,這里配置的是root。
    Remote Directory: 遠程目錄。jenkins服務器發送文件給新增的server默認是在這個目錄。

四,IOS Jenkins打包

五,Jenkins打包

參考:大神:王克鋒 https://kefeng.wang/2017/01/06/jenkins/

http://blog.csdn.net/u014641783/article/details/50866196

https://blog.x1be.win/index.php/2018/06/19/jenkins%E5%AE%89%E8%A3%85%E3%80%81%E9%85%8D%E7%BD%AE%E3%80%81%E6%9E%84%E5%BB%BA%E3%80%81%E8%84%9A%E6%9C%AC%E3%80%81%E9%85%8D%E7%BD%AE%E9%82%AE%E7%AE%B1%E3%80%81%E4%B8%8A%E4%BC%A0fir/

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容