Jenkins

摘要:jenkins 持续集成  docker  springboot maven  conding.net

定义:Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.----------百度百科

个人理解:一个项目从开发到上线基本都必需要经历以下过程:编码->编译->打包->部署->测试->上线,在jenkins出现以前,测试和部署往往是通过手工进行,先进一点的可能会用上一些shell脚本,插件(如alibaba-cloud-tool)等,但无论如何这样做还是比较繁琐,而且脚本满天飞,维护也比较吃力,加上项目上线后需求可能会频繁改动,这些步骤既繁琐又浪费时间,本来留给测试的时间就不多,再这么一折腾,测试人员又要加班了,jenkins的出现几乎解决了上面提到的所有问题,它只需要一键,就可以完成编译,打包,部署,单元测试等操作,甚至连一键都不需要,你可以选择配置在git提交代码时触发自动部署,它会在你git push完代码后自动完成以上步骤,真的非常强大,前阵子我还在舔Docker+IDEA插件一键自动部署,现在再看看那种方式在Jenkins面前还是有点弱,总之就四个字:强烈推荐!

废话不多说,直接进入正题,jenkins的使用大致分为三个阶段:第一阶段:安装和搭建环境,第二阶段:安装及配置,第三阶段:创建任务及测试.(以下所有内容,均为本人亲测,坑都踩完了,特发此贴以做总结和分享,请放心使用哈)


一.安装和搭建环境

1.安装:https://jenkins.io/

进入官网后点击download 然后根据自己服务器的环境,选择适合的版本下载,鉴于学习jenkins的一般水平也都OK了,安装极度简单,我这里不多啰嗦了,值得注意的是Jenkins是用Java编写的,在安装jenkins前需要先安装jdk,推荐jdk1.7+的版本.

2.安装后启动jenkins,默认的访问端口是8080,打开浏览器输入:http://ip:8080 然后进入初始化界面:

jenkins ant jmeter持续集成_springboot

 

 

初始密码存放在/var/lib/jenkins/secrets/initialAdminPassword,复制并粘贴到你的浏览器里.

然后插件的话选择系统推荐的即可:

jenkins ant jmeter持续集成_springboot_02

耐心等待安装完成后,设置一个初始的管理员账号,然后登录.

3.登录后进入系统管理->全局安全配置->安全矩阵:

创建两个用户组,当然你可以选择跳过这步,我是创建了一个管理员组和一个普通用户组.

jenkins ant jmeter持续集成_maven_03

 

用户组创建完成后创建对应的用户,然后重新登录创建好的用户即可,这里有点像LINUX的用户组合用户,为了安全我还是推荐不要省略这些步骤.

4.做完这些步骤后,回到你的服务器,用yum分别安装git,maven,docker,具体的安装都比较基础,我也就不展开讲了,安装完记得配置环境变量.

5.配置git的ssh key.

ssh-keygen -t rsa #一路按回车,生成公钥私钥
cd /root/.ssh # 进入生成后的ssh目录
git ls-remote -h ssh://$your git # 连一下git服务器,生成known_hosts文件
ll # 查看文件

jenkins ant jmeter持续集成_springboot_04

可以看到.pub结尾的就是公钥了,另一个是私钥,

known_hosts如果没有的话之后Jenkins发布时会有如下错误 “Host key verification failed.”.

复制公钥里的内容到你的github的ssh里或者coding及码云的ssh里,这里我用condig演示:

jenkins ant jmeter持续集成_springboot_05

二.安装及配置

这里仅推荐2个常用插件和3个推荐插件,如果你不使用coding.net作为git仓库的话,coding插件可以不用装.

系统管理->插件管理->available->f分别搜索:rebuilder,safe restart,maven integration,coding webhook,docker plugin

jenkins ant jmeter持续集成_Jenkins_06

jenkins ant jmeter持续集成_springboot_07

jenkins ant jmeter持续集成_springboot_08

jenkins ant jmeter持续集成_springboot_09

jenkins ant jmeter持续集成_Jenkins_10

插件也安装完成后,所有需要安装的东西已经基本结束了,接下来需要对它们进行一些配置,否则你的Jenkins可能会找不到他们.

点击 系统管理-全局工具配置->

jenkins ant jmeter持续集成_持续集成_11

jenkins ant jmeter持续集成_持续集成_12

 

jenkins ant jmeter持续集成_springboot_13

 

然后配置一下docker插件的连接,先确保你的服务器上已经安装了docker,如果没有请自行用yum命令安装.

安装好docker后需要配置一下docker支持tcp连接:

执行:vi /usr/lib/systemd/system/docker.service

修改ExeStart为:/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

jenkins ant jmeter持续集成_springboot_14

 

然后点击系统设置->

jenkins ant jmeter持续集成_持续集成_15

docker->输入你服务器的docker地址->Test Connection 连接成功即可.

jenkins ant jmeter持续集成_持续集成_16

至此,准备工作基本就绪,接下来我们正式开始构建.

 

三. 创建任务及测试

jenkins ant jmeter持续集成_maven_17

jenkins ant jmeter持续集成_docker_18

填写你的仓库地址,并添加验证凭证,即git的用户名和密码,如果有误会飘红,没飘红就继续往下走

配置触发器,也就是你git在进行一些比如Push,merge等操作时自动触发Jenkins部署项目,当然你也可以选择其他触发规则,比如轮询,或者手动等...

jenkins ant jmeter持续集成_springboot_19

然后在coding中进行配置该url,添加后在coding可以显示出是否有效

jenkins ant jmeter持续集成_maven_20

这步没问题的话,继续下一步:

jenkins ant jmeter持续集成_docker_21

 因为我们要用docker作为容器进行部署,所以接下来需要编写Dockerfile,并将其放在一个新建的工作目录下,接下来镜像的打包也在该工作目录下进行,方便管理:

#创建工作目录
mkdir  /workspace
#创建备份目录,备用
mkdir /workspace/backup

创建Dockerfile:vi Dockerfile 

FROM hub.c.163.com/library/java:8-jre

WORKDIR /workspace

CMD java -jar docker-test.jar

 

编写jenkins中打包成功后执行的shell脚本:

#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/workspace
# 源jar路径  
SOURCE_PATH=/root/.jenkins/workspace
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=jenkins-test
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
 
DATE=`date +%Y%m%d%H%M`
 
# 最新构建代码 移动到项目环境
function transfer(){
    echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH ...."
        cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH 
    echo "迁移完成"
}
 
# 备份
function backup(){
	if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
    	echo "$SERVER_NAME.jar 备份..."
        	cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
        echo "备份 $SERVER_NAME.jar 完成"
    else
    	echo "$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
    fi
}
 
# 构建docker镜像
function build(){
	if [ -n "$IID" ]; then
		echo "存在$SERVER_NAME镜像,IID=$IID"
	else
		echo "不存在$SERVER_NAME镜像,开始构建镜像"
			cd $BASE_PATH
		docker build -t $SERVER_NAME .
	fi
}
 
# 运行docker容器
function run(){
	backup
	transfer
	build
	if [ -n "$CID" ]; then
		echo "存在$SERVER_NAME容器,CID=$CID,重启docker容器 ..."
			docker restart $SERVER_NAME 
		echo "$SERVER_NAME容器重启完成"
	else
		echo "不存在$SERVER_NAME容器,docker run创建容器..."
			docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -d -p 9411:9411 $SERVER_NAME
		echo "$SERVER_NAME容器创建完成"
	fi
}
 
#入口
run

该脚本翻译一下就是:把你用Maven打包好的Jar包制作成镜像,并运行容器.

复制脚本中的内容至下面选中这里:

jenkins ant jmeter持续集成_持续集成_22

 

最后点击save保存,大功告成!

测试一下:

jenkins ant jmeter持续集成_maven_23

点击立即构建,然后Jenkins会自动开始构建,过程可能有点慢,建议你配置maven的阿里云镜像,否则会非常的慢.在maven安装目录的conf文件夹下的settings.xml中的<mirrors></mirrors>标签内加入下面内容即可.

<mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>        
 </mirror>

我们来看一下构建过程:

jenkins ant jmeter持续集成_持续集成_24

可以看到进度,点击进去然后查看consoleoutput:

jenkins ant jmeter持续集成_maven_25

整个过程观察总结之:git仓库拉取最新代码->maven自动下载依赖并将项目打包成jar->将该jar制作成镜像->将docker容器运行.

一气呵成,非常的爽,最后我们在浏览器里测试下看看有没有部署成功:

jenkins ant jmeter持续集成_springboot_26

没问题,完美,然后我随便改点代码,把>>>去掉,然后push到coding,可以发现jenkins的任务队里出现了该webhook触发的部署任务:

jenkins ant jmeter持续集成_maven_27

构建过程跟上面几乎一模一样...构建效果来看一下:

jenkins ant jmeter持续集成_springboot_28

没有问题,确实好用.

当然至此其实我只演示了Jenkins的一部分功能,它十分强大,基于pipline流水线的构建尚未进行,主要是对shell编程比较薄弱,很多自动化单元测试的脚本也不会编写,所以没法继续进行,所演示的功能仅是jenkins的冰山一角,但已如此强大,值得一学.

 


后话:这是我又一次更新此博客,原因是就在我配好生产环境的Jenkins+docker自动部署的第二天,公司服务器就被攻击了,原因主要出在了jenkins的docker插件不支持https连接,我没配ca验证,罪魁祸首就是下面这段配置:

jenkins ant jmeter持续集成_docker_29

该配置相当于是把服务器的2375端口暴露到公网了,任何知道我服务器IP的人都可以通过2375端口连接进入我服务器的docker容器,进而提取我服务器的root权限.我之所以还这么做是因为jenkins的docker插件不支持https连接,导致我不得不重新配一套公钥和私钥,当时偷了个懒,抱着侥幸心理以为不会被攻击,没想到第二天就呵呵了,那有没有办法避免这种情况?当然有,虽然它不支持Https的连接,但tcp连接是可以的,我直接重新配一套基于ca验证的tcp连接即可,配法我在另外一篇中有提到,感兴趣的可以进一步了解:

值得注意的是,配的时候在下图这两步一定要使用IP,不要用域名,否则tcp的连接会失败,只能通过Https连接:

 

jenkins ant jmeter持续集成_持续集成_30

 

然后将配置好的公钥私钥的内容依次复制添加到这里:

jenkins ant jmeter持续集成_持续集成_31

jenkins ant jmeter持续集成_Jenkins_32

 

然后测试连接,没有报错,即代表大功告成,现在即便是你知道我的服务器IP,我的2376端口也暴露在外,但没有公钥和私钥,你将无法连接到我服务器的docker,只有拥有秘钥的人可连.

如果你觉得配置起来太麻烦,然后自己服务器上又没啥重要值钱的东西,被攻击一下也无妨,那你可以仍用上面最原始那种方法,但可以把端口改成2376,因为2376端口一般是会配ca加密时使用的端口,所以黑客一般不会攻击这个接口,大部分都只攻击2375端口,这样可以诈过大部分攻击者.就说这么多,总之还是不要侥幸的好,这次长记性了,安全严谨第一位,否则两行泪啊...