自动化拉取Gitee上Android项目的代码并编译打包(CI/CD)
环境:centos7
JDK:1.8
Gradle:5.1.1
Android SDK:28
说明:
- 所需环境:使用Jenkins自动编译打包Android项目为.apk文件需要依赖的环境有JDK、Gradle、Android SDK,其中SDK的安装最为重要!
- 确定版本:首先要确定自己项目所使用的JDK版本(1.8),Gradle版本(5.1.1)和SDK(28.0.3)的版本,这一点非常的重要!!!
- 容器卷挂载:通过容器卷挂载的方式(下一节会讲到),让docker中的jenkins使用外部的环境,同时也要在jenkins的系统设置中设置环境变量(Configure System–>Global properties)。
Jenkins自带JDK1.8版本,如果你的项目用的是11或者15,需要自己下载jdk的环境到宿主机,并在/ect/profile里面配置环境变量(以下的1.8只是做个演示)
并使用容器卷-v的方式让容器内部用到此环境。
But,下面第3步Android SDK环境的配置需要JAVA环境,所以宿主机还是要安装JDK
/(ㄒoㄒ)/~~
Jenkins的系统是可以选择合适版本的Gradle并安装,无需在宿主机安装Gradle(当然也可以容器外部安装,挂载到内部,不过有点多此一举),具体jenkins关于设置Global Tool Configuration稍后再讲,这里只是放一张图片。
这部分的安装是最重要的,需要在宿主机安装SDK环境,之后通过挂载的方式使用SDK环境!
编译安卓项目的前提要在服务器上安装SDK(不是通过Android Studio安装),但是网上查到的版本最新也只到SDK 24(比如这个网站https://www.androiddevtools.cn/就好久没更新了),So我们去官网下载。
Android使用的SDK版本在build.gradle里面查看compileSdkVersion
因为SDK环境的安装非常重要,所以我单独写了一篇博客。
如何安装最新版本Android的SDK见我的这篇文章
https://blog.csdn.net/qq_38182842/article/details/110170630
这里只是顺便提一下Maven,如果是java web项目,需要打jar包或者war包,Maven是必须的,但是也可以通过jenkins关于设置Global Tool Configuration来配置你需要的Maven版本。
官方安装教程:
https://hub.docker.com/_/jenkins
# 拉取lts(long term support)版本
docker pull jenkins/jenkins:lts
我们只需要挂载2个路径
a. 容器内的/usr/local/android-sdk (此路径名字随意,后面会配置android-sdk环境变量会用到这个路径)
b. 容器内的/var/jenkins_home
说明: Gradle和JDK我们使用jenkins提供下载的
# 只需要挂载 android-sdk 和 jenkins_home就行
docker run -d -it --name jenkins -p 8080:8080 -p 50000:50000 -v /opt/android-sdk:/usr/local/android-sdk -v /root/dockerContainerFile/jenkins:/var/jenkins_home jenkins/jenkins:lts
注意!外部挂载目录/root/dockerContainerFile/jenkins
需要修改权限,否则会因为无法写入数据导致容器不能启动
chwon -R 1000:1000 /root/dockerContainerFile/jenkins
# 这里顺便提一下外部jdk和maven的挂载方式
docker run -d -it --name jenkins -p 8080:8080 -p 50000:50000 -v ${JAVA_HOME}:/usr/local/jdk -v ${M2_HOME}:/usr/local/maven -v /opt/android-sdk:/usr/local/android-sdk -v /root/dockerContainerFile/jenkins:/var/jenkins_home jenkins/jenkins:lts
# 其中${JAVA_HOME}值为/opt/jdk1.8.0_271
# ${M2_HOME}值为/opt/apache-maven-3.6.3
说明:通过8080端口访问
私人令牌是为了保障Jenkins能够成功拉取项目
Gitee官网生成私人令牌
登录自己的Gitee账号 Settings->Personal access tokens
填写描述并点击commit
保存这串token值,下一步用到这个token
在Jenkins的系统设置中配置Gitee
回到jenkins进入系统设置
配置Gitee连接
点击Add之后第三步进入如下,只要设置Kind和Token就行
最后一定要测试连接成功才行
最后点击Apply 再点Save
本文不涉及Gitee的webhook
什么是webhook?简单点说就是当你git push之后,jenkins会自动收到消息并构建打包我们的项目,类似"订阅-发布模型"。
-v ${JAVA_HOME}:/usr/local/jdk
# 这里顺便提一下外部jdk和maven的挂载方式
docker run -d -it --name jenkins -p 8080:8080 -p 50000:50000 -v ${JAVA_HOME}:/usr/local/jdk -v ${M2_HOME}:/usr/local/maven -v /opt/android-sdk:/usr/local/android-sdk -v /root/dockerContainerFile/jenkins:/var/jenkins_home jenkins/jenkins:lts
# 其中${JAVA_HOME}值为/opt/jdk1.8.0_271
# ${M2_HOME}值为/opt/apache-maven-3.6.3
# 只需要挂载 android-sdk 和 jenkins_home就行
docker run -d -it --name jenkins -p 8080:8080 -p 50000:50000 -v /opt/android-sdk:/usr/local/android-sdk -v /root/dockerContainerFile/jenkins:/var/jenkins_home jenkins/jenkins:lts
说明:以下参数也可以暂时不设置,后期有需要再加(我们只要先让项目成功构建起来)。
常见的参数我找不到了,后期在下面补上
说明:以下是关于Webhook的配置,我们的Jenkins在本地服务器,要是Gitee通知本地的Jenkins构建还需要配置网络啥的,所以我只简单写了一下。
# /bin/bash
# 我将app-release.apk换了个名字叫${BUILD_TAG}.apk,并输出目录下的内容
# BUILD_TAG:"jenkins-${JOB_NAME}-${BUILD_NUMBER}"
# 最后执行引号中的lftp命令,将文件传到指定FTP服务器
mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/${BUILD_TAG}.apk
ls app/build/outputs/apk/release
lftp -c "open -u app,app 10.1.0.19:2121; ls /app; put app/build/outputs/apk/release/${BUILD_TAG}.apk"
Shell执行的注意点:
a. 上面的步骤是由上到下执行的,添加Execute shell这一步必须在gradle脚本之后
b. app/build/outputs/apk/release/
这个是容器内路径,全称如下,但是我们只要填项目名称(我的是gm_app)之后的路径就行
c. shell脚本的执行是在容器内部执行的,容器内可能没有lftp命令,我们需要以root身份进入容器内部,更新apt-get命令,并安装lftp命令。
# 以root身份进入容器
docker exec --privileged -u root -it jenkins /bin/bash
# 更新apt-get指令
apt-get update
# 安装lftp命令
apt-get install lftp
耐心等待构建成功,Last Successful Artifacts里显示的就是我们构建好的项目(Post-build Actions里面没有添加Archive the artifacts的话,这边是不会显示.apk文件的 )
我们也可以将构建好的.apk文件通过ftp发送到指定的服务器,也可以生成二维码给测试人员提供下载。
在Build中,在Gradle下方(只可以在下方)添加Execute shell,增加需要执行的shell脚本。具体介绍看5.Build->Execute shell 设置。
第一次用Jenkins构建项目,也走了不少坑,大大小小尝试了24次:
以上步骤都已经过亲自验证,不会有什么问题。其中我觉得Android SDK环境的配置挺重要的。
才疏学浅,更高级的Jenkins配置还在学习中,请大家多多指教~
https://blog.csdn.net/wangxudongx/article/details/108173608
https://blog.csdn.net/weixin_38062353/article/details/82357085
https://blog.csdn.net/wc1695040842/article/details/102230401