某小型公司持續集成工具 jenkins 實踐

來源:juejin.im/post/599fd5d151882524397f9fd3

前言

本文可能是網上最全的一篇全端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環境

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

配置插件

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>

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庫地址

下面配置觸發器,每隔1分鐘檢查一次git庫,也可以使用subscribe訂閱,這裡暫不做講解。

設置編譯後,將文件拷貝到一個文件目錄。這裡使用smb協議連接到了一個內網文件服務器上,方便測試部門測試。

至於具體為何執行2次拷貝,是因為項目同時編譯測試環境地址和真實環境地址,只有連接的服務器地址不通,其他代碼都相同,具體實現可看另外一篇博文:

https://juejin.im/post/59302a0fa22b9d0058b785bc

ios項目job

和安卓相同的源代碼管理及觸發器不做介紹,請參照安卓,下文同理。

這裡需要配置ios項目的tagert,可以通過xcode打開查看,勾選Pack application and build .ipa?,使jenkins生成ipa包

配置證書地址和密碼,這裡指的是Keychain

Keychain path默認地址為/Users/shaolei/Library/Keychains/login.keychain,其中shaolei為mac登錄的用戶名,密碼就是登錄密碼。失敗時郵件發送至影響代碼的配置請參照安卓,下文同理。

同時編譯兩個ipa包請查看:

https://juejin.im/post/59648bb05188250cf956e3ef

java項目job

因為公司人員少,項目版本如果讓開發去控制,比較繁瑣,每個開發得不停的增加版本號,這裡我使用jenkins去控制版本號,這樣也方便查詢和回滾代碼。

當然啦,實現war的升級和回滾可看另外一篇文章:

https://juejin.im/post/59633a126fb9a06ba024ffdd

當然了,這裡用到了幾個關鍵詞變量,是jenkins特有的,更多變量參照下文:

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