1. 問題和思路
目前存在的問題:
- 打包操作由開發(fā)人員完成,這樣開發(fā)進度容易被打斷
解決問題的思路:
- 將打包操作交測試/產(chǎn)品/開發(fā)人員來完成,主要是測試/開發(fā)
按照以上的思路,那么jenkins+gradle的解決方案是比較經(jīng)濟的,實現(xiàn)起來難度不大,下面我們詳細介紹一下搭建過程
2. 搭建過程
2.1. 服務(wù)器的準(zhǔn)備
- 普通配置PC一臺
- 安裝ubuntu20.04(或者vmware 虛擬ubuntu也可以)
- 可配置上網(wǎng);關(guān)閉防火墻;開啟ssh服務(wù)
2.2 docker安裝jenkins
2.2.1 在ubuntu下安裝dokcer(略)
2.2.2 使用下面的命令拉取jenkins的docker鏡像,這里我是用的是lts的長期支持版本,你可以到j(luò)enkins官網(wǎng)自由選擇其他版本
sudo docker pull jenkins/jenkins:lts
2.2.3 配置宿主機映射到容器的目錄,之后jenkins的一些配置文件都將會存儲到該目錄下,這個目錄可以自己定,但是我建議遵守我這樣的規(guī)范,便于日后查找和管理
sudo mkdir /home/jenkins_home # 創(chuàng)建jenkins_home目錄
sudo chown zhq:zhq /home/jenkins_home #設(shè)置該目錄的所有者和所屬的組(zhq是常用登錄到機器的賬號)
ps zhq是常用登錄到機器的賬號,這樣為了避免一些有關(guān)操作權(quán)限的問題
2.2.4 啟動jenkins的docker鏡像,并設(shè)置相關(guān)參數(shù),參數(shù)解釋:
-d 表示以后臺模式運行
--name 為容器定義一個名字(后面可以代替容器id使用)
-p 表示映射容器的端口到宿主機的端口
-v 表示映射宿主機的目錄到容器的目錄
-u zhq 使用zhq用戶運行,與登錄到ubuntu的賬號一致,避免后面出現(xiàn)的一些執(zhí)行權(quán)限問題
-v /home/jenkins_home:/var/jenkins_home 映射jenkins_home,將數(shù)據(jù)存儲到宿主機,這樣配置就不會隨容器丟失
-v /var/run/docker.sock:/var/run/docker.sock 與 -v /usr/bin/docker:/usr/bin/docker 把宿主機docker 映射到容器內(nèi),可以直接在容器內(nèi)使用宿主機docker
-v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \ 容器內(nèi)docker運行需要的庫文件
-v /opt:/opt \ 自主安裝的一些運行時軟件(如java/maven/git...)
-v /etc/timezone:/etc/timezone映射時區(qū)文件,保證容器的時區(qū)和宿主機相同(官網(wǎng)的jenkins容器時區(qū)不是中國的時區(qū))
最后的jenkins/jenkins:lts是要啟動的鏡像
sudo docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -u $(id -u) \
-v /home/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
-v /opt:/opt \
-v /etc/timezone:/etc/timezone jenkins/jenkins:lts
ps: 可使用以下命令查看container 是否運行成功:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c20dfcbb16e jenkins/jenkins:lts "/sbin/tini -- /usr/…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkins
2.2.5 容器啟動后,就可以訪問ip:8080看到j(luò)enkins首次運行的首頁了,然后通過下面命令查看初始密碼,填入之后跳轉(zhuǎn)到安裝插件的頁面,選擇第一個就好,會默認安裝一些插件
sudo cat /home/jenkins_home/secrets/initialAdminPassword
ps: 上面路徑與在瀏覽器中訪問jenkins提示的地址不一樣哦,那個是container中的地址,我們要查宿主機中映射的地址,見上面的命令,不要搞錯。
2.2.6 插件安裝很慢,所以我們要設(shè)置的插件的國內(nèi)鏡像url進行提速,具體可參考文章:
https://www.cnblogs.com/hellxz/p/jenkins_install_plugins_faster.html
替換完成后,需要執(zhí)行以下命令,重啟容器:
sudo docker ps # 獲取container 的id
sudo docker container restart 獲取的container_id
再次訪問jenkins頁面可以發(fā)現(xiàn)插件安裝飛快
2.2.7 創(chuàng)建一個自由風(fēng)格的項目
- 在項目配置中,添加git地址,分支名稱
- 保存退出,回到項目列表,點擊右側(cè)的構(gòu)建按鈕
- 校驗代碼是否拉取成功
cd /home/jenkins_home/workspace
ls -l
drwxr-xr-x 12 zhq zhq 18 4月 21 16:28 HelloWorld # 如果展示了項目名稱,代表拉取代碼成功
- 暫停當(dāng)前操作,我們先在本地使用gradle打包,然后再和jenkins進行結(jié)合
2.3 gradle打本地包
2.3.1 下載解壓java SDK, Android SDK 和gradle
~$ mkdir soft
~$ cd soft
~$ wget ftp://biguser:www.jb51.net@big.gxkjbg.com:8021/201704/tools/jdk-linux-x64.tar.gz
~$ wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
~$ wget https://services.gradle.org/distributions/gradle-5.4.1-all.zip
~$ tar -zxvf jdk-linux-x64.tar.gz -C /opt/java/
~$ tar -zxvf android-sdk_r24.4.1-linux.tgz
~$ unzip gradle-5.4.1-all.zip
2.3.2 配置java,android環(huán)境變量
~$ sudo vim /etc/profile
在文件底部添加以下內(nèi)容:
export JAVA_HOME=/opt/java/jdk1.8.0_131
export PATH=${JAVA_HOME}/bin:${PATH}
export ANDROID_HOME=/home/zhq/soft/android-sdk-linux
保存退出后,導(dǎo)入新的配置:
~$ source /etc/profile
2.3.3 驗證
以我們當(dāng)前項目做例子,可執(zhí)行下面命令:
~$ ./soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/HelloWorld/build.gradle assemble_test
其中:
/home/jenkins_home/workspace/ 是文中jenkins用來存放項目代碼的目錄;
/HelloWorld/build.gradle 我們項目build.gradle所在目錄,如果打包其他項目應(yīng)做響應(yīng)替換;
assemble_test 是項目的buildType,一般都會有assembleDebug 和 assembleRelease,項目不同可能會有其他類型,比如我們用到的assemble_test
以上操作,有錯誤產(chǎn)生,和當(dāng)前所使用的android SDK 沒有升級相關(guān)版本有關(guān)系,由于下載的Android SDK無法啟動android SDK manger,所以我安裝了android studio,在啟動的時候提示指定SDK路徑,啟動已經(jīng)下載了的項目,按照提示更新SDK即可。
android studio 在ubuntu下安裝比較容易,在此不做詳細說明了。
2.4 把jenkins和gradle進行結(jié)合
2.4.1 把打包命令寫成一個腳本test.sh
#!/bin/bash +x
. /etc/profile
~/soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/HelloWorld/build.gradle
保存退出后,增加執(zhí)行權(quán)限:
chmod +x test.sh
2.4.2 在jenkins項目中添加構(gòu)建shell
把剛才文件的絕對路徑添加進去,下面我們就準(zhǔn)確的 掉坑里了 ,執(zhí)行項目構(gòu)建發(fā)現(xiàn)構(gòu)建失敗,提示test.sh沒有找到,這是因為jenkins執(zhí)行的時候,是在容器中進行的,我們剛才那個路徑在容器中不存在,我們需要把宿主機當(dāng)作一臺遠程機器ssh到機器上執(zhí)行腳本:
- 給jenkins安裝SSH插件
-
在系統(tǒng)管理-->系統(tǒng)配置中按照填寫宿主機ip/端口/憑證(登錄賬號密碼)如下圖
配置樣圖 - 保存退出,重新構(gòu)建
至此,這臺機器已經(jīng)可以成功打包了。
2.5 掃尾工作
- 安裝存放到指定位置
對于上面提到的test.sh可以進行修改,把apk放到指定位置,代碼修改如下:
#!/bin/sh +x
. /etc/profile
~/soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/Hellworld/build.gradle assemble_test
app_path='/home/jenkins_home/workspace/{項目apk存放的位置,根據(jù)項目不同進行修改替換}'
target_path='/home/zhq/webroot/apks/' # 此處是自定義存放位置
if [ "`ls -A ${app_path}`" = "" ];
then
echo "${app_path} is empty"
else
mv $app_path/*.apk $target_path
rm -rf $app_path/*
fi
- 把列表發(fā)布到網(wǎng)絡(luò),可以通過瀏覽器訪問:
- 使用docker 安裝lnmp服務(wù)器
- 映射apk存放目錄到nignx服務(wù)器
以上內(nèi)容不是很難,略掉了哈
3. 鳴謝
- 操作過程得到大神liuyanggofurther的大力支持,在此特別感謝
- 引用了大神們的神作,在此一并謝過,并附上鏈接
