一、依賴環境
1. JavaSDK(Java SE Development Kit)
在終端命令行輸入java -version命令,如果打印出java版本,則代表已安裝,可以略過此步驟。
如果沒有安裝過,進入JavaSDK官網,接受協議,選擇 & 下載對應系統的 安裝包
下載完成,點擊安裝,安裝完成再次在終端中執行上面的命令,可以看到已安裝JavaSDK的版本
2. Apache
Mac系統自帶,略過
二、安裝Jenkins
1. 下載安裝Jenkins
方法有多種,暫以下載dmg客戶端為例
進入Jenkins官網,下載最新版本的Jenkins客戶端
雙擊下載好的dmg文件進行安裝,其將會自動生成全局變量jenkins
Jenkins默認安裝路徑:/Applications/Jenkins/jenkins.war
(如果下載.war格式文件,將文件復制到欲安裝文件夾即可)
修改參數: jenkins + 相關參數,如
jenkins –httpPort=8888#更換端口號,當默認端口8080被占用,或指定特定端口時。
2. 啟動Jenkins
如果是使用dmg文件安裝的,安裝完成之后,會自動啟動jenkins,打開瀏覽器,進入網頁 localhost:8080
終端命令
設置開機自啟動:sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
取消開機自啟動:sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
手動啟動:Java -jar jenkins.war
后臺啟動(默認端口):nohup java -jar jenkins.war &
后臺啟動(指定端口):nohup java -jar jenkins.war -httpPort=88 &
后臺啟動(HTTPS):nohup java -jar jenkins.war -httpsPort=88 &
注:可能出現連接不到服務器的問題,原因就是Java環境有問題,重新配置Java環境即可。
三、配置Jenkins
1、重啟電腦
重啟電腦之后,你會發現Jenkins給你的電腦新增了一個用戶,名字就叫Jenkins
打開localhost:8080,出現Unlock Jenkins(重設初始密碼)界面
密碼在/Users/userName/.jenkins/secrets/initialAdminPassword**文件(下圖標注紅色路徑)中,打開文件,復制密碼填到網頁密碼輸入框中,繼續
選擇建議安裝設置
安裝中
等待Jenkins重啟完成
創建管理員賬號:輸入用戶名、密碼、郵件等
創建完,進入Jenkins初始界面
2、管理插件
選擇“系統管理”——“管理插件”,進入插件管理界面(可以安裝、更新、卸載jenkins插件)
- √ Git插件: Git plugin
- √ Gitlab插件:GitLab Plugin 和 Gitlab Hook Plugin
- ? iOS專用:Xcode integration
- ? Android專用:Gradle 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
- 顯示代碼測試覆蓋率報表:Cobertura Plugin
- 來展示生成的單元測試報表,支持一切單測框架,如junit、nosetests等:Junit Plugin
- 其它:SSH Credentials Plugin
注:打√號的建議安裝,? 號按系統和編輯器安裝,其他 選擇安裝
3、系統設置
選擇“系統管理”——“系統設置”,進入系統設置界面(可以管理全局屬性、配置郵件通知)
全局屬性下面,勾選Environment variables,增加一對鍵值對:
- LANG = zh_CN.UTF-8
- PATH = (終端中執行 echo $PATH 命令的輸出,為一堆路徑)
4、新建項目
點擊“新建”或者“創建一個新任務”
輸入新項目名稱,選“新建一個自由風格的軟件項目”
點擊新建好的項目(第一次可能不需要吧,給忘記了,反正下一步是配置)
5、配置項目
點擊“配置”
進入配置界面,配置項目參數
A. General配置
注:這里可以設置包(構建)的保留天數和保留的最大個數
B. 源碼管理
由于現在我用到的是GitLab,先配置SSH Key
創建SSH證書:
- 終端執行:ssh-keygen -t rsa -C "xxx@xxx.com"(郵箱)
- 按回車保存到默認位置,再稍等出來提示輸入passphrase密碼短語,輸完按回車要輸兩遍(它是用來加密私鑰,也就是以后使用私鑰的時候要輸這個密碼,如果輸入,就需要記住,或者直接置空)
- 創建成功的SSH 默認路徑為 ~/.ssh 目錄
- id_rsa 文件存儲密鑰 ,id_rsa.pub存儲公鑰
添加SSH證書:
- 在Jenkins管理頁面,點擊“Credentials”后的Add按鈕
- Domain 選擇 “Global credentials (unrestricted)”
- Kind 選擇 “SSH Username with private key”,如下圖所示
- Username 隨意,自己可看懂的標識
- 復制id_rsa中的字符串到private key中,passphrase為創建SSH時,填寫的passphrase秘密(如果為空,則直接設置為空)
- 點擊“Add”,把SSH添加到Jenkins中
配置SSH也可以參考配置Git代碼倉庫
然后在“Credentials”處選擇剛添加的那個SSH配置。
如果配置正確的話,是不會出現下圖中的那段紅色的警告。如果有下圖的提示,就說明Jenkins還沒有連通GitLab或者SVN,那就請再檢查SSH Key是否配置正確。
C. 構建觸發器
構建觸發器設置這里是設置自動化測試的地方。這里涉及的內容很多,暫時沒有深入研究,有自動化測試需求的可以好好研究研究這里的設置。
- Build when a change is pushed to GitHub
當有數據推送到遠程庫中時構建 - Poll SCM (poll source code management)
輪詢源碼管理
需要設置源碼的路徑才能起到輪詢的效果。一般設置為類似結果: H/5 * * * * 每5分鐘輪詢一次 - Build periodically (定時build)
一般設置為類似: 00 20 * * * 每天 20點執行定時build
格式如下
分鐘(0-59) 小時(0-23) 日期(1-31) 月(1-12) 周幾(0-7,0和7都是周日) * 代表全部
D. 構建環境
iOS打包需要簽名文件和證書,所以這部分我們勾選“Keychains and Code Signing Identities”。
這里我們又需要用到Jenkins的插件,在系統管理頁面,選擇“Keychains and Provisioning Profiles Management”。
進入Keychains and Provisioning Profiles Management頁面,點擊“瀏覽”按鈕,分別上傳自己的keychain和證書。上傳成功后,我們再為keychain指明簽名文件的名稱。
- Keychain路徑
/Users/userName/Library/keychains/login.keychain - Provisioning Profiles路徑
/Users/userName/Library/MobileDevice/Provisioning Profiles
點擊“Add Code Signing Identity”,最后添加成功后如下圖所示:
這樣Adhoc證書和簽名文件就在Jenkins中配置好了,接下來我們只需要在item設置中指定相關文件即可。
回到我們新建的item,找到構建環境,按下圖選好自己的相關證書和簽名文件。
E. 構建
①增加構建步驟:Execute shell
作用:改變項目中的build號
#---------------進入項目工程根目錄----------------------------
cd $HOME/Home/workspace/${JOB_NAME}/xxx(工程名)
#---------------auto change versionNumber------------------
#/usr/bin/xcrun agvtool next-marketing-version -all
#---------------auto change buildNumber--------------------
/usr/bin/xcrun agvtool new-version -all $BUILD_NUMBER
②增加構建步驟:Execute shell
作用:打包,導出IPA
最好在xcode中設置scheme為shared,否則可能出現工程無scheme的錯誤
# 工程名
APP_NAME="xxx" #替換成你的工程名
# 證書
CODE_SIGN_DISTRIBUTION="iPhone Distribution: xxx Co., Ltd. (xxxxxx)" # 打包所用簽名證書
# info.plist路徑
project_infoplist_path="$HOME/Home/workspace/${JOB_NAME}/${APP_NAME}/${APP_NAME}/Info.plist"
#取版本號
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
#獲取日期
#DATE="$(date +%Y%m%d)"
ADHOC_PLIST_PATH="xxx/xxx/adhoc.plist"
#要上傳的ipa文件路徑
IPA_PATH="$HOME/Home/output/${JOB_NAME}/${bundleShortVersion}(${BUILD_ID})"
#創建IPA路徑文件夾
mkdir $IPA_PATH
#archive文件路徑
ARCHIVE_PATH="${IPA_PATH}/${APP_NAME}_${BUILD_ID}.xcarchive"
#進入工程目錄
cd $HOME/Home/workspace/${JOB_NAME}/${APP_NAME}
# xcodebuild -list命令可以查看 工程的:Targets、Configurations、Schemes
echo "=================清理工程================="
xcodebuild clean -target "${APP_NAME}" -configuration 'Release'
echo "=================解鎖鑰匙串================="
#解決:codesign"seckey api returned: -25308,(null)"
# *** 是一般為電腦登錄密碼
security unlock-keychain -p "***" "${HOME}/Library/Keychains/login.keychain"
echo "=================生成xcarchive文件================="
# 在xcode中設置scheme為shared,否則可能出現工程無scheme的錯誤
# 還可以添加其他參數,不設置的都是默認使用項目Build Settings里面的配置,包括 CODE_SIGN_IDENTITY 和 PROVISIONING_PROFILE
xcodebuild archive -project "${APP_NAME}.xcodeproj" -scheme "${APP_NAME}" -sdk iphoneos -configuration "Release" -archivePath "${ARCHIVE_PATH}"
echo "=================打包IPA================="
xcodebuild -exportArchive -archivePath "${ARCHIVE_PATH}" -exportPath "${IPA_PATH}" -exportOptionsPlist "${ADHOC_PLIST_PATH}"
adhoc.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>method</key>
<string>ad-hoc</string>
<key>compileBitcode</key>
<false/>
</dict>
</plist>
F、構建后操作
增加構建后操作步驟:Execute a set of scripts
建議勾選 Execute script only if build succeeds 只有構建成功,才執行構建后命令
Build steps => Execute shell
# 解決中文亂碼問題
export LANG="zh_CN.UTF-8" #zh_CN.UTF-8 en_US.UTF-8
# 解決 fir: command not found 問題(前提:安裝fir命令行工具 - gem install fir(再前提:安裝了ruby環境))
# /usr/local/bin/: 為fir工具安裝路徑(安裝完成fir時會有打印出來)
export PATH="/usr/local/bin/:$PATH"
APP_NAME="xxx"
# info.plist路徑
project_infoplist_path="$HOME/Home/workspace/${JOB_NAME}/${APP_NAME}/${APP_NAME}/Info.plist"
#取版本號
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
cd $HOME/Home/workspace/${JOB_NAME}
log=`git show -s --format=%B $GIT_COMMIT`
cd "$HOME/Home/output/${JOB_NAME}/${bundleShortVersion}(${BUILD_ID})"
fileName=`find . -name "${APP_NAME}.ipa"`
# 上傳IPA到fir平臺
fir p "$fileName" -c ${log} -Q -m "./${APP_NAME}_${BUILD_ID}.xcarchive/dSYMs/工程名.app.dSYM/Contents/Resources/DWARF/工程名" -P <bughd project id> -T <fir token>
# 設置上傳fir返回二維碼圖片名稱為qrcode.png
mv "./fir-${$APP_NAME}.png" "./qrcode.png"
# 設置構建版本描述信息為二維碼,掃碼可下載該構建版本
# 此設置無效,錯誤信息如下:
# [WARN] Failed to authenticate with your SSH keys. Proceeding as anonymous
# ERROR: No such job 'DESCRIPTION=<p>掃碼下載xxx(xx)</p><img src=./qrcode.png>'
# java -jar ${HOME}/Home/jenkins-cli.jar -s http://localhost:8080/ set-build-description DESCRIPTION="<p>掃碼下載${bundleShortVersion}(${BUILD_ID})</p><img src=./qrcode.png>"
解決 fir: command not found 問題
- 前提:安裝fir命令行工具 - gem install fir(再前提:安裝了ruby環境)
- /usr/local/bin/: 為fir工具安裝路徑(安裝完成fir時會有打印出來)
- export PATH="/usr/local/bin/:$PATH"
配置set build description 可以使用 HTML標簽
設置如下:
- Jenkins -> 系統管理 -> Configure Global Security
- Markup Formatter 選擇 "Safe HTML"
解決Unable to access jarfile jenkins-cli.jar 問題
- 進入 http://localhost:8080/cli/
Jenkins主網址,8080是默認端口 - 下載jenkins-cli.jar,并放到Jenkins的一個目錄下
1.右上角“可以下載jenkins-cli.jar”,點擊鏈接即可下載
2.比如我就放到了$HOME/Home目錄中了
3.修改文件擁有者和用戶組為jenkins - java -jar jenkins-cli.jar 中 jenkins-cli.jar 文件名 替換為 jenkins-cli.jar 文件的全路徑
注意:小心大坑,在Jenkins HOME目錄下新建文件(夾),權限要更改,否則會出現權限問題(Operation denied)