某小型公司持續整合工具jenkins實踐(JAVA WEB、Android、IOS、html)

邵磊發表於2019-03-04

前言

本文可能是網上最全的一篇全端jenkins部署解決方案介紹的文章,一直以來,領導都想解決程式碼提交和打包問題,尤其是小公司,打包流程混亂,造成線上版本和程式碼庫git或svn中程式碼不一致問題。加入jenkins陣營,解決眾多發包難題,顯得刻不容緩。

研究過程

剛開始,我一直在docker下安裝jenkins,按時長租用阿里的主機,用阿里容器服務做實驗,反覆建立docker容器,建立多個jenkins節點。結果發現,在容器中配置各種變數比較複雜,各種開發環境不易快速部署,當然啦,是剛開始的對jenkins研究過少造成的。後來我採用了windows主機,配java、maven、Android環境,踩了一路坑,終於搞定了。但是我知道ios開發和編譯必須使用mac系統,本來想增加一個jenkins節點來實現ios的編譯。當配置好之後,我突然改變了主意,與其兩臺電腦開著,不如索性把整個jenkins部署到mac系統下(畢竟我們公司暫時沒有c#工程)。於是,所有的操作,所有的環境我又折騰了一遍。下面我逐一講解最終mac下實現全端jenkins持續整合,當然不包含c#,一路踩坑下來,我覺得這都不是事,流程都差不多。

效果圖

jenkins首頁
jenkins首頁

構建歷史
構建歷史

安裝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

sdk路徑
sdk路徑

安裝git

因為我們公司用的是git,如果貴公司使用svn,則同理,只需保git或者svn命令可以敲出來即可。
我這裡的版本比較老,儘量使用新的,我懶得換了。

mac:~ shaolei$ git version
git version 2.11.0複製程式碼

安裝source tree

這是一個非常好用的git視覺化工具,改天會具體介紹它的強大功能。
這款軟體不是必須的,只是為了方便專案拉取,所以,你可以跳過此步驟。

配置jenkins環境

這裡才是至關重要的一項,本文的核心

配置外掛

下載外掛
下載外掛

  1. Android Emulator Plugin
     Starts an Android emulator with given properties before a build, then shuts it down after.複製程式碼
  2. build timeout plugin
     This plugin allows builds to be automatically terminated after the specified amount of time has elapsed.複製程式碼
  3. Email Extension Plugin
     This plugin is a replacement for Jenkins`s email publisher    複製程式碼
  4. Gradle Plugin
     This plugin allows Jenkins to invoke Gradle build scripts directly.複製程式碼
  5. Keychains and Provisioning Profiles Management
     This plugin integrates management of keychain and provisioning files for iOS and OSX projects.複製程式碼
  6. 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, ...).    複製程式碼
  7. Pipeline
     A suite of plugins that lets you orchestrate automation, simple or complex. See Pipeline as Code with Jenkins for more details.    複製程式碼
  8. Pipeline: GitHub Groovy Libraries
     Allows Pipeline Grrovy libraries to be loaded on the fly from GitHub.複製程式碼
  9. SSH Slaves plugin
     Allows to launch agents over SSH, using a Java implementation of the SSH protocol.複製程式碼
  10. Subversion Plug-in

  11. Timestamper

     Adds timestamps to the Console Output複製程式碼
  12. Workspace Cleanup Plugin
     This plugin deletes the project workspace after a build is finished.複製程式碼
  13. 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庫地址

配置專案的git庫地址
配置專案的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各專案持續繼承方案,因為涉及環境過多,坑還是比較多的,希望自行填坑。

相關文章