一.Java環(huán)境配置
1.1 安裝SDKMAN
#如果沒(méi)安裝unzip的話(huà)
$ yum install unzip
$ yum install zip curl -s [https://get.sdkman.io](https://get.sdkman.io) | bash
安裝完畢后初始化sdkman的配置
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
注意://如果沒(méi)有權(quán)限 前面加 sudo
$ sudo source "$HOME/.sdkman/bin/sdkman-init.sh"
1.2 安裝Java
#查看可安裝java
$ sdk list java
選取Java版本并安裝(我選擇的是8.0.191-oracle)
$ sdk install java 8.0.191-oracle
注意:
1.利用sdkman安裝的sdk,不需要手動(dòng)配置全局環(huán)境(sdkman已經(jīng)自動(dòng)配置)
2.安裝位置為/root/.sdkman/candidates/java
二.安裝git
$ yum install git
三.安裝Android編譯環(huán)境
3.1從官方網(wǎng)站下載命令行工具最新版 https://developer.android.com/studio/index.html
(我將Android的tools放在/user/local/bin/android-sdk目錄內(nèi))
$ cd /user/local/bin
$ mkdir android-sdk
選取最新版tools下載(當(dāng)前為sdk-tools-linux-4333796)
$ wget --output-document=android-sdk.zip --quiet https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
3.2 更新SDK
unzip 一下后進(jìn)入目錄(android命令已過(guò)期,建議用/tools/bin/sdkmanager命令工具)
選擇更新自己需要的build-tools以及sdk(我需要的是android-28)
$ ./android update sdk --no-ui --all --filter android-28,platform-tools,build-tools-28.0.3,extra-android-m2repository
在64位的機(jī)器上運(yùn)行android的工具需要安裝一些32位的庫(kù):
$ yum install glibc.i686 libgcc.i686 libstdc++.i68
如果在安裝libgcc的時(shí)候提示版本沖突,請(qǐng)更新系統(tǒng):
$ yum update
3.3 安裝NDK
#進(jìn)入android-sdk目錄
$ cd /usr/local/bin/android-sdk
選擇最新版ndk下載(當(dāng)前版本為android-ndk-r16b-linux-x86_64)
$ wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip
#解壓
$ unzip android-ndk-r16b-linux-x86_64.zip
#刪除
$ rm -f android-ndk-r16b-linux-x86_64.zip
#重命名
$ mv android-ndk-r16b android-ndk
3.4 配置環(huán)境變量
$ vim /etc/profile
在最后增如下配置
export ANDROID_HOME=/usr/local/bin/android-sdk
export ANDROID_NDK_HOME=/usr/local/bin/android-sdk/android-ndk
PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/28.0.3:$ANDROID_NDK_HOME:$PATH
#刷新
$ source /etc/profile
四.安裝Jenkins
4.1 安裝
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
$ yum install jenkins
4.2 配置
$ vim /etc/sysconfig/jenkins
監(jiān)聽(tīng)端口
JENKINS_PORT="8080"
4.3 配置權(quán)限
為了不因?yàn)闄?quán)限出現(xiàn)各種問(wèn)題,這里直接使用root
修改用戶(hù)為root
$ vim /etc/sysconfig/jenkins
修改配置
JENKINS_USER="root"
4.4 修改目錄權(quán)限
$ chown -R root:root /var/lib/jenkins
$ chown -R root:root /var/cache/jenkins
$ chown -R root:root /var/log/jenkins
4.5 重啟
$ service jenkins restart
#查看是否啟動(dòng)成功
$ ps -ef | grep jenkins
4.6 錯(cuò)誤排查
如果遇到錯(cuò)誤信息為
Starting Jenkins bash: /usr/bin/java: No such file or directory
這是java環(huán)境配置的問(wèn)題。
找到你的jdk目錄,創(chuàng)建軟鏈接即可:
$ ln -s /root/.sdkman/candidates/java/current/bin/java /usr/bin/java
4.7 訪問(wèn)
訪問(wèn)jenkins地址
http://xxx.xxx.xxx.xxx:8080
注意: 如果修改端口后啟動(dòng)不了,記得把防火墻端口打開(kāi)(阿里云則新增相關(guān)安全組規(guī)則,打開(kāi)端口)
五. 配置Jenkins
5.1初始化Jenkins
按照提示
- 5.1.1復(fù)制initialAdminPasswor
$ cat /var/lib/jenkins/secrets/initialAdminPassword
- 5.1.2選擇“安裝推薦的插件”
5.2 全局工具配置內(nèi)增加JDK配置
系統(tǒng)管理->全局工具配置->JDK
name:JDK
JAVA_HOME:/root/.sdkman/candidates/java/current

注意:gradle、git等不需要配置,用默認(rèn)值即可
5.3 系統(tǒng)設(shè)置內(nèi)增加Andriod環(huán)境變量
系統(tǒng)管理->系統(tǒng)設(shè)置->環(huán)境變量
ANDROID_HOME:/usr/local/bin/android-sdk
ANDROID_NDK_HOME:/usr/local/bin/android-sdk/android-ndk

六. Jenkins新建任務(wù)
6.1 新建任務(wù)
-
6.1.1 new 任務(wù)->輸入item name->“構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目”
new 任務(wù) -
6.1.2配置git地址
輸入項(xiàng)目的git地址,并新建Credentials,將你的用戶(hù)名密碼填進(jìn)去保存即可
Credentials -
6.1.3 填好branch分支(比如master等)
git
6.2 新增gradle編譯
-
6.2.1 Add build setp->InvokeGradle script
gradle - 6.2.2 選擇Use Gradle Wrapper
-
6.2.3 Tasks填寫(xiě)你需要跑的gradle命令
gradle wrapper
注意:此處要選擇“Use Gradle Wrapper”,這樣可以根據(jù)項(xiàng)目的gradle版本自動(dòng)適配。也可以省去配置gradle的麻煩。
七. 上傳fir或者蒲公英pgyer
這兩個(gè)都情況比較類(lèi)似,只要安裝相應(yīng)的Jenkins插件并配置一下即可。步驟比較簡(jiǎn)單,不再展開(kāi)。
相應(yīng)文檔:
八. 上傳七牛
七牛提供一個(gè)shell工具qshell
我們利用此工具完成jenkins打包上傳,具體見(jiàn):
8.1 下載qshell并上傳到服務(wù)器相應(yīng)目錄
- 8.1.1服務(wù)器新建qiniu目錄
$ cd /var/lib/jenkins/workspace
$ mkdir qiniu
- 8.1.2本地下載qshell_linux_x64并重命名為qshell
- 8.1.3利用scp將qshell_linux_x64上傳到/var/lib/jenkins/workspace/qiniu
$ scp /path/qshell username@servername:/var/lib/jenkins/workspace/qiniu
- 8.1.4配置qshell環(huán)境變量
$ vim /etc/profile
#將qshell路徑添加進(jìn)path內(nèi)
export ANDROID_HOME=/usr/local/bin/android-sdk
export ANDROID_NDK_HOME=/usr/local/bin/android-sdk/android-ndk
export QSHELL=/var/lib/jenkins/workspace/qiniu
export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK_HOME:$ANDROID_HOME/build-tools/28.0.3:$QSHELL:$PATH
#刷新
$ source /etc/profile
8.2 新增upload.conf 上傳配置文件
在/var/lib/jenkins/workspace/qiniu目錄內(nèi)
$ cd /var/lib/jenkins/workspace/qiniu
$ vim upload.conf
{
"src_dir" : "/var/lib/jenkins/workspace/qiniu/apk",
"overwrite":true,
"key_prefix":"apk/cn/",
"bucket" : "merculet-file"
}
保持并退出。
8.3 新增apk目錄
在/var/lib/jenkins/workspace/qiniu目錄內(nèi)新建apk目錄,用來(lái)保存將要上傳的apk
$ cd /var/lib/jenkins/workspace/qiniu
$ mkdir apk
8.4 配置qshell的account
具體見(jiàn)文檔:
命令行工具(qshell)
復(fù)制七牛賬號(hào)下的 AccessKey 和 SecretKey
$ qshell account AccessKey SecretKey name
其中name表示該賬號(hào)的名稱(chēng)
這樣,我們就可以找jenkins內(nèi)的shell內(nèi)直接調(diào)用qshell的相關(guān)命令了。比如qupload和cdnrefresh
8.5 shell腳本
-
8.5.1在jenkins內(nèi) Add build step->執(zhí)行 shell
執(zhí)行 shell - 8.5.2在Command添加如下shell腳本,完成七牛上傳以及刷新
#!/bin/bash -ile
#start
#項(xiàng)目名稱(chēng)
PROJECT_NAME="merculet_cn"
#workspace環(huán)境路徑
WORKSPACE_PATH="${JENKINS_HOME}/workspace"
#工程環(huán)境路徑
PROJECT_PATH="${WORKSPACE_PATH}/${PROJECT_NAME}"
#工程環(huán)境路徑
RELEASE_PATH="${PROJECT_PATH}/app/build/outputs/apk/cn/release"
# AndroidManifest.xml路徑
VERSION_CODE_PATH="${PROJECT_PATH}/app/src/main/AndroidManifest.xml"
#1.取版本號(hào)
VERSION_CODE=`cat ${VERSION_CODE_PATH} | sed -n 's/.*android:versionName="\(\S\)/\1/p' | tr -d '[\.">\r]'`
echo ${VERSION_CODE}
APK_NAME="simplet"
QSHELL_PATH="${WORKSPACE_PATH}/qiniu"
#upload.conf環(huán)境路徑,放在jenkins相關(guān)目錄內(nèi)
UPLOAD_PATH="${WORKSPACE_PATH}/qiniu/apk"
#2.拷貝需要上傳的apk
cp ${RELEASE_PATH}/*.apk ${UPLOAD_PATH}/${APK_NAME}.apk
cp ${RELEASE_PATH}/*.apk ${UPLOAD_PATH}/${APK_NAME}${VERSION_CODE}.apk
#3.七牛上傳以及刷新
QINIU_URL1="https://mvpfile.mlinks.cc/apk/cn/${APK_NAME}.apk"
QINIU_URL2="https://mvpfile.mlinks.cc/apk/cn/${APK_NAME}${VERSION_CODE}.apk"
qshell qupload ${QSHELL_PATH}/upload.conf
CDNREFRESH_FILE=${QSHELL_PATH}/cdnrefresh
echo ${QINIU_URL1} > ${CDNREFRESH_FILE}
echo ${QINIU_URL2} >> ${CDNREFRESH_FILE}
qshell cdnrefresh -i ${CDNREFRESH_FILE}
九.寫(xiě)在最后
一開(kāi)始我的阿里云是1核 2G的配置,結(jié)果跑十次有九次報(bào)內(nèi)存不足
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is
...
或者
HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000feafd000, 53043562, 0) failed; error='Cannot allocate memory' (errno=12)
為了減少Android編譯的資源消耗,根據(jù)Google官方的優(yōu)化您的構(gòu)建速度
以及其他文章,我做了不懈的努力。
包括并不限于減少JVM消耗,減少堆內(nèi)存,關(guān)閉守護(hù)進(jìn)程--no-daemon 還有關(guān)閉并行運(yùn)算parallel等等等等。
終于,經(jīng)過(guò)我的不懈努力,得出了“2G內(nèi)存現(xiàn)在已經(jīng)跑不動(dòng)Android編譯環(huán)境”這個(gè)結(jié)論……
于是我不得不把我的阿里云升到了2核4G的配置。


最終我的Jenkins運(yùn)行環(huán)境為:阿里云CentOS 64 2核4G 最低配
如果沒(méi)有其他需求,用突發(fā)性能實(shí)例即可,畢竟我們只是偶爾跑一下,這樣可以省下一大筆銀子。要是純粹為了學(xué)習(xí)配置,可以去華為云那領(lǐng)一個(gè)7天免費(fèi)版。
參考:
https://www.cnblogs.com/stulzq/p/9291237.html
http://www.itdecent.cn/p/5feca12a2ada
http://blog.fir.im/jenkins/
https://www.pgyer.com/doc/view/jenkins_plugin
https://developer.qiniu.com/kodo/tools/1302/qshell
https://github.com/qiniu/qshell





