@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
- 四種安裝方式:
- 離線安裝
## 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
- 在線安裝
## 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
- 基于 Tomcat 安裝
- 安裝并啟動 Tomcat;
- 從官網下載 jenkins.war至 $CATALINA_BASE/webapps,Tomcat 會自動部署;
- 瀏覽器訪問:http://centos:8080/jenkins/
- 免安裝方式
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
- 需要安裝至少java1.8 ,如果沒有安裝會有提示,下載jdk1.8
在這里插入圖片描述 - 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
- 命令行啟動Jenkins
$ jenkins
- 一切順利的話,打開瀏覽器輸入: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打包需要插件
- 管理本地的keychain和iOS證書的插件Keychains and Provisioning Profiles Management
- 用于xcode構建Xcode integration
安裝方式:
方案一:在可選中搜索插件名 ,勾選安裝。若安裝報錯(參照安裝Jenkins時不能聯網安裝插件問題解決),如果還不行,直接進入方案二。
方案二:去Jenkins-plug官網下載插件,然后選擇高級tab,上傳.hpi文件
6. IOS 打包前配置
-
配置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)
- 配置任務
然后創建一個任務,自由風格的任務,因為構建方法會有兩種,除了共同的地方,構建會分為兩部分解答,第一部分是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
- 先去下載fir插件
- 然后在Jenkins里面點擊系統管理->管理插件->高級,然后滑動到上傳插件那里,選擇剛才下載的插件,點擊上傳,等待上傳成功后,進入到你的項目配置里面滑動到最下面,也就是找到構建后操作,點擊增加構建后操作步驟,選擇Upload to fir.im,打開你的瀏覽器,打開fir官方網站,獲取方法見圖
- 然后輸入你的IPA/APK Files (optional)這個是你ipa的路徑,如果不選擇,會是Jenkins默認的路徑這里有fir的官方文檔,根據fir的官方文檔即可就可以Jenkins上傳到fir文檔到此為止關于Jenkins整合Xcode的配置項并自動上傳到蒲公英差不多就說好了。
10. 修改密碼
jenkins 密碼錯誤去掉密碼登錄(mac路徑為/Users/用戶名/.jenkins)
11. 相關配置
11.1 SSH Server配置
- 登錄jenkins -- 系統管理 -- 系統設置
-
在這里插入圖片描述
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/