[原创]docker+jenkins+gradle+android sdk+gitee自动打包部署Gitee上的Android项目(超详细)

docker+jenkins+gradle自动打包部署Gitee上的Android项目


前言

自动化拉取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)。

1.JDK

Jenkins自带JDK1.8版本,如果你的项目用的是11或者15,需要自己下载jdk的环境到宿主机,并在/ect/profile里面配置环境变量(以下的1.8只是做个演示)
在这里插入图片描述
并使用容器卷-v的方式让容器内部用到此环境。
But,下面第3步Android SDK环境的配置需要JAVA环境,所以宿主机还是要安装JDK
/(ㄒoㄒ)/~~

2.Gradle

Jenkins的系统是可以选择合适版本的Gradle并安装,无需在宿主机安装Gradle(当然也可以容器外部安装,挂载到内部,不过有点多此一举),具体jenkins关于设置Global Tool Configuration稍后再讲,这里只是放一张图片。
在这里插入图片描述

3.Android SDK!!

这部分的安装是最重要的,需要在宿主机安装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

4.Maven

这里只是顺便提一下Maven,如果是java web项目,需要打jar包或者war包,Maven是必须的,但是也可以通过jenkins关于设置Global Tool Configuration来配置你需要的Maven版本。

二、Docker安装Jenkins

官方安装教程:
https://hub.docker.com/_/jenkins

1.拉取镜像

# 拉取lts(long term support)版本 
docker pull jenkins/jenkins:lts

2.挂载外部环境

我们只需要挂载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

三、初始登录Jenkins

说明:通过8080端口访问

1.首次登录Jenkins的相关操作

  • 复制挂载目录下的/secrets/initialAdminPassword中的初始密码在这里插入图片描述
  • 选择左边的默认插件,后期我们要安装插件再另外配置
    在这里插入图片描述
  • 点击开始
    vv
  • 创建初始Admin用户
    在这里插入图片描述
  • 使用默认url连接Jenkins
    在这里插入图片描述
  • 完成
    在这里插入图片描述

四、Jenkins的插件和环境设置

1.Gitee插件和私人令牌

私人令牌是为了保障Jenkins能够成功拉取项目

  • 下载Gitee插件
    Manage Jenkins->Manage Plugins在这里插入图片描述
    搜索Gitee插件并安装
    在这里插入图片描述

  • Gitee官网生成私人令牌
    登录自己的Gitee账号 Settings->Personal access tokens
    在这里插入图片描述
    填写描述并点击commit
    在这里插入图片描述
    保存这串token值,下一步用到这个token
    在这里插入图片描述

  • 在Jenkins的系统设置中配置Gitee
    回到jenkins进入系统设置
    在这里插入图片描述
    配置Gitee连接
    在这里插入图片描述
    点击Add之后第三步进入如下,只要设置Kind和Token就行
    在这里插入图片描述
    最后一定要测试连接成功才行
    在这里插入图片描述
    最后点击Apply 再点Save

  • 本文不涉及Gitee的webhook
    什么是webhook?简单点说就是当你git push之后,jenkins会自动收到消息并构建打包我们的项目,类似"订阅-发布模型"。

2.Gradle环境

  • 进入全局工具设置Global Tool Configuration
    在这里插入图片描述
  • 安装Gradle
    说明:本例让jenkins自动安装,当然可以选择启动容器的时候挂载宿主机的Gradle的目录(Gradle版本要和Android项目用的Gradle一致,我一开始构建失败,后来才发现是Gradle版本不一致的问题)
    在这里插入图片描述

3.JDK环境

  • Jenkins默认使用jdk1.8,无需设置,如果需要用jdk11或者15请看下面
  • 如果在启动容器的时候我们挂载了 -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
  • 那么我们在下面的JAVA_HOME就填写容器内路径/usr/local/jdk
    在这里插入图片描述

4.Android SDK环境

  • 来到系统设置
    在这里插入图片描述

  • 设置环境变量ANDROID_SDK_ROOT
    它的值与之前挂载的路径一致-v /opt/android-sdk:/usr/local/android-sdk

# 只需要挂载 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

在这里插入图片描述

  • SDK环境OK了

五、Jenkins构建新的项目

1.新建一个自由风格的项目

在这里插入图片描述

2.General 设置

  • Gitee Connection选择之前设置Gitee时取的那个名字
    在这里插入图片描述

说明:以下参数也可以暂时不设置,后期有需要再加(我们只要先让项目成功构建起来)。
常见的参数我找不到了,后期在下面补上

  • 添加第一个Choice Parameter:IS_JENKINS,用来在gradle构建时替换gradle.properties里定义的参数,这样可以在gradle脚本里用该参数区分当前是不是jenkins构建;
    在这里插入图片描述
  • 添加第二个Choice Parameter:BUILD_TYPE,这个参数用来配置执行不同构建类型(是执行debug还是release构建);
    在这里插入图片描述
  • 添加一个Git Parameter:GIT_TAG用来选择拉取git代码的分支,会自动识别git仓库的所有分支供构建的时候选择(需要安装git parameter插件)
    在这里插入图片描述

3.Source Code Management 源码设置

  • Repository URL填源码仓库的地址,下面的Branches to build 默认拉取master分支(如果安装了Git Parameter插件,在构建的时候可以手动选择分支)
    在这里插入图片描述

  • 点击Add,填Gitee的账户和密码
    在这里插入图片描述

4.Build Trigger 触发器设置

说明:以下是关于Webhook的配置,我们的Jenkins在本地服务器,要是Gitee通知本地的Jenkins构建还需要配置网络啥的,所以我只简单写了一下。

  • 当git push的时候构建项目
    在这里插入图片描述
  • 生成 Gitee webhook 52c09bxxxxxxxxxxxxxxxxxxa9046265
    在这里插入图片描述
  • 去Gitee.com配置webhook

5.Build 构建设置

# /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

在这里插入图片描述

  • OK, Build这个关键步骤搞定

6.Post-build Actions 构建后行为设置

  • 注意: 对打包好的apk的操作(比如执行shell脚本,传输我们的apk到指定服务器),这些操作的设置不在这一步,应该在上一步Build中添加执行shell脚本。
  • 添加Archive the artifacts(为了打包成功后在workspace显示apk文件)
  • 这个路径的作用是去搜集app/build/outputs/apk/目录下的文件,并显示出来。注意这个路径是在workspace/构项目的名字/ ,下面的/app/build/outputs/apk去找文件,我们打包好的东西就在apk这个目录下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

7.进行构建测试

  • 点击build
    在这里插入图片描述

  • 可以在Console Output看到构建的细节
    在这里插入图片描述

  • 耐心等待构建成功,Last Successful Artifacts里显示的就是我们构建好的项目(Post-build Actions里面没有添加Archive the artifacts的话,这边是不会显示.apk文件的 )
    在这里插入图片描述

8.大功告成

我们也可以将构建好的.apk文件通过ftp发送到指定的服务器,也可以生成二维码给测试人员提供下载。
在Build中,在Gradle下方(只可以在下方)添加Execute shell,增加需要执行的shell脚本。具体介绍看5.Build->Execute shell 设置
在这里插入图片描述


总结

第一次用Jenkins构建项目,也走了不少坑,大大小小尝试了24次:

  • gradle版本的不一致;
  • SDK环境配不对;
  • 文件没给写权限导致构建的时候不能写入;
  • 挂载了jdk11但其实项目用的jdk是1.8(用jenkins默认的就行);
  • 找不到打包之后的.apk的路径(使用Archive the artifacts在workspace显示打包好的文件)

以上步骤都已经过亲自验证,不会有什么问题。其中我觉得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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是 Docker + Jenkins + Gitlab+Harbor 自动化构建部署详细资料: 1. Docker Docker 是一种容器化技术,可以将应用程序及其依赖项打包为一个可移植的容器,从而实现快速、一致和可靠的部署。 2. Jenkins Jenkins 是一种开源的自动化服务器,可以用于自动化构建、测试和部署软件。 3. Gitlab Gitlab 是一种基于 Git 的代码托管平台,可以管理源代码、问题和合并请求等。 4. Harbor Harbor 是一种开源的 Docker 镜像仓库,可以存储和管理 Docker 镜像。 下面是 Docker + Jenkins + Gitlab+Harbor 自动化构建部署的步骤: 1. 创建一个 Gitlab 仓库,用于存储应用程序代码。 2. 在 Jenkins 中创建一个新项目,并配置 Gitlab 的 Webhook,以便在代码推送到 Gitlab 时触发构建。 3. 在 Jenkins 中配置 Docker 插件,以便在构建完成后自动构建 Docker 镜像。 4. 在 Jenkins 中配置 Harbor 插件,以便在构建完成后自动Docker 镜像上传到 Harbor 镜像仓库。 5. 在 Jenkins 中配置部署脚本,以便在 Docker 镜像上传到 Harbor 后自动部署到目标服务器。 6. 在 Gitlab 中配置 CI/CD 流水线,以便在代码推送到 Gitlab 后自动触发 Jenkins 构建和部署流程。 7. 测试自动化构建部署流程,确保能够自动构建、上传和部署 Docker 镜像。 总之,Docker + Jenkins + Gitlab+Harbor 自动化构建部署可以大大提高软件开发和部署的效率,可以快速构建、测试和部署应用程序,从而实现持续集成和持续交付。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值