使用Jenkins实现持续集成构建Android应用需要在Jenkins平台配置的环境:JDK、Git、Gradle、android sdk。
如何搭建Jenkins环境请参考《阿里云服务器搭建(三)~安装Jenkins》
具体配置不在赘述,可参考《阿里云服务搭建(一)~安装JDK》
查看当前系统Git版本(如果存在),根据自己需要是否卸载重新安装
#查看系统当前Git版本
git --version
#删除Git
yum remove 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 [email protected]:/usr/local/git/
#解压git到当前文件夹
tar -zxvf git-2.9.5.tar.gz
#进入到git解压目录
cd git-2.9.5
#执行编译安装
make prefix=/usr/local/git all
make prefix=/usr/local/git install
#查看git
whereis git
git --version
PS:安装过程中如果遇到错误可参考文未扩展 《1. Linux安装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
#查看当前git全局配置信息
git config --list
#查看当前git全局用户名、邮箱配置信息
git config user.name
git config user.email
#查看当前系统是否存在Git公私钥(如果有id_rsa、id_rsa.pub则说明git公私钥已经存在)
cd ~/.ssh
ls
git config --global user.name "用户名"
git config --global user.email "邮箱"
如果当前环境不存在Git公私钥则进行创建(前提是要先配置Git用户名和邮箱)
ssh-keygen -t rsa -C "邮箱账号" #一路回车即可生成公私钥
查看生成的公钥
cd ~/.ssh
ls
#新生成的公私钥文件
id_rsa id_rsa.pub
登陆jenkins平台进入管理Jenkins->Global Tool Configuration->Git
,配置Git环境
至此Jenkins平台Git环境配置完成!
进入Jenkins管理平台管理Jenkins—>Global Tool Configuration—>Gradle
选择自动安装
注意需要根据项目所使用的版本保持一致(例如AndroidStudio中使用的是5.1.1则Jenkins也需要安装对应版本)
AndroidStudio中使用Gradle版本:
Jeninks选择对应版本
选好后点击应用保存即可(点了保存肯定是没有安装的,这个得再正式build项目时安装,所以不要着急)。
下载android-sdk(这里下载的是[android-sdk_r24.4.1-linux.tgz]
)到本机。
将下载的android-adk上传至远程服务的usr/android/sdk
目录下(没有此目录则先创建)
#在服务器usr目录下创建andorid/sdk 目录
mkdir usr/android/sdk
#本机执行上传android-sdk至创建的目录
scp android-sdk_r24.4.1-linux.tgz [email protected]:/usr/android/sdk
#将android-sdk解压至当前目录
tar -zxvf android-sdk_r24.4.1-linux.tgz
在/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
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
....
我们可以根据自己的需要来进行下载更新,官方提供了一些参数供开发者选择性更新:
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 : 包括所有的包(例如过时的和非依赖的)的)。
下载更新命令如下:
#更新android-sdk资源包命令[id]是包序列号,如果下载多个用逗号(,)分隔。
android update sdk -u -a -t [id]
#依据序列号下载更新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
#依据序列号下载更新所需版本的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
#依据序号下载android-support-repository
android update sdk -u --all --filter 216
至此Androd-SDK安装更新完成!
打开Jenkins控制台,进入系统配置->全局属性
添加环境变量
上述环境配置好之后,我们可以将GitLab或者GitHub上面的项目集成到Jenkins平台
我们首先选择在移动项目
下点击新建Item
,创建一个项目,输入项目名称,然后选择自由风格,点击OK即可
返回首页此时MobileApp
项目已创建完成,点击进入,选择配置可见如下六个模块,将会一一介绍如何配置:
这里主要关注三点(描述
、启用项目安全
、丢弃旧的构建
、参数化构建
)
描述
主要介绍项目有关情况
丢弃旧的构建
Jenkins提供对以往构建记录(包括控制台输出、归档工件和与特定构建相关的任何其他元数据)的丢弃处理,以此来保持更少的构建意味着在构建记录根目录中使用更少的磁盘空间。
Jenkins提供了两种方案来丢弃旧的构建记录:
这两个选项可以同时生效,例如:您可以将构建保留3天,但最多只能保留10个构建。如果任何一个限制被超过,那么任何超过这个限制的构建都将被丢弃。应用后返回可见我们的工程只保留了最近的10次构建记录。
启用项目安全
可选项用来针对不同的用户分配不同的操作权限。
该选项配合管理Jenkins
—>全局安全配置(Configure Global Security)
—>授权策略
中的项目矩阵授权策略
使用,可实现针对该项目给予不同的用户授予不同的权限(比如:浏览、构建、删除、创建等等),以此确保非相关管理人员具备超级权限对项目的误操作(比如:删除了项目)带来的后果。具体使用见文章底部扩展 《2. 为Jenkins添加多用户及分配权限》
参数化构建
当我们在构建的时候,需要选择具体构建那个分支,或者通过选择一些参数来控制构建的流程,那又该怎么办呢?下面将带大家一起看看Jenkins的参数化构建,以及提供的一些参数化构建的插件。参数化构建除了系统给出的几种类型,我们可以
通过插件来扩展类型,达到我们的目的
。
这里配置的参数,可以像Jenkins系统提供的环境变量一样,在需要的地方,通过名称获取它的值,比如在执行shell脚本的时候,可以通过${参数名}
获取对应的值。
使用Jenkins参数化构建,需要一些参数动态的替换项目中约定的属性,因此我们的工程项目也需要配置一些动态属性。
我们的Android项目通过Jenkins参数化构建需要动态写入的参数有版本号、构建时间、是否来自Jenkins构建(如果来自Jenkins打包生成的路径与本地打包生成的不一致,以及签名文件路径也不一致)等。
我们把需要动态配置的属性通过配置在gradle.properties
文件中,然后在build.gradle
中引用。(Jenkins打包时会根据平台配置一致的参数替换gradle.properties中的值)
进入构建配置中的Invoke Gradle script
中高级
勾选Pass jod parameters as Gradle properties
没有此项的可以勾选Pass all job parameters as Project properties
当项目存在多个分支时,比如开发用的开发分支,而测试用的测试分支,打线上包时需要用的master分支等,那么这时候可能就需要选择具体的分支来进行打包。
源码管理主要是将我们要使用Jenkins进行持续继承的GitLab或者GitHub上的项目拉取到Jenkins平台上然后方可进行后续的一些列构建等操作。管理的方式有通过GIT
和SVN
两种方式,我这里使用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添加用户凭证类型和区别》
触发远程构建
顾名思义就是在非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:用户自定义的身份验证令牌
如何查看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
浏览器访问上述地址则会提示用户身份验证,身份验证后则会自动构建项目(非参数化构建
)。
可以通过在构建地址后添加&cause="构建描述"
来声明本次构建的描述,即:
#远程构建,添加构建描述
http://130.88.88.88:8888/jenkins/job/WebApp/build?token=8888&cause=远程构建
如何避免每次远程构建身份验证以及远程构建有哪些方式?参见文末扩展 《6. Jenkins远程构建方式及如何避免权限不足》
其他工程构建后触发
其他工程构建后触发本工程的构建,假如我现在有两个工程如下:
我期望在MobileApp1
构建稳定(成功)之后触发WebApp
的构建,则我们在WebApp
工程配置中构建触发器勾选Build after other projects are built
并填写我们关联的工程MobileApp1
,勾选下方的只有构建稳定时触发
即可。
此时我们先主动构建MobileApp1工程试试
MobileApp1构建成功,紧接着触发了WebApp工程的构建
可见WebApp工程在MobileApp1工程构建完成后触发了构建。
定时构建(Build periodically)
定时构建是周期进行项目构建(它不在乎源码是否发生变化)
#共5颗星占位符表示(中间用空格隔开)
[* * * * *]
# 第一个*表示分钟,取值0~59
# 第二个*表示小时,取值0~23
# 第三个*表示一个月的第几天,取值1~31
# 第四个*表示第几月,取值1~12
# 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
举例说明
#每隔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-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}
#任何空白行和'#'开始的行都将表示为注释而不予理睬。
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后进行构建,否则放弃本次构建!
构建环境用来配置Jenkins构建前及过程中的一些操作,具体功能如下
构建配置可配置构建步骤,所支持的步骤如下
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模式构建一下看看,打开控制台可以看到我们构建进度
上面是使用了gradle
执行了我们配置的Tasks脚本进行构建,可见构建成功,我们进入工程查看下build下面生成了对应的apk
当然我们也可以选择使用Use Gradle Wrapper
即(Gradlew)的方式进行构建,具体的区别可参考文末扩展 《7. Jenkins构建中如何选择gradle与gradlew》
配置构建后的操作可以让Jenkins在构建完之后执行什么操作,比如邮件通知、构建其它项目、执行脚本等。
Archive the artifacts(归档构建文件)
把构建结果存档(例如,发布版zip、jar、apk等文件)并显示在构建页面,以便以后可以下载它们!可从Jenkins的网页访问存档文件。
例如,我需要将构建结果apk目录下的文件存档,配置如下:
可使用通配符如module/dist/**/*.zip
,存档的文件根目录是当前工程的工作空间,且只能存档当前工作区中的文件!
应用设置重新构建看看,通过我们配置的构建存档文件显示在了构建页面上面,可直接访问下载!
Build other projects(构建其他工程)
在当前工程构建完成之后构建其他工程,如果需要构建多个其他工程中间用逗号隔开
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/
执行构建控制台输出成功
进入到项目工作空间下查看确实成功移动到了我们的download目录下面了,说明我们配置的shell脚本被成功执行。
当前构建结束后我们还可以执行复杂的脚本比如:针对apk
文件进行签名
、对齐
、插入多渠道信息
等等,这些操作待后续讲解。
配置好上述功能后,返回项目点击构建控制台输出可见构建日志信息,返回项目查看工作空间,可见项目已经被pull到Jenkins平台,构建历史显示第一次构建为root用户。(其实上面功能配置过程中我们已经进行无数次的构建)
a. 致命错误:openssl/ssl.h:没有那个文件或目录
#安装openssl和openssl-devel
yum install openssl
yum install openssl-devel
b. 致命错误:curl/curl.h:没有那个文件或目录
#安装curl-devel
yum -y install curl-devel
c. 致命错误:expat.h:没有那个文件或目
#安装expat-devel
yum install -y expat-devel
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
a. 管理员身份登陆Jenkins平台
b. 新建用户
c. 配置全局安全策略
返回到Jenkins管理->Configure Global Security
设置如下:
第一步启用安全
。
第二步安全域
选择Jenkins own user database
不要勾选允许用户注册(如果选择了允许用户注册
那么任何人都可以注册,只是注册后没有任何操作权限)。
第三步授权策略
选择项目矩阵授权策略
。
第四步点击添加用户或群组,填写之前创建的test
用户。
第五步根据需求给用户授权相应的权限。
如上,给测试用户1全局Overall策略和全局Job策略仅授予读取的权限(构建权限具体到项目中授予,如果不想让用户可见所有项目,则不要勾选Job下的Read项)。
PS:常见的授权策略解释
Overall:全局整体权限:
- Administer: 最高权限,拥有该权限可以做任何事情。
- Read:读取权限,用户必须授予阅读权限,否则什么都看不到。
Job:全局任务权限(此处配置适用于所有项目,也可以不做任何配置,而是在具体的项目中配置)
- Build:构建权限,如果配置则所有项目该用户都具备构建权限
- Delete:删除权限,如果配置则该用户拥有所有项目的删除权限
- Read:读取权限:如果配置则该用户具备所有项目的查看权限(如果仅让用户指定可见某些项目,此选择不勾选,而是在具体项目中进行配置勾选)。
d. 配置项目安全策略
上面我们在
访问控制->授权策略
中选择了项目矩阵授权策略
(没有选择安全矩阵
是因为前者灵活性大,可以针对项目再进行独立配置),我们再针对具体的项目进行配置安全策略(授予测试用户1构建项目权限)。
管理员身份进入具体项目,这里选择Web项目—>Webapp—>配置——>启用项目安全——>添加用户或群组
然后对该用户授予特定权限(Build)
点击应用,此时test1用户具备了WebApp工程的构建权限
至此,Jenkins创建多用户及权限配置完成。实际工作中,我们可以按照职责为每个人或者团队授予不同级别的权限防止误操作等带来意想不到的后果!
使用插件user-vars-plugin来配置构建用户信息
user-vars-plugin
是jenkins用户相关变量插件,使得在构建过程中可以使用用户相关环境变量
Variable | Description | 说明 |
---|---|---|
BUILD_USER | Full name (first name + last name) | 全名 |
BUILD_USER_FIRST_NAME | First name | 名字 |
BUILD_USER_LAST_NAME | Last name | 姓 |
BUILD_USER_ID | Jenkins user ID | jinkins 用户ID |
BUILD_USER_EMAIL | Email address | 用户邮箱 |
在项目设—>构建环境中勾选set Build Name
配置需要的脚本即可。
在配置项目的时候一定要勾选Set jenkins user build variables
在此构建可见显示了构建者信息test1用户
Jenkins插件在线安装经常会遇到超时问题
java.net.SocketTimeoutException: Read timed out
可更换镜像地址
详细的Jenkins的镜像地址查询:[http://mirrors.jenkins-ci.org/status.html
]
或者下载插件离线安装
卸载原来的插件,上传新的插件安装
注意:有些插件需要依赖其他插件离线安装步骤如下:
Jenkins平台提供用户凭证管理,凭据(credentials)是访问其他系统的认证信息,可以是账号/密码、SSH密钥、加密文件等,Jenkins可以通过设置的凭据与其它第三方应用进行认证,在可信与可控的范围内,完成第三方交互。
Jenkins添加凭证流程:Jenkins平台首页->凭据—>系统—>全局凭据—添加凭据
这里主要介绍用户名+密码
和用户名+SSH密钥
两种方式使用:
a. 用户名+密码方式添加凭证
选择此种方式我们需要填写git仓库的用户名和密码即可,然后在项目配置中源码管理
中Git仓库地址需要使用Use HTTPS
。
使用HTTPS方式结合用户名+密码创建的凭证进行源码管理。
b. SSH方式添加凭证
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
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
b. 脚本构建
除了浏览器构建之外,我们也可以使用Shell脚本来触发Jenkins进行构建
注意:脚本构建需要使用-u
携带用户授权信息,否则出现403
首先了解下Linux的curl命令
#curl命令用来发送HTTP请求,参数如下:
-X:指定请求方式(GET请求可忽略)。
-V:显示发送和响应结果。
-u:携带用户名和密码(username:userpwd)。
-H: 携带请求头信息。
普通的构建方式
#构建命令
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
使用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
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);
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);
d. Postman等模拟发包构建
使用接口模拟发包工具进行构建模拟HTTP请求
总结:
上面介绍了Jenkins远程构建的方式(浏览器
、Shell脚本
、代码
、模拟发包工具
)以及如何避免远程构建出现的用户权限不足(403)问题,使用buildByToken
方式在浏览器
、代码
、模拟发包工具
方式下无需配置用户身份认证信息,而shell脚本
方式构建必须使用-u
携带用户的身份认证信息才可正常构建。因此可根据业务构建方式自行选择不同的构建命令进行构建。
如何使用远程构建携带参数?
通常我们使用Jenkins进行项目构建都会配置参数即参数化构建,以此来满足我们针对不同平台、不同环境构建不同的产品。那么远程构建如何指定参数呢?格式如下:
#参数化远程构建
http://{IP}:{端口号}/buildByToken/buildWithParameters?job={Job名称}&token={Token}&{参数名}={参数值}
上面我们使用了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
查看仓库发现工程缺失了gradle
文件夹,因此无法加载内部的gradle-warpper.jar
和gradle-wrapper.properties
文件。但是发现AS自动忽略了gradle
文件夹导致未关联到Git上,至今未找到原因(有知道的小伙伴希望可以告知一下),目前解决方案是在忽略配置文件gitignore
文件中通过配置指定不忽略上面两个文件
#指定不忽略的文件(因为某些原因导致某些文件未通过ignore配置依然被忽略了)
!gradle-wrapper.jar
!gradle-wrapper.properties
重新commit和push此时仓库已经有了gradle文件夹,执行Jenkins构建查看控制台进度可见使用gradlew
构建成功!
总结
在多人团队开发过程中,每个人使用的Gradle
版本可能会不同,如果直接使用Gradle
进行编译可能导致有些成员无法通过编译。而Gradlew
对Gradle
进行了一层包装,让我们无需关心Gradle
的版本,他会通过使用gradle-wrapper.properties
中的版本来进行构建,没有则会进行下载,以此来保证我们Gradle版本的一致性,因此我们推荐使用Gradlew
来进行工程构建!
参考文章
参考文章
参考文章