当前位置:   article > 正文

Linux环境基于Jenkins搭建Android自动化构建平台(一)_linux实现安卓自动化

linux实现安卓自动化

前言

使用Jenkins实现持续集成构建Android应用需要在Jenkins平台配置的环境:JDK、Git、Gradle、android sdk。

如何搭建Jenkins环境请参考《阿里云服务器搭建(三)~安装Jenkins》

一. 配置JDK

具体配置不在赘述,可参考《阿里云服务搭建(一)~安装JDK》

二. 配置GIT

查看当前系统Git版本(如果存在),根据自己需要是否卸载重新安装

#查看系统当前Git版本
git --version

#删除Git
yum remove git
  • 1
  • 2
  • 3
  • 4
2.1 下载Git上传至服务器

下载所需版本GIT(这里下载的是git-2.9.5.tar.gz)到本机,通过命令上传至服务器

#服务器创建git文件夹
mkdir /usr/local/git

#将本机git.tar.xz上传至服务器的usr/local/git 目录下
scp git-2.9.5.tar.gz root@xxx.xxx.xxx.xxx:/usr/local/git/
  • 1
  • 2
  • 3
  • 4
2.2 解压Git
#解压git到当前文件夹
tar -zxvf git-2.9.5.tar.gz
  • 1
2.3 编译安装Git
#进入到git解压目录
cd git-2.9.5

#执行编译安装
make prefix=/usr/local/git all 
make prefix=/usr/local/git install

#查看git
whereis git 
git --version
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

PS:安装过程中如果遇到错误可参考文未扩展 1. Linux安装Git常见错误

2.4 配置Git环境变量
#1、打开/etc/profile
vim /etc/profile

#2、尾部添加git环境变量配置
export PATH=$PATH:/usr/local/git/git-2.9.5

#3、生效配置文件
source /etc/profile   
#或者
. /etc/profile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
2.5 配置Git全局信息以及创建公私钥
a. 查看当前git全局配置信息
#查看当前git全局配置信息
git config --list

#查看当前git全局用户名、邮箱配置信息
git config user.name
git config user.email

#查看当前系统是否存在Git公私钥(如果有id_rsa、id_rsa.pub则说明git公私钥已经存在)
cd ~/.ssh
ls
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
b. 添加/覆盖Git全局用户名和邮箱
git config --global user.name "用户名"
git config --global user.email "邮箱"
  • 1

c. 创建Git公私钥

如果当前环境不存在Git公私钥则进行创建(前提是要先配置Git用户名和邮箱)

ssh-keygen -t rsa -C "邮箱账号" #一路回车即可生成公私钥

    查看生成的公钥

    cd ~/.ssh
    ls
    
    #新生成的公私钥文件
    id_rsa  id_rsa.pub
    • 1
    • 2
    • 3
    • 4
    2.6 Jenkins平台配置Git环境

    登陆jenkins平台进入管理Jenkins->Global Tool Configuration->Git,配置Git环境
    jenkins配置git环境
    至此Jenkins平台Git环境配置完成!

    三. 配置Gradle

    进入Jenkins管理平台管理Jenkins—>Global Tool Configuration—>Gradle选择自动安装
    注意需要根据项目所使用的版本保持一致(例如AndroidStudio中使用的是5.1.1则Jenkins也需要安装对应版本)
    AndroidStudio中使用Gradle版本:
    android使用的gradle版本
    Jeninks选择对应版本
    jenkins配置gradle环境
    选好后点击应用保存即可(点了保存肯定是没有安装的,这个得再正式build项目时安装,所以不要着急)。

    四. 配置Android-SDK

    4.1 下载android-sdk

    下载android-sdk(这里下载的是[android-sdk_r24.4.1-linux.tgz])到本机。

    4.2 上传至远程服务

    将下载的android-adk上传至远程服务的usr/android/sdk目录下(没有此目录则先创建)

    #在服务器usr目录下创建andorid/sdk 目录
    mkdir usr/android/sdk
    
    #本机执行上传android-sdk至创建的目录
    scp android-sdk_r24.4.1-linux.tgz root@xxx.xxx.xxx.xxx:/usr/android/sdk
    • 1
    • 2
    • 3
    • 4
    4.3 解压android-sdk到当前目录
    #将android-sdk解压至当前目录
    tar -zxvf android-sdk_r24.4.1-linux.tgz
    • 1
    4.4 配置sdk环境变量

    在/etc/profile中配置andorid-sdk环境变量添加如下

    #1、编辑profile配置文件
    vim /etc/profile
    
    #2、文件尾部添加如下:
    #set android enviroment
    export ANDROID_HOME=/usr/android/sdk/android-sdk-linux
    export PATH=$PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tool:$PATH
    
    #3、应用文件
    source /etc/profile
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    4.5 更新SDK

    Android-SDK归档最初只包含基本的SDK工具。它不包含Android平台或任何第三方库。事实上,它甚至没有开发应用程序所需的所有工具。为此我们需要安装平台工具以及至少一个版本的Android平台。
    配置好android-sdk环境变量可通过命令查看可下载更新的SDK平台工具和android版本列表。

    android list sdk --all
    #-------------显示可下载更新的所有资源包----------------
    Packages available for installation or update: 228
       1- Android SDK Tools, revision 25.2.5
       2- Android SDK Platform-tools, revision 29.0.5
       3- Android SDK Build-tools, revision 29.0.2
       4- Android SDK Build-tools, revision 29.0.1
       5- Android SDK Build-tools, revision 29
       6- Android SDK Build-tools, revision 28.0.3
       7- Android SDK Build-tools, revision 28.0.2
       8- Android SDK Build-tools, revision 28.0.1
       9- Android SDK Build-tools, revision 28
      10- Android SDK Build-tools, revision 27.0.3
      11- Android SDK Build-tools, revision 27.0.2
      12- Android SDK Build-tools, revision 27.0.1
      13- Android SDK Build-tools, revision 27
    ....
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    我们可以根据自己的需要来进行下载更新,官方提供了一些参数供开发者选择性更新:

     android [global options] update sdk [action options]
    #global options全局选项:
    -s --silent     : 静音模式:只显示错误信息.
    -v --verbose    : 详细模式:显示错误、警告和所有信息
    --clear-cache   : 清除SDK管理器存储库清单缓存
    -h --help       : 显示帮助命令
    #action options动作选项
    -f --force     : 强制替换一个包或其部件,即使某些东西已被修改。
    -n --dry-mode  : 模拟更新,但不下载或安装任何东西。
    --proxy-host   : 设置http/https代理host(overrides settings if defined)
    -s --no-https  : 下载时使用HTTP而不是HTTPS(默认)。
    -t --filter    : 将更新限制为指定类型的筛选器以逗号分隔的列表形式出现的包[平台、系统映像、工具、平台-工具、文档、示例、源)。
    -u --no-ui     : 命令行更新(不显示GUI)。
    --proxy-port   : HTTP/HTTPS代理端口 (overrides settings if defined)
    -a --all       : 包括所有的包(例如过时的和非依赖的))
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    下载更新命令如下:

    #更新android-sdk资源包命令[id]是包序列号,如果下载多个用逗号(,)分隔。
    android update sdk -u -a -t [id]
    • 1
    a. 安装sdk-tools、android-sdk-build-tools

    安装sdk-tools

    #依据序列号下载更新android-sdk-build-tools包资源
    android update sdk -u --all --filter 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
    • 1
    b. 安装sdk-platform-android

    在这里插入图片描述

    #依据序列号下载更新所需版本的sdk-platform-android
    android update sdk -u --all --filter 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
    • 1
    c. 安装android-support-repository

    在这里插入图片描述

    #依据序号下载android-support-repository
    android update sdk -u --all --filter 216
    • 1

    至此Androd-SDK安装更新完成!

    4.6. Jenkins平台配置SDK

    打开Jenkins控制台,进入系统配置->全局属性添加环境变量
    Jenkins配置android-sdk环境

    五. 将项目通过Git关联到Jenkins中

    上述环境配置好之后,我们可以将GitLab或者GitHub上面的项目集成到Jenkins平台

    5.1 创建项目

    我们首先选择在移动项目下点击新建Item,创建一个项目,输入项目名称,然后选择自由风格,点击OK即可
    jenkins创建项目
    返回首页此时MobileApp项目已创建完成,点击进入,选择配置可见如下六个模块,将会一一介绍如何配置:
    在这里插入图片描述

    5.2 项目配置
    a. 通用配置(General)

    这里主要关注三点(描述启用项目安全丢弃旧的构建参数化构建)

    • 描述

      主要介绍项目有关情况

    • 丢弃旧的构建

      Jenkins提供对以往构建记录(包括控制台输出、归档工件和与特定构建相关的任何其他元数据)的丢弃处理,以此来保持更少的构建意味着在构建记录根目录中使用更少的磁盘空间。

      Jenkins提供了两种方案来丢弃旧的构建记录:

      • 建造年龄(天数):当构建达到一定年龄时丢弃;例如,构建了7天。
      • 构建计数(上限):当已经存在一定数量的构建时,放弃最旧的构建。

      这两个选项可以同时生效,例如:您可以将构建保留3天,但最多只能保留10个构建。如果任何一个限制被超过,那么任何超过这个限制的构建都将被丢弃。应用后返回可见我们的工程只保留了最近的10次构建记录。在这里插入图片描述

    • 启用项目安全

      可选项用来针对不同的用户分配不同的操作权限。
      该选项配合管理Jenkins—>全局安全配置(Configure Global Security)—>授权策略中的项目矩阵授权策略使用,可实现针对该项目给予不同的用户授予不同的权限(比如:浏览、构建、删除、创建等等),以此确保非相关管理人员具备超级权限对项目的误操作(比如:删除了项目)带来的后果。具体使用见文章底部扩展 2. 为Jenkins添加多用户及分配权限

    • 参数化构建

      当我们在构建的时候,需要选择具体构建那个分支,或者通过选择一些参数来控制构建的流程,那又该怎么办呢?下面将带大家一起看看Jenkins的参数化构建,以及提供的一些参数化构建的插件。参数化构建除了系统给出的几种类型,我们可以通过插件来扩展类型,达到我们的目的
      这里配置的参数,可以像Jenkins系统提供的环境变量一样,在需要的地方,通过名称获取它的值,比如在执行shell脚本的时候,可以通过${参数名}获取对应的值。
      使用Jenkins参数化构建,需要一些参数动态的替换项目中约定的属性,因此我们的工程项目也需要配置一些动态属性。

      • 参数使用:Jenkins参数化构建Android应用

        我们的Android项目通过Jenkins参数化构建需要动态写入的参数有版本号、构建时间、是否来自Jenkins构建(如果来自Jenkins打包生成的路径与本地打包生成的不一致,以及签名文件路径也不一致)等。

      1. 我们把需要动态配置的属性通过配置在gradle.properties文件中,然后在build.gradle中引用。(Jenkins打包时会根据平台配置一致的参数替换gradle.properties中的值)
        在这里插入图片描述

      2. 进入到Jenkins平台配置我们的参数(注意需要与我们工程中的gradle.properties中声明的属性一致)
        jenkins参数化构构建配置1
        jenkins参数化构建配置2

      3. 进入构建配置中的Invoke Gradle script高级勾选Pass jod parameters as Gradle properties没有此项的可以勾选Pass all job parameters as Project properties
        jenkins参数化构建配置3

      4. 进入构建页面,选择配置后点击构建,查看控制台构建成功啦。jenkins参数化构建页面
        在这里插入图片描述

      • 参数说明:Git Parameter

        当项目存在多个分支时,比如开发用的开发分支,而测试用的测试分支,打线上包时需要用的master分支等,那么这时候可能就需要选择具体的分支来进行打包。

      1. 首先安装Git Parameter插件
      2. 然后选择Git Parameter参数, Parameter Type中我们可选择根据 标签分支分支或标签版本拉取请求方式进行构建在这里插入图片描述
      3. 我们的工程仓库分支和标签如下:
        在这里插入图片描述
      4. 配置好构建参数返回我们工程页面,可见jenkins从仓库中拉去了所有的分支和标签,此时我们可选择分支或tag进行构建即可。在这里插入图片描述
    b. 源码管理

    源码管理主要是将我们要使用Jenkins进行持续继承的GitLab或者GitHub上的项目拉取到Jenkins平台上然后方可进行后续的一些列构建等操作。管理的方式有通过GITSVN两种方式,我这里使用Git方式SVN大同小异。

    • Repository:要拉取项目的GitLab/GitHub的仓库地址,填写完成后会通常提示
      Failed to connect to repository : Command "/usr/local/git/git-2.9.5/git ls-remote -h -- https://github.com/zcmain/JenkinsBuildPrivate.git HEAD" returned status code 128: stdout: stderr: remote: Invalid username or password. fatal: Authentication failed for 'https://github.com/zcmain/JenkinsBuildPrivate.git/'

      这是因为对于Private私有项目从GitLab/GitHub拉取项目需要身份凭证验证,此处需要我们选择下面的Credentials选项。

    • Credentials:身份凭证从指定的GitLab/GitHub拉取私有项目需要验证用户身份。如何添加身份凭证以及类型的区别可参见文末扩展 5. Jenkins添加用户凭证类型和区别

      选择凭证用户后错误提示消失,分支按照我们的需求自己指定(默认为master分支),点击应用后即可。
      在这里插入图片描述

    c. 构建触发器
    • 触发远程构建

      顾名思义就是在非Jenkins平台,(远程)执行jenkins的构建功能,比如在浏览器、shell脚本、代码、模拟发包工具等通知Jenkins来进行项目的构建。

      触发远程构建配置步骤:
      首先去系统管理->管理插件里边,搜索并安装插件 Build Authorization Token Root Plugin
      然后进入项目设置-构建触发器->勾选远程构建->填写我们的token在这里插入图片描述
      其中身份验证令牌需要可自行定义,具体访问形式为:

      #远程构建命令
      [JENKINS_URL]/job/[JOB_NAME]/build?token=[TOKEN_NAME]
      
      #JENKINS_URL:是jenkins服务路径,可在系统设置中查看
      #JOB_NAME:构建的项目名称
      #TOKEN_NAME:用户自定义的身份验证令牌
      • 1
      • 2
      • 3
      • 4
      • 5

      如何查看JENKINS_URL地址
      Jenkins管理—>系统配置—>Jenkins Location在这里插入图片描述
      假如我的
      JENKINS_URL= http://130.88.88.88:8888/jenkins/; TOKEN_NAME=8888则具体的远程构建的地址为:

      #远程构建地址
      http://130.88.88.88:8888/jenkins/job/WebApp/build?token=8888
      • 1

      浏览器访问上述地址则会提示用户身份验证,身份验证后则会自动构建项目(非参数化构建)。
      可以通过在构建地址后添加&cause="构建描述"来声明本次构建的描述,即:

      #远程构建,添加构建描述
      http://130.88.88.88:8888/jenkins/job/WebApp/build?token=8888&cause=远程构建
      • 1

      如何避免每次远程构建身份验证以及远程构建有哪些方式?参见文末扩展 6. Jenkins远程构建方式及如何避免权限不足

    • 其他工程构建后触发

      其他工程构建后触发本工程的构建,假如我现在有两个工程如下:

      在这里插入图片描述
      我期望在MobileApp1构建稳定(成功)之后触发WebApp的构建,则我们在WebApp工程配置中构建触发器勾选Build after other projects are built并填写我们关联的工程MobileApp1,勾选下方的只有构建稳定时触发即可。jenkins-构建触发器-其他项目后构建
      此时我们先主动构建MobileApp1工程试试父项目构建成功
      MobileApp1构建成功,紧接着触发了WebApp工程的构建
      在这里插入图片描述
      可见WebApp工程在MobileApp1工程构建完成后触发了构建。

    • 定时构建(Build periodically)

      定时构建是周期进行项目构建(它不在乎源码是否发生变化)

      #共5颗星占位符表示(中间用空格隔开)
      [* * * * *]
      # 第一个*表示分钟,取值0~59
      # 第二个*表示小时,取值0~23
      # 第三个*表示一个月的第几天,取值1~31
      # 第四个*表示第几月,取值1~12
      # 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      举例说明

      #每隔5分钟构建一次
      H/5 * * * *
      
      #每两小时构建一次
      H H/2 * * *
      
      #每天中午12点定时构建一次
      H 12 * * *
      
      #每天下午18点定时构建一次
      H 18 * * *
      
      #在每个小时的前半个小时内的每10分钟执行一次
      H(0-29)/10 * * * *
      
      #周一至周五每两小时执行一次,上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38)
      H H(9-16)/2 * * 1-5
      
      #一月份至十一月份,每月的1号和15号执行一次(比如:1月1号,1月15号;2月1号,2月15号...)
      H H 1,15 1-11 *
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      如果要指定一个字段允许多个值,就按下面提供的操作步骤(指定)。
      优先顺序如下:

      #可用来指定所有有效的值  
      {*}         
      
      #可以用来指定一个范围,比如 1-5
      {M-N}         
      
      #可用于在指定范围内跳跃一个X的值,比如在MINUTE字段中"H/15"表示"0,15,30,45","1-6/2"表示"1,3,5"。
      {M-N/X或H/X}  
      
      #可以用来指定多个值,比如“0,30”或“1,3,5”。
      {A,B,...,Z}            
      
      #任何空白行和'#'开始的行都将表示为注释而不予理睬。
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      PS:H这里的意义是什么?
      H(表示“hash”)的意思,目的是为了定期调度的任务在系统上产生均匀的负载。

      官方解释:对一打日常任务使用0 0 * * *将导致在午夜出现一个很大的峰值。相反,使用H H * * *仍然可以每天执行一次任务,但不是同时执行所有任务,因此使用H可以更好地利用有限的资源。

      H符号可以与范围一起使用。例如:H H(0-7) * * *表示12:00 AM(午夜)到7:59 AM之间的某个时间。您还可以使用带H的步距,带或不带范围。
      使用H带步距(早上9点到下午2点步距为2小时)
      H H(9-16)/2 * * *

      实际应用一下,我们在WebApp工程配置中设置定时构建周期为2分钟
      在这里插入图片描述
      经过一段时间我们查看下构建历史:
      在这里插入图片描述
      没错!!是自动触发了定时构建,间隔两分钟执行了构建。

    • 当源码被推送到Git仓库时触发构建(Build when a change is pushed to GitLab)

      当我们的gitlab仓库代码发生变化(源码被推送过来)时候触发jenkins自动构建。具体参考文末《8. Gitlab源码库里代码提交后,如何触发jenkins自动构建?

    • 轮询构建(Poll SCM)

      轮询构建是定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。

      轮询构建与定时构建配置是一致的,唯一的区别是,在进行轮询构建触发之前Jenkins平台会先检测工程是否变更,如果有变更则进行checkOut后进行构建,否则放弃本次构建!

    d. 构建环境

    构建环境用来配置Jenkins构建前及过程中的一些操作,具体功能如下

    • Delete workspace before build starts
      每次构建之前都先删除之前构建生成的工作空间。
    • Set Build Name
      设置构建信息详细配置参考文末扩展 3. 为Jenkins配置显示构建者信息
    • Add timestamps to the Console Output
      将构建时间显示在控制台
      在这里插入图片描述
    e. 构建

    构建配置可配置构建步骤,所支持的步骤如下

    • Changes build description
      更改构建描述

    • Changes build name
      更改构建名称(仅在未勾选构建环境中的Set Build Name )生效,如果设置此处设置将会被覆盖。
      在这里插入图片描述
      构建结束构建历史步骤中新增的构建介绍和构建名称
      在这里插入图片描述

    • Invoke Gradle script

      android是通过Gradle来进行构建的,因此这里在构建中添加调用Gradle脚本构建步骤

      在这里插入图片描述
      我们通过勾选Invoke Gradle选择使用Gradle进行构建,Tasks中输入Gradle需要执行构建的脚本,其中$BUILD_TYPE是前面General通用配置中的通过参数化配置增加的构建类型。
      在这里插入图片描述
      OK,应用一下我们选择Debug模式构建一下看看,打开控制台可以看到我们构建进度
      jenkins-gradle构建成功
      上面是使用了gradle执行了我们配置的Tasks脚本进行构建,可见构建成功,我们进入工程查看下build下面生成了对应的apk
      在这里插入图片描述
      当然我们也可以选择使用Use Gradle Wrapper即(Gradlew)的方式进行构建,具体的区别可参考文末扩展 7. Jenkins构建中如何选择gradle与gradlew

    f. 构建后操作

    配置构建后的操作可以让Jenkins在构建完之后执行什么操作,比如邮件通知、构建其它项目、执行脚本等。

    • Archive the artifacts(归档构建文件)

      把构建结果存档(例如,发布版zip、jar、apk等文件)并显示在构建页面,以便以后可以下载它们!可从Jenkins的网页访问存档文件。

      例如,我需要将构建结果apk目录下的文件存档,配置如下:在这里插入图片描述
      可使用通配符如module/dist/**/*.zip,存档的文件根目录是当前工程的工作空间,且只能存档当前工作区中的文件!
      应用设置重新构建看看,通过我们配置的构建存档文件显示在了构建页面上面,可直接访问下载!在这里插入图片描述

    • Build other projects(构建其他工程)

      在当前工程构建完成之后构建其他工程,如果需要构建多个其他工程中间用逗号隔开

      在这里插入图片描述
      上面配置了在当前工程WebApp工程构建完成之后紧接着构建MobileApp1WebApp1两个工程。

    • Post build task(执行脚本)

      工程构建完成之后执行脚本命令,前提需要安装Post build task插件。我们先用个简单的脚本,让构建结束后把apk移动到我们指定的文件夹下面例如:Jenkins构建结束后,将构建的apk移动到当前目录下的download目录下.

      #1.在当前工作空间下创建download目录
      if [  ! -d download ];then
         echo 文件夹不存在,开始创建...
         mkdir download
      else
         echo 文件夹已存在
      fi
      #2.将构建结束后的apk文件移动到download目录下
      mv app/build/outputs/apk/*/*.apk download/
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      执行构建控制台输出成功
      在这里插入图片描述
      进入到项目工作空间下查看确实成功移动到了我们的download目录下面了,说明我们配置的shell脚本被成功执行。
      在这里插入图片描述
      当前构建结束后我们还可以执行复杂的脚本比如:针对apk文件进行签名对齐插入多渠道信息等等,这些操作待后续讲解。

    5.3 项目构建

    配置好上述功能后,返回项目点击构建控制台输出可见构建日志信息,返回项目查看工作空间,可见项目已经被pull到Jenkins平台,构建历史显示第一次构建为root用户。(其实上面功能配置过程中我们已经进行无数次的构建)
    jenkins-构建andorid项目成功

    扩展

    1. Linux安装Git常见错误

    a. 致命错误:openssl/ssl.h:没有那个文件或目录

    #安装openssl和openssl-devel
    yum install openssl
    yum install openssl-devel 
    • 1
    • 2

    b. 致命错误:curl/curl.h:没有那个文件或目录

    #安装curl-devel
    yum -y install curl-devel
    • 1

    c. 致命错误:expat.h:没有那个文件或目

    #安装expat-devel
    yum install -y  expat-devel
    • 1

    d. make[1]: [perl.mak] Error 2
    /usr/bin/perl Makefile.PL PREFIX=/root INSTALL_BASE=--localedir=/root/share/locale Can not locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 3. BEGIN failed--compilation aborted at Makefile.PL line 3. make[1]: [perl.mak] 错误 2 make: [perl/perl.mak] 错误 2

    yum install perl-ExtUtils-MakeMaker package
    #service httpd restart
    • 1

    2. 为Jenkins添加多用户及分配权限

    a. 管理员身份登陆Jenkins平台
    b. 新建用户

    • 以管理员身份登陆进入Jenkins管理平台,选择Jenkins管理->用户管理->新建用户
      在这里插入图片描述
      建立完成后
      在这里插入图片描述

    c. 配置全局安全策略
    返回到Jenkins管理->Configure Global Security设置如下:

    • 第一步启用安全

    • 第二步安全域选择Jenkins own user database不要勾选允许用户注册(如果选择了允许用户注册那么任何人都可以注册,只是注册后没有任何操作权限)。

    • 第三步授权策略选择项目矩阵授权策略

    • 第四步点击添加用户或群组,填写之前创建的test用户。

    • 第五步根据需求给用户授权相应的权限。
      在这里插入图片描述
      如上,给测试用户1全局Overall策略和全局Job策略仅授予读取的权限(构建权限具体到项目中授予,如果不想让用户可见所有项目,则不要勾选Job下的Read项)。

      PS:常见的授权策略解释

      Overall:全局整体权限:

      • Administer: 最高权限,拥有该权限可以做任何事情。
      • Read:读取权限,用户必须授予阅读权限,否则什么都看不到。

      Job:全局任务权限(此处配置适用于所有项目,也可以不做任何配置,而是在具体的项目中配置)

      • Build:构建权限,如果配置则所有项目该用户都具备构建权限
      • Delete:删除权限,如果配置则该用户拥有所有项目的删除权限
      • Read:读取权限:如果配置则该用户具备所有项目的查看权限(如果仅让用户指定可见某些项目,此选择不勾选,而是在具体项目中进行配置勾选)。

      测试用户1登陆Jenkins平台后可查看到所有的项目在这里插入图片描述
      进入Web项目下Webapp1查看此时还不具备构建权限
      在这里插入图片描述

    d. 配置项目安全策略

    上面我们在访问控制->授权策略中选择了项目矩阵授权策略(没有选择安全矩阵是因为前者灵活性大,可以针对项目再进行独立配置),我们再针对具体的项目进行配置安全策略(授予测试用户1构建项目权限)。

    管理员身份进入具体项目,这里选择Web项目—>Webapp—>配置——>启用项目安全——>添加用户或群组然后对该用户授予特定权限(Build)
    在这里插入图片描述
    点击应用,此时test1用户具备了WebApp工程的构建权限
    在这里插入图片描述
    至此,Jenkins创建多用户及权限配置完成。实际工作中,我们可以按照职责为每个人或者团队授予不同级别的权限防止误操作等带来意想不到的后果!

    3. 为Jenkins配置显示构建者信息

    使用插件user-vars-plugin来配置构建用户信息
    user-vars-plugin是jenkins用户相关变量插件,使得在构建过程中可以使用用户相关环境变量

    VariableDescription说明
    BUILD_USERFull name (first name + last name)全名
    BUILD_USER_FIRST_NAMEFirst name名字
    BUILD_USER_LAST_NAMELast name
    BUILD_USER_IDJenkins user IDjinkins 用户ID
    BUILD_USER_EMAILEmail address用户邮箱

    在项目设—>构建环境中勾选set Build Name配置需要的脚本即可。
    在这里插入图片描述
    在配置项目的时候一定要勾选Set jenkins user build variables
    在此构建可见显示了构建者信息test1用户
    在这里插入图片描述

    4. 为Jenkins安装离线插件

    Jenkins插件在线安装经常会遇到超时问题java.net.SocketTimeoutException: Read timed out

    • 可更换镜像地址
      详细的Jenkins的镜像地址查询:[http://mirrors.jenkins-ci.org/status.html]

      优点:无需关心插件依赖
      这里找到清华大学的镜像网站,Jenkins安装的文件和插件的安装都可以在上面手动下载到。
      在这里插入图片描述

    • 或者下载插件离线安装

      卸载原来的插件,上传新的插件安装

      注意:有些插件需要依赖其他插件离线安装步骤如下:

      • 1、Jenkins插件管理中心搜索要安装的插件(比如:Maven Integration插件),勾选后下载,跳转到在线安装页面。
      • 2、可见按照顺序上面为其所依赖的插件,最后为目标插件
        在这里插入图片描述
      • 3、到插件中心搜索上面所需插件(.hpi格式)下载到本机在这里插入图片描述
      • 4、或者到Jenkins插件首页搜索相关插件,选择版本下载到本机在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        最终还是跳转到了[3]的Jenkins插件中心去下载,选择需要的版本下载即可。
      • 5、返回Jenkins插件管理中心-高级按照顺序从上至下上传安装离线插件即可。在这里插入图片描述
    5. Jenkins添加用户凭证类型和区别

    Jenkins平台提供用户凭证管理,凭据(credentials)是访问其他系统的认证信息,可以是账号/密码、SSH密钥、加密文件等,Jenkins可以通过设置的凭据与其它第三方应用进行认证,在可信与可控的范围内,完成第三方交互。
    Jenkins添加凭证流程:Jenkins平台首页->凭据—>系统—>全局凭据—添加凭据
    在这里插入图片描述
    这里主要介绍用户名+密码用户名+SSH密钥两种方式使用:
    a. 用户名+密码方式添加凭证
    在这里插入图片描述
    选择此种方式我们需要填写git仓库的用户名和密码即可,然后在项目配置中源码管理中Git仓库地址需要使用Use HTTPS
    使用HTTPS方式结合用户名+密码创建的凭证进行源码管理。
    在这里插入图片描述
    b. SSH方式添加凭证

    6. Jenkins远程构建方式及如何避免权限不足

    jenkins远程构建过程中常见403用户权限不足问题,经过验证针对不同的构建方式解决方案不同。常见的方式通过配置Jenkins全局安全策略授予匿名用户读取和构建权限即可解决,但是弊端也比较明显,即任何用户都可以访问项目,因此次方案不可取。下面主要介绍在不授予匿名用户任何权限情况下结合API Token方式来进行远程构建同时避免用户身份验证。

    a. 浏览器构建

    使用浏览器构建直接在浏览器地址栏输入构建地址即可。

    • 会提示登陆验证身份
      #远程构建(会跳转登陆页面,需要用户登陆Jenkins账号才可构建)
      {JENKINS_URL}/job/{JOB_NAME}/build?token={TOKEN_NAME}
      
      #例如(TOKEN_NAME可自定义,但要与jenkins平台上项目配置的身份访问令牌一致)
      http:130.88.88.88:8888/jenkins/job/WebApp/build?token=123456
      • 1
      • 2
      • 3
      • 4
    • 不会提示登陆身份验证(buildByToken方式)推荐使用
      #远程构建(避免用户登陆授权)
      {JENKINS_URL}/buildByToken/build?job={JOB_NAME}&token={TOKEN_NAME}
      
      #例如(TOKEN_NAME可自定义,但要与jenkins平台上项目配置的身份访问令牌一致)
      http:130.88.88.88:8888/jenkins/buildByToken/build?job=WebApp&token=123456
      • 1
      • 2
      • 3
      • 4

    b. 脚本构建

    除了浏览器构建之外,我们也可以使用Shell脚本来触发Jenkins进行构建

    注意:脚本构建需要使用-u携带用户授权信息,否则出现403

    • 首先了解下Linux的curl命令

      #curl命令用来发送HTTP请求,参数如下:
      -X:指定请求方式(GET请求可忽略)。
      -V:显示发送和响应结果。
      -u:携带用户名和密码(username:userpwd)。
      -H: 携带请求头信息。
      • 1
      • 2
      • 3
      • 4
    • 普通的构建方式

      #构建命令
      curl -v -u {jenkins登录名}:{jenkins密码/API Token} {JENKINS_URL}/job/{JOB_NAME}/build?token={TOKEN_NAME}
      
      #例如(TOKEN_NAME可自定义,但要与jenkins平台上项目配置的身份访问令牌一致)
      curl -v -u root:xxxxxxxx http://130.88.88.88:8888/jenkins/job/WebApp/build?token=123456
      • 1
      • 2
      • 3
      • 4
    • 使用buildByToken方式构建

      使用buildByToken方式必须使用POST方式提交

      #构建命令
      curl -v -X POST -u {jenkins登陆名}:{jenkins密码/API Token} {JENKINS_URL}/buildByToken/build?job={JOB_NAME}&token={TOKEN_NAME}
      #例如(TOKEN_NAME可自定义,但要与jenkins平台上项目配置的身份访问令牌一致)
      curl -v -X POST -u root:xxxxxxxx http://130.88.88.88:8888/jenkins/buildByToken/build?job=WebApp&token=123456
      • 1
      • 2
      • 3

      下图可见脚本发送HTTP请求时候携带了Authorzation用户认证信息在这里插入图片描述

    c. 代码构建

    上面介绍了 浏览器、Shell脚本来触发Jenkins远程构建,当然还可以通过代码的方式发送HTTP来触发远程构建,例如:使用Java提供的 HttpURLConnection来请求Jenkins进行构建

    • 使用buildByToken无需携带用户认证信息
      /**
       *代码构建使用 buildByToken方式,不需要设置Authorization认证信息;
       *TOKEN_NAME可自定义但必须与Jenkins平台配置的一致!
       */
      String strUrl = "http://130.88.88.88:8888/jenkins/buildByToken/build?"+"job=WebApp&token=123456";
      URL url = new URL(strUrl);
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
      httpURLConnection.setReadTimeout(15 * 1000);
      httpURLConnection.setConnectTimeout(10 * 1000);
      httpURLConnection.setRequestMethod("GET");
      httpURLConnection.connect();
      int responseCode = httpURLConnection.getResponseCode();
      System.out.println("response code = " + responseCode);
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • 或者使用携带用户认证信息进行构建(非buildByToken方式需要设置Authorization认证信息)
      /**
       *使用非buildByToken方式通过代码构建,需要设置Authorization认证信息;
       *TOKEN_NAME可自定义但必须与Jenkins平台配置的一致!
       */
      String strUrl = "http://130.88.88.88:8888/jenkins/job/WebApp/build?token=123456";
      URL url = new URL(strUrl);
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
      //设置Authorization认证的{username:password}
      String userpass = "root" + ":" + "xxxxxxx";
      Base64.Encoder encoder = Base64.getEncoder();
      String auth = encoder.encodeToString(userpass.getBytes("UTF-8"));
      //将认证信息设置到请求属性中
      httpURLConnection.setRequestProperty("Authorization", "Basic " + auth);
      httpURLConnection.setReadTimeout(15 * 1000);
      httpURLConnection.setConnectTimeout(10 * 1000);
      httpURLConnection.setRequestMethod("GET");
      httpURLConnection.connect();
      int responseCode = httpURLConnection.getResponseCode();
      System.out.println("response code = " + responseCode);
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

    d. Postman等模拟发包构建

    使用接口模拟发包工具进行构建模拟HTTP请求

    • 使用buildByToken方式直接访问,无需设置Authorization认证信息
      在这里插入图片描述
      Jenkins平台显示构建成功
      在这里插入图片描述
    • 使用普通方式构建需要设置Authorization身份认证信息,否则403在这里插入图片描述

    总结:
    上面介绍了Jenkins远程构建的方式(浏览器Shell脚本代码模拟发包工具)以及如何避免远程构建出现的用户权限不足(403)问题,使用buildByToken方式在浏览器代码模拟发包工具方式下无需配置用户身份认证信息,而shell脚本方式构建必须使用-u携带用户的身份认证信息才可正常构建。因此可根据业务构建方式自行选择不同的构建命令进行构建。

    如何使用远程构建携带参数?

    通常我们使用Jenkins进行项目构建都会配置参数即参数化构建,以此来满足我们针对不同平台、不同环境构建不同的产品。那么远程构建如何指定参数呢?格式如下:

    #参数化远程构建
    http://{IP}:{端口号}/buildByToken/buildWithParameters?job={Job名称}&token={Token}&{参数名}={参数值}
    • 1

    7. Jenkins构建中如何选择gradle与gradlew

    上面我们使用了gradle进行构建工程,下面我们将使用gradle包装器即gradlew来进行构建。
    在这里插入图片描述
    选择Use Gradle Wrapper方式其他不变应用后点击构建失败,提示找不到org.gradle.wrapper.GradleWrapperMain

    18:52:36 [Gradle] - Launching build.
    18:52:36 [WebApp] $ /root/.jenkins/workspace/WebApp/gradlew clean assembledebug
    18:52:37 错误: 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain
    18:52:37 Build step 'Invoke Gradle script' changed build result to FAILURE
    18:52:37 Build step 'Invoke Gradle script' marked build as failure
    18:52:37 Finished: FAILURE
    • 1
    • 2
    • 3
    • 4
    • 5

    查看仓库发现工程缺失了gradle文件夹,因此无法加载内部的gradle-warpper.jargradle-wrapper.properties文件。但是发现AS自动忽略了gradle文件夹导致未关联到Git上,至今未找到原因(有知道的小伙伴希望可以告知一下),目前解决方案是在忽略配置文件gitignore文件中通过配置指定不忽略上面两个文件

    #指定不忽略的文件(因为某些原因导致某些文件未通过ignore配置依然被忽略了)
    !gradle-wrapper.jar
    !gradle-wrapper.properties
    • 1
    • 2

    重新commit和push此时仓库已经有了gradle文件夹,执行Jenkins构建查看控制台进度可见使用gradlew构建成功!
    在这里插入图片描述在这里插入图片描述
    总结
    在多人团队开发过程中,每个人使用的Gradle版本可能会不同,如果直接使用Gradle进行编译可能导致有些成员无法通过编译。而GradlewGradle进行了一层包装,让我们无需关心Gradle的版本,他会通过使用gradle-wrapper.properties中的版本来进行构建,没有则会进行下载,以此来保证我们Gradle版本的一致性,因此我们推荐使用Gradlew来进行工程构建!

    8. Gitlab源码库里代码提交后,如何触发jenkins自动构建

    参考文章

    9. publish over ssh 实现 Jenkins 远程部署

    参考文章

    10. Jenkins插件介绍

    参考文章

    本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
    推荐阅读
    相关标签
      

    闽ICP备14008679号