前言:
我们Android开发在工作中经常会遇到这种问题,你在继续进行版本开发的时候,测试让你给他打一个指定版本的包,但是你正在忙碌敲代码,这时就未免在时间上冲突了。为了解决这个问题,可以让测试自己去拉取代码,自己去打包,岂不是很完美,Jenkins就是这样一款工具,可以帮助我们自动化的完成编译、打包工作。
准备:
1. 首先准备Jenkins包,具体的可以在官方网站上获取 war 包。地址是:War Jenkins Packages
2. 下载 JDK11
因为Oracle要注册,但是感觉流程很麻烦,找到一个网址,可以下载开源的OpenJDK,地址如下:Java Platform, Standard Edition 11 ReferenceImplementations
找到下载链接,在命令行中执行命令:
wget -c https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
下载之后,解压
tar zxvf openjdk-11+28_linux-x64_bin.tar.gz
然后配置环境变量并生效:
[root@anonymous openjdk-11]# vim /etc/profile
#export JAVA_HOME=/usr/lib/jdk1.8.0_161
#/usr/lib/openjdk-11
export JAVA_HOME=/usr/lib/openjdk-11
[root@anonymous openjdk-11]# source /etc/profile
2. Git 安装
Git 其实已经安装了,那么就检测一下版本:
-bash-4.2# git --version
git version 1.8.3.1
3. Gradle安装
Gradle 其实要安装比较新的版本,因为AndroidStudio新创建的项目的Gradle版本是比较高的。Gradle下载地址:gradle 下载地址 https://gradle.org/releases/
wget -c https://downloads.gradle-dn.com/distributions/gradle-7.3.3-bin.zip
配置环境变量:
-bash-4.2# vim /etc/profile
-bash-4.2# source /etc/profile
配置的内容如下:
export JAVA_HOME=/usr/lib/openjdk-11
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export GRADLE_HOME=/usr/lib/gradle-7.3.3
export CMAKE_PATH=/usr/lib/cmake-3.14.3/bin
export ANDROID_NDK=/usr/lib/android-ndk-r14b
export NDK_PATH=/usr/lib/android-ndk-r14b
export GCC_HOME=/opt/rh/devtoolset-8/root/usr/bin
export NODE_HOME=/lib/node-v12.18.3-linux-x64/bin
export NGINX_HOME=/usr/local/nginx/sbin
export YASM_PATH=/usr/local/bin/yasm/bin
export PKG_CONFIG_PATH=/home/jack/cpp_learn/mymath
export NVM_PATH=/lib/nvm/nvm-0.38.0
export PATH=$NVM_PATH:$YASM_PATH:$GRADLE_HOME/bin:$JAVA_HOME/bin:$CMAKE_PATH:$ANDROID_NDK:$NDK_PATH:$GCC_HOME:$NGINX_HOME:$PATH
检测版本:
-bash-4.2# gradle --version
4. 下载AndroidSDK
下载命令行工具
-bash-4.2# wget -c https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip
解压之后进入根目录:
-bash-4.2# cd cmdline-tools
-bash-4.2# ls -l
total 120
drwxr-xr-x 2 root root 4096 Mar 25 18:55 bin
drwxr-xr-x 17 root root 4096 Mar 25 18:55 lib
-rwxr-xr-x 1 root root 108975 Jan 1 2010 NOTICE.txt
-rwxr-xr-x 1 root root 84 Jan 1 2010 source.properties
-bash-4.2# cd bin
-bash-4.2# ls -l
total 56
-rwxr-xr-x 1 root root 5321 Jan 1 2010 apkanalyzer
-rwxr-xr-x 1 root root 5312 Jan 1 2010 avdmanager
-rwxr-xr-x 1 root root 5280 Jan 1 2010 lint
-rwxr-xr-x 1 root root 5253 Jan 1 2010 profgen
-rwxr-xr-x 1 root root 5253 Jan 1 2010 retrace
-rwxr-xr-x 1 root root 5309 Jan 1 2010 screenshot2
-rwxr-xr-x 1 root root 5319 Jan 1 2010 sdkmanager
下载SDK:
-bash-4.2# ./sdkmanager --list --channel=0
Error: Could not determine SDK root.
Error: Either specify it explicitly with --sdk_root= or move this package into its expected location: <sdk>/cmdline-tools/latest/
-bash-4.2#
发现执行该命令有问题,在cmdline-tools 根目录下创建 latest 目录,然后拷贝 cmdline-tools 目录下的文件到 latest目录中:
-bash-4.2# mkdir latest
-bash-4.2# mv bin/ lib/ NOTICE.txt source.properties -t latest/
-bash-4.2# ls -l
total 4
drwxr-xr-x 4 root root 4096 Mar 25 18:58 latest
-bash-4.2# cd latest/
-bash-4.2# ls
bin lib NOTICE.txt source.properties
-bash-4.2# cd bin
-bash-4.2# ls
apkanalyzer avdmanager lint profgen retrace screenshot2 sdkmanager
再次执行命令,会展示不同版本的SDK
-bash-4.2# ./sdkmanager --list --channel=0
[=======================================] 100% Computing updates...
使用如下命令安装对应版本的 Android SDK,--sdk_root 用于设置SDK的目录
-bash-4.2# ./sdkmanager "build-tools;30.0.3" "platforms;android-30" --sdk_root=/usr/lib/android_sdk
查看下载的内容:
cd /usr/lib/android_sdk
drwxr-xr-x 3 root root 4096 Mar 25 19:03 build-tools
drwxr-xr-x 3 root root 4096 Mar 25 19:03 platforms
drwxr-xr-x 6 root root 4096 Mar 25 19:03 tools
drwxr-xr-x 8 root root 4096 Mar 25 19:02 emulator
drwxr-xr-x 3 root root 4096 Mar 25 19:02 platform-tools
drwxr-xr-x 3 root root 4096 Mar 25 19:02 patcher
drwxr-xr-x 2 root root 4096 Mar 25 19:02 licenses
配置环境变量并生效:
export JAVA_HOME=/usr/lib/openjdk-11
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export GRADLE_HOME=/usr/lib/gradle-7.3.3
export ANDROID_SDK=/usr/lib/android_sdk
export CMAKE_PATH=/usr/lib/cmake-3.14.3/bin
export ANDROID_NDK=/usr/lib/android-ndk-r14b
export NDK_PATH=/usr/lib/android-ndk-r14b
export GCC_HOME=/opt/rh/devtoolset-8/root/usr/bin
export NODE_HOME=/lib/node-v12.18.3-linux-x64/bin
export NGINX_HOME=/usr/local/nginx/sbin
export YASM_PATH=/usr/local/bin/yasm/bin
export PKG_CONFIG_PATH=/home/jack/cpp_learn/mymath
export NVM_PATH=/lib/nvm/nvm-0.38.0
export PATH=$NVM_PATH:$YASM_PATH:$ANDROID_SDK/tools:$ANDROID_SDK/tools/bin:$ANDROID_SDK/platform-tools:$GRADLE_HOME/bin:$JAVA_HOME/bin:$CMAKE_PATH:$ANDROID_NDK:$NDK_PATH:$GCC_HOME:$NGINX_HOME:$PATH
5. 搭建 Jenkins 网站:
前面已经下载好了 jenkins 的war包,其实可以很简单的执行,这里我们采用脚本启动项目,脚本是start_jenkins.sh,内容如下:
#!/bin/bash
JENKINS_ROOT=/home/jack/jenkins
export JENKINS_HOME=$JENKINS_ROOT/home
java -jar $JENKINS_ROOT/jenkins.war --httpPort=8080
启动 Jenkins 命令:
/home/jack/jenkins
-bash-4.2# ./start_jenkins
Running from: /home/jack/jenkins/jenkins.war
webroot: /home/jack/jenkins/home/war
初次使用 Jenkins,我们要设置好自己的用户名和密码,并且按照推荐的方式安装好相关的插件,比如 Gradle 插件,这样就可以调用 Gradle 脚本。
下面是已经搭建好的Jenkins平台。
系统管理:
安装 JDK
设置JDK配置
设置Git配置
Gradle 配置:
Gradle-6.7.1 设置
Gradle-7.3.3 设置
系统环境配置:
注意:这里设置的ANDROID_HOME 不要写错,否则在后面的编译环节会出现找不到SDK的问题。
构建编译任务:
1. 点击新建任务
2. 设置任务名称和任务类型:
3. 点击确定,进入到配置页面:
4. 可以看到,我们需要设置Git源码地址:
我们新建一个Android项目,然后执行相关的命令推送到Gitee,等待后续的代码拉取操作。
C:\Users\PCWin10\AndroidStudioProjects>cd AndroidTest
C:\Users\PCWin10\AndroidStudioProjects\AndroidTest>git init
Initialized empty Git repository in
C:\Users\PCWin10\AndroidStudioProjects\AndroidTest>git add .
C:\Users\PCWin10\AndroidStudioProjects\AndroidTest>git commit -m "first commit"
C:\Users\PCWin10\AndroidStudioProjects\AndroidTest>git remote add origin https://gitee.com/happiness365/android-test.git
C:\Users\PCWin10\AndroidStudioProjects\AndroidTest>git push -u origin "master"
Enumerating objects: 88, done.
Counting objects: 100% (88/88), done.
Delta compression using up to 4 threads
Compressing objects: 100% (68/68), done.
Writing objects: 100% (88/88), 101.56 KiB | 5.64 MiB/s, done.
Total 88 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/happiness365/android-test.git
* [new branch] master -> master
branch 'master' set up to track 'origin/master'.
C:\Users\PCWin10\AndroidStudioProjects\AndroidTest>
在推送代码到Gitee的时候,会弹框要求输入Gitee的账户密码,输入即可。我的密码:
1120335370@qq.com/asdzxc123456
注意,在推送的过程,还碰到一个问题,需要我们设置Git的邮箱和用户名,在Windows上命令如下:
C:\Users\PCWin10>git config --global user.email "1120335370@qq.com"
C:\Users\PCWin10>git config --global user.name "JackZhang"
然后在Gitee上查看推送的代码。
5. 在Jenkins上的Git地址上输入源码地址,同时也要求填入凭证,我们这里使用Gitee的账户名和密码,它会帮我们自动生成一个凭证。
这里还有重要的一步,这是 Build Steps, 选择编译的Gradle版本,以及Task任务。
6. 保存即可。
7. 可以在Dashboard上看到新构建的任务
8. 点击 AndroidTestCase, 然后点击立即构建,即可开始构建任务:
9. 点击箭头所指位置,进入到具体的编译流程和结果:
10. 可以查看构建的流程
构建成功:
11. 查看构建的结果:
注意:因为AndroidStudio默认打包出来的是不带前面的,所以我们需要在Android项目中配置好签名,项目的 app/build.gradle 文件内容如下:
def releaseTime() {
// return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC")) //年月日
return new Date().format("yyyyMMdd HH-mm-ss", TimeZone.getTimeZone("GMT+8:00")) //年月日时分秒
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.androidtest"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release {
storeFile file("keys/androidtest.jks")
storePassword "123456"
keyAlias "androidtest"
keyPassword "123456"
}
debug {
storeFile file("keys/androidtest.jks")
storePassword "123456"
keyAlias "androidtest"
keyPassword "123456"
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') { //如果是release版本
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) { //查找所有的apk
def fileName = "AndroidTest_${releaseTime()}_${defaultConfig.versionName}.apk" //重新定义apk的名称
output.outputFileName = fileName //outputFile.parent参数可以改成你你想要的发布路径
}
}
}
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
参考