前言
最近公司需求,需要部署jenkins方便運營自己打包不同渠道的apk去發(fā)布,我自己是在網(wǎng)上找了很多博客,最終發(fā)現(xiàn)他們的博客有些寫的不是很全或者說現(xiàn)在插件都更新了,不適用以前的老辦法了,所以我在這里重新寫一篇博客方便Android開發(fā)者部署jenkins以方便運營可以不依靠技術(shù)自主的去編譯apk去發(fā)布,當然,學會jenkins也會給你的簡歷上加分哦
1、Tomacat
Tomcat下載去下載Tomcat,下載解壓后進入bin目錄啟動startup.bat文件就可以啟動tomcat了
2、Jenkins
Jenkins下載去下載Jenkins,有兩種選擇,一種是 Long-term Support (LTS) 還有一種是Weekly,前者是穩(wěn)定版本,后者則是更新比較頻繁的版本,這里我們選擇LTS就好,下載后的安裝包解壓安裝,安裝完成之后找到tomcat目錄下的webapps下創(chuàng)建一個文件夾命名為jenkins,然后去jenkins安裝目錄下的war文件夾里的內(nèi)容全部copy至剛剛創(chuàng)建的jenkins文件內(nèi),這個時候打開在瀏覽器打開http://localhost:8080/就可以進入到j(luò)enkins頁面了,會讓你輸入密碼,你根據(jù)他生成的文件路徑去打開這個密碼文件把密碼輸入進去就會進入到這個界面

可能是英文的也可能是中文的,不管是什么語言,點擊左邊,安裝一些jenkins推薦的插件,這些插件安裝失敗可以重試,如果重試了一兩次之后還是失敗就不用管了直接進入下一步創(chuàng)建用戶,也可以使用admin,不過還是推薦自己創(chuàng)建用戶,后期權(quán)限管理方便一些
3、安裝插件
- Git plugin
- Gradle Plugin 這里下載1.26版本的
- description setter plugin
- build-name-setter
- user build vars plugin
- Post-Build Script Plug-in
- Branch API Plugin
- SSH plugin
- Scriptler
- Dynamic Parameter Plug-in
- Git Parameter Plug-In
如果某些插件找不到或者下載不了可以在這里下載,如果沒有積分可以私信我郵箱,我會發(fā)給你,csdn強制要求最低2積分,無法設(shè)置為免費,我也沒辦法,本地下載的插件可以通過系統(tǒng)管理>管理插件>高級>上傳插件來離線安裝插件
4、配置環(huán)境
需要額外配置gradle環(huán)境當然java環(huán)境和android sdk的環(huán)境也要配置,然后進入jenkins主界面
進入系統(tǒng)管理>全局工具配置>找到j(luò)dk、gradle、和git
-
別名可以隨意,地址就是你的jdk絕對路徑
-
git的name可以隨你的心意去命名路徑就寫你git.exe的絕對路徑
-
gradle的name也是隨意的,推薦配置多個版本的gradle,gradle默認路徑就在C:\Users(用戶名).gradle\wrapper\dists\下
cccc.png
然后回到主頁面>系統(tǒng)管理>系統(tǒng)設(shè)置
找到全局屬性設(shè)置勾選環(huán)境變量設(shè)置android sdk

開始創(chuàng)建項目
-
主頁面新建任務(wù),輸入項目名稱,然后選擇構(gòu)建一個自由風格的軟件項目后點確定
然后點擊源碼管理選擇git,svn也大同小異,先點擊add添加賬號密碼,然后再輸入你的項目地址


在kind項下你也可以選擇SSH Username with private key,選擇enter directly填入你的私鑰
#cat ~/.ssh/id_rsa.pub 是公鑰,#cat ~/.ssh/id_rsa是私鑰
填好之后就是這樣,下面的Branches to build 填你分支的名字

然后就點擊保存,回到項目主頁點擊Build with Parameters或是立即構(gòu)建按鈕開始構(gòu)建,構(gòu)建成功后在

可以看到,你們的可能是#1,然后回到j(luò)enkins的根目錄找到workspace目錄然后找到你的項目名字的文件夾不帶@tmp的文件夾,進去看看你們的代碼有沒有被拉下來,如果沒有或者配置失敗則檢查你的源碼配置或路徑
自定義參數(shù)







然后是構(gòu)建>增加構(gòu)建步驟>invoke gradle script

先解釋一下被紅色條遮住的內(nèi)容,這個內(nèi)容就是你新建項目的任務(wù)名稱其他的都一樣就行
${JENKINS_HOME}/workspace/替換為為你的任務(wù)名稱
${JENKINS_HOME}/workspace/替換為你的任務(wù)名稱/app/build.gradle
你也可以使用${JOB_NAME}自動去獲取任務(wù)名稱
${JENKINS_HOME}/workspace/${JOB_NAME}
${JENKINS_HOME}/workspace/${JOB_NAME}/app/build.gradle
下面解釋紅色箭頭和Tasks里的的內(nèi)容,然后打開你的AndroidStudio,打開你的項目,找到屬于Project properties的gradle.properties文件,打開它,然后增加如下參數(shù)
APP_VERSION = 1.0 //對應(yīng)你jenkins的選項參數(shù)APP_VERSION
IS_JENKINS = false //對應(yīng)你jenkins的選項參數(shù)IS_JENKINS
BUILD_TYPE = debug //與上方一一對應(yīng)
PRODUCT_FLAVORS = 你的渠道
CHANNEL=你的渠道
BUILD_PATH_JENKINS = F:\jenkins\workspace\你的項目名\jenkinsapk //你jenkins編譯后的路徑
BUILD_PATH_LOCAL = F:\jenkins\workspace\你的項目名\jenkinsapk\testjenkins //非jenkins編譯后的apk
BUILD_TIME= 2018-4-24 //對應(yīng)上方的BUILD_TIME選項參數(shù)
APPNAME = hbw //對應(yīng)上方的文本輸入?yún)?shù)
android.buildCacheDir=F:/AndroidStudio/build-cache-cache //可以不添加,如果編譯報錯需要添加這行,具體作用可以自己去stackoverflow上找
現(xiàn)在可以開始解釋紅色箭頭的作用了,它的作用就是把你jenkins填寫的內(nèi)容覆蓋到你的gradle.properties內(nèi),上面的NAME必須與gradle.properties內(nèi)的命名對應(yīng),你們可以隨意發(fā)揮想象,比如,因為我公司的特殊性,我們的渠道不是指的各大app store而是指的和我們公司合作的各大公司,所以我定義了一個Name為CHANNEL的文本參數(shù),這樣,運營就可以在jenkins上隨意輸入內(nèi)容,這樣他生成的APK的CHANNEL則會把我gradle.properties里的CHANNEL的內(nèi)容覆蓋掉,這樣我在我app的build.gradle里就可以這樣聲明

這樣我就可以在代碼內(nèi)部在BuildConfig類中取出這個自定義的渠道名稱,上面其他的APP_VERSION,APP_NAME之類的你們也可以隨意發(fā)揮想象,gradle本身就是一個框架,你們可以盡情發(fā)揮想象力去完成你們各自公司的不同的功能,不僅僅只是渠道,但是你們現(xiàn)在可能發(fā)現(xiàn)了,那上面的PRODUCT_VLAVORS和BUILD_TYPE參數(shù)和Invoke Gradle script下的Tasks里的clean assemble${PRODUCT_VLAVORS}${BUILD_TYPE}是什么意思啊,說這個意思之前得先普及一點 Gradle命令的知識
assemble命令用于打包,比如assembleDebug就可以編譯打一個debug包,assembleRelease就可以編譯出一個release包,除此之外,assemble還可以搭配productFlavors使用,比如你在gradle里設(shè)置設(shè)置了一個騰訊應(yīng)用寶

那么就可以通過assemble+你的渠道名字,如我們上面寫的應(yīng)用寶assembleyingyongbao或者assemble+你的渠道名+Release或Debug,也就是assembleyingyongbaoRelease 或assembleyingyongbaoDebug,當然assemble的作用遠不于此,更多的你們自己去發(fā)現(xiàn)
講完了這些知識有些人可能已經(jīng)懂了assemble${PRODUCT_VLAVORS}${BUILD_TYPE}是什么意思了,沒錯,就是${PRODUCT_VLAVORS}會獲得上面所選擇的你設(shè)置的渠道${BUILD_TYPE}則會獲得你上面選擇的Release或Debug,這樣就拼接成了assemble+渠道名+Release或Debug,這一點很多博客都沒有講清楚,還有一點需要注意,你PRODUCT_VLAVORS參數(shù)下的選項必須是你在app下的build.gradle腳本的productFlavors方法里聲明的渠道,比如我只聲明了yingyongbao,那么我的選項只能是有yingyongbao,因為assemble+你的渠道這條命令會去找這個task,如果沒有,則會報錯,到這里相信沒接觸過Jenkins的人都應(yīng)該對jenkins有一個大概的了解了,基本上這樣就會編譯出apk,如果你想控制編譯后的apk名字,則可以在app的build.gradle腳本內(nèi)這樣寫

因為我希望生成出來的apk名字為jenkins內(nèi)輸入的APP_NAME+_+jenkins內(nèi)輸入的CHANNEL,但是我還有個功能是生成apk后上傳到后臺的ftp服務(wù)器上,而服務(wù)器上是不能存在中文的,會不兼容,所以我首先判斷了一下是否為中文,如果是中文則把中文轉(zhuǎn)換成拼音,這個isChinese()和getChinesetoPinyin()方法是在android接口之上聲明的

大家看到了吧,所以,gradle可以讓你的構(gòu)建過程通過代碼來控制,所以推薦大家去學習一下gradle和groovy,為什么我要把大家都說的什么什么節(jié)點之下稱之為方法呢,原因就是你們可以ctrl+左鍵點擊android節(jié)點,productFlavors節(jié)點,compileSdkVersion、buildToolsVersion、defaultConfig、applicationId等等等等,實際上都是調(diào)用的gradle提供的api,如果你gradle聲明的參數(shù)有疑問,那么點進去,看看他的需要的參數(shù)要求,你就解決問題起來就會方便很多,基本上就是這些,剩下的就留給各位開發(fā)者自己想象。
構(gòu)建出apk后上傳到后臺的ftp或者sftp服務(wù)器
如果后臺是ftp服務(wù)器,則導入| publish-over-ftp/ |插件,具體的用法可以百度這個插件如何使用,因為我公司是sftp服務(wù)器,所以這里我拿publish-over-ssh/插件來演示
- 回到j(luò)enkins主頁面,系統(tǒng)管理>系統(tǒng)設(shè)置>Publish over SSH

- Name可以隨意填寫
- Hostname填寫需要連接ssh的主機名或ip地址,此處填寫應(yīng)用服務(wù)器IP(建議ip)
- Username填寫進入這個服務(wù)器的用戶名
- Remote Directory:遠程目錄(根據(jù)需要填寫文件傳到此目錄下)
- 然后點擊高級勾選Use password authentication,or use a different key
- Passphrase / Password填寫訪問服務(wù)器的密碼
- port填寫22,一般ftp端口是21,sftp服務(wù)器端口是22
- Timeout (ms)填寫超時

-
然后保存>回到主頁面>進入你的項目>配置>點擊構(gòu)建后操作
name選擇你剛才在系統(tǒng)設(shè)置里填的name,source files則填寫你apk生成的相對路徑,相對于jenkins的workspace里你的項目下,這樣我們后臺的sftp服務(wù)器的路徑(在系統(tǒng)設(shè)置里的Remote Directory)下會多出一個jenkinsapk文件夾,這個文件夾下會出現(xiàn)你生成的apk
-
Remove prefix和Remote directory的作用分別是刪除本地的的和服務(wù)器的目錄,可以不填寫,Exec command可以不填寫,這個警告不會影響編譯,然后我們就回到項目主頁點擊Build with Parameters或是立即構(gòu)建按鈕開始構(gòu)建
看到結(jié)尾的SUCCESS就代表我們就編譯并且上傳成功了
后言
jenkins的配置差不多就是這樣了,還有很多各種各樣的插件,比如釘釘?shù)模热缒憧梢圆皇褂胹sh插件,蒲公英和fir.im這兩個應(yīng)用內(nèi)測托管平臺也有相應(yīng)的插件可以構(gòu)建后直接上傳到他們的服務(wù)器,比如生成二維碼發(fā)郵箱,比如定時去構(gòu)建等等許多功能,都有不同的插件可以做到,只需要發(fā)揮你的想象力就可以搭建一個完全不需要技術(shù)人員維護的一個構(gòu)建平臺讓運營等不懂技術(shù)的人單獨做到生成apk >發(fā)布。





