利用jenkins+grdle完成Android項目打包

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 掃尾工作
  1. 安裝存放到指定位置
    對于上面提到的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
  1. 把列表發(fā)布到網(wǎng)絡(luò),可以通過瀏覽器訪問:
  • 使用docker 安裝lnmp服務(wù)器
  • 映射apk存放目錄到nignx服務(wù)器

以上內(nèi)容不是很難,略掉了哈

3. 鳴謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容