前言
本文可能是網上最全的一篇全端jenkins部署解決方案介紹的文章,一直以來,領導都想解決程式碼提交和打包問題,尤其是小公司,打包流程混亂,造成線上版本和程式碼庫git或svn中程式碼不一致問題。加入jenkins陣營,解決眾多發包難題,顯得刻不容緩。
研究過程
剛開始,我一直在docker下安裝jenkins,按時長租用阿里的主機,用阿里容器服務做實驗,反覆建立docker容器,建立多個jenkins節點。結果發現,在容器中配置各種變數比較複雜,各種開發環境不易快速部署,當然啦,是剛開始的對jenkins研究過少造成的。後來我採用了windows主機,配java、maven、Android環境,踩了一路坑,終於搞定了。但是我知道ios開發和編譯必須使用mac系統,本來想增加一個jenkins節點來實現ios的編譯。當配置好之後,我突然改變了主意,與其兩臺電腦開著,不如索性把整個jenkins部署到mac系統下(畢竟我們公司暫時沒有c#工程)。於是,所有的操作,所有的環境我又折騰了一遍。下面我逐一講解最終mac下實現全端jenkins持續整合,當然不包含c#,一路踩坑下來,我覺得這都不是事,流程都差不多。
效果圖
安裝jenkins
我個人比較喜歡新事物,所以建議使用較高版本,我使用的2.61,目前最新版是2.75。
mac下使用brew安裝,終端執行
brew install jenkins複製程式碼
等安裝完成後,終端執行jenkins即可啟動。
jenkins複製程式碼
安裝 xcode
這個比較簡單,直接從appstore下載最新版即可。
安裝後,將公司專案拉入xcode,先保證專案在本機編譯,這裡我登入了app開發者帳號,以便下載各種證照及釋出。
安裝 Android studio
這個到這裡下載www.android-studio.org/
同理將本地專案拉入,執行。這一步主要是怕開發環境引起的坑,先把專案跑起來,後面坑會少點。
進入設定,複製出sdk檔案路徑,後面需要使用。我這裡是/Users/Shaolei/Library/Android/sdk
安裝git
因為我們公司用的是git,如果貴公司使用svn,則同理,只需保git或者svn命令可以敲出來即可。
我這裡的版本比較老,儘量使用新的,我懶得換了。
mac:~ shaolei$ git version
git version 2.11.0複製程式碼
安裝source tree
這是一個非常好用的git視覺化工具,改天會具體介紹它的強大功能。
這款軟體不是必須的,只是為了方便專案拉取,所以,你可以跳過此步驟。
配置jenkins環境
這裡才是至關重要的一項,本文的核心
配置外掛
- Android Emulator Plugin
Starts an Android emulator with given properties before a build, then shuts it down after.複製程式碼
- build timeout plugin
This plugin allows builds to be automatically terminated after the specified amount of time has elapsed.複製程式碼
- Email Extension Plugin
This plugin is a replacement for Jenkins's email publisher 複製程式碼
- Gradle Plugin
This plugin allows Jenkins to invoke Gradle build scripts directly.複製程式碼
- Keychains and Provisioning Profiles Management
This plugin integrates management of keychain and provisioning files for iOS and OSX projects.複製程式碼
- Maven Integration plugin
This plug-in provides, for better and for worse, a deep integration of Jenkins and Maven: Automatic triggers between projects depending on SNAPSHOTs, automated configuration of various Jenkins publishers (Junit, ...). 複製程式碼
- Pipeline
A suite of plugins that lets you orchestrate automation, simple or complex. See Pipeline as Code with Jenkins for more details. 複製程式碼
- Pipeline: GitHub Groovy Libraries
Allows Pipeline Grrovy libraries to be loaded on the fly from GitHub.複製程式碼
- SSH Slaves plugin
Allows to launch agents over SSH, using a Java implementation of the SSH protocol.複製程式碼
Subversion Plug-in
Timestamper
Adds timestamps to the Console Output複製程式碼
- Workspace Cleanup Plugin
This plugin deletes the project workspace after a build is finished.複製程式碼
- Xcode integration
This plugin provides builders to build xcode projects, invoke agvtool and package .ipa files複製程式碼
其中Android Emulator Plugin、Gradle Plugin是安卓必須外掛;其中Keychains and Provisioning Profiles Management、Pipeline、Xcode integration是ios編譯必須外掛;其中Maven Integration plugin、SSH Slaves plugin是maven專案必須外掛,其他的Email Extension Plugin這個是為了編譯失敗的時候通知具體提交程式碼開發人員郵件
配置系統設定
Local Maven Repository為maven倉庫地址;如果本機沒有安裝maven,可能需要增加maven倉庫;
下面需要加入安卓環境變數,即上文中提到的那個sdk地址;
這裡配置github地址,郵件使用者名稱密碼,注意發件人的郵箱必須上面jenkins註冊是管理員郵箱是一個,否則一直失敗,這裡是個坑。
增加計劃
Android 專案job
建立安卓job
配置專案的git庫地址
下面配置觸發器,每隔1分鐘檢查一次git庫,也可以使用subscribe訂閱,這裡暫不做講解。
設定編譯後,將檔案拷貝到一個檔案目錄。這裡使用smb協議連線到了一個內網檔案伺服器上,方便測試部門測試。
至於具體為何執行2次拷貝,是因為專案同時編譯測試環境地址和真實環境地址,只有連線的伺服器地址不通,其他程式碼都相同,具體實現可看另外一篇博文juejin.im/post/59302a…
ios專案job
和安卓相同的原始碼管理及觸發器不做介紹,請參照安卓,下文同理。
這裡需要配置ios專案的tagert,可以通過xcode開啟檢視,勾選Pack application and build .ipa?,使jenkins生成ipa包
配置證照地址和密碼,這裡指的是 Keychain
Keychain path預設地址為/Users/shaolei/Library/Keychains/login.keychain,其中shaolei為mac登入的使用者名稱,密碼就是登入密碼。
失敗時郵件傳送至影響程式碼的配置請參照安卓,下文同理。
同時編譯兩個ipa包請檢視juejin.im/post/59648b…
java專案job
因為公司人員少,專案版本如果讓開發去控制,比較繁瑣,每個開發得不停的增加版本號,這裡我使用jenkins去控制版本號,這樣也方便查詢和回滾程式碼。
當然啦,實現war的升級和回滾可看另外一篇文章juejin.im/post/59633a…
cd ${WORKSPACE}
mvn clean
cd ${WORKSPACE}/******/src/main/resources/
echo ${BUILD_NUMBER} >ver.xml複製程式碼
當然了,這裡用到了幾個關鍵詞變數,是jenkins特有的,更多變數參照下文:
CHANGE_AUTHOR
For a multibranch project corresponding to some kind of change request, this will be set to the username of the author of the proposed change, if supported; else unset.
CHANGE_AUTHOR_DISPLAY_NAME
For a multibranch project corresponding to some kind of change request, this will be set to the human name of the author, if supported; else unset.
CHANGE_AUTHOR_EMAIL
For a multibranch project corresponding to some kind of change request, this will be set to the email address of the author, if supported; else unset.
CHANGE_TARGET
For a multibranch project corresponding to some kind of change request, this will be set to the target or base branch to which the change could be merged, if supported; else unset.
BUILD_NUMBER
The current build number, such as "153"
BUILD_ID
The current build ID, identical to BUILD_NUMBER for builds created in 1.597+, but a YYYY-MM-DD_hh-mm-ss timestamp for older builds
…………………………………………等等複製程式碼
h5專案job
這裡我就用了zip打包,部署時使用zip解壓到指定目錄即可。
cd ${WORKSPACE}
echo ${BUILD_NUMBER} >ver.txt
zip -r h5.zip ./ -x .git\* -x README.md -x .project -x .gitignore
cp ${WORKSPACE}/h5.zip /Volumes/***/H5/h5-${BUILD_NUMBER}.zip複製程式碼
總結
本文全面講解了jenkins各專案持續繼承方案,因為涉及環境過多,坑還是比較多的,希望自行填坑。