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 然后进入初始化界面:
初始密码存放在/var/lib/jenkins/secrets/initialAdminPassword,复制并粘贴到你的浏览器里.
然后插件的话选择系统推荐的即可:
耐心等待安装完成后,设置一个初始的管理员账号,然后登录.
3.登录后进入系统管理->全局安全配置->安全矩阵:
创建两个用户组,当然你可以选择跳过这步,我是创建了一个管理员组和一个普通用户组.
用户组创建完成后创建对应的用户,然后重新登录创建好的用户即可,这里有点像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 # 查看文件
可以看到.pub结尾的就是公钥了,另一个是私钥,
known_hosts如果没有的话之后Jenkins发布时会有如下错误 “Host key verification failed.”.
复制公钥里的内容到你的github的ssh里或者coding及码云的ssh里,这里我用condig演示:
二.安装及配置
这里仅推荐2个常用插件和3个推荐插件,如果你不使用coding.net作为git仓库的话,coding插件可以不用装.
系统管理->插件管理->available->f分别搜索:rebuilder,safe restart,maven integration,coding webhook,docker plugin
插件也安装完成后,所有需要安装的东西已经基本结束了,接下来需要对它们进行一些配置,否则你的Jenkins可能会找不到他们.
点击 系统管理-全局工具配置->
然后配置一下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
然后点击系统设置->
docker->输入你服务器的docker地址->Test Connection 连接成功即可.
至此,准备工作基本就绪,接下来我们正式开始构建.
三. 创建任务及测试
填写你的仓库地址,并添加验证凭证,即git的用户名和密码,如果有误会飘红,没飘红就继续往下走
配置触发器,也就是你git在进行一些比如Push,merge等操作时自动触发Jenkins部署项目,当然你也可以选择其他触发规则,比如轮询,或者手动等...
然后在coding中进行配置该url,添加后在coding可以显示出是否有效
这步没问题的话,继续下一步:
因为我们要用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包制作成镜像,并运行容器.
复制脚本中的内容至下面选中这里:
最后点击save保存,大功告成!
测试一下:
点击立即构建,然后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>
我们来看一下构建过程:
可以看到进度,点击进去然后查看consoleoutput:
整个过程观察总结之:git仓库拉取最新代码->maven自动下载依赖并将项目打包成jar->将该jar制作成镜像->将docker容器运行.
一气呵成,非常的爽,最后我们在浏览器里测试下看看有没有部署成功:
没问题,完美,然后我随便改点代码,把>>>去掉,然后push到coding,可以发现jenkins的任务队里出现了该webhook触发的部署任务:
构建过程跟上面几乎一模一样...构建效果来看一下:
没有问题,确实好用.
当然至此其实我只演示了Jenkins的一部分功能,它十分强大,基于pipline流水线的构建尚未进行,主要是对shell编程比较薄弱,很多自动化单元测试的脚本也不会编写,所以没法继续进行,所演示的功能仅是jenkins的冰山一角,但已如此强大,值得一学.
后话:这是我又一次更新此博客,原因是就在我配好生产环境的Jenkins+docker自动部署的第二天,公司服务器就被攻击了,原因主要出在了jenkins的docker插件不支持https连接,我没配ca验证,罪魁祸首就是下面这段配置:
该配置相当于是把服务器的2375端口暴露到公网了,任何知道我服务器IP的人都可以通过2375端口连接进入我服务器的docker容器,进而提取我服务器的root权限.我之所以还这么做是因为jenkins的docker插件不支持https连接,导致我不得不重新配一套公钥和私钥,当时偷了个懒,抱着侥幸心理以为不会被攻击,没想到第二天就呵呵了,那有没有办法避免这种情况?当然有,虽然它不支持Https的连接,但tcp连接是可以的,我直接重新配一套基于ca验证的tcp连接即可,配法我在另外一篇中有提到,感兴趣的可以进一步了解:
值得注意的是,配的时候在下图这两步一定要使用IP,不要用域名,否则tcp的连接会失败,只能通过Https连接:
然后将配置好的公钥私钥的内容依次复制添加到这里:
然后测试连接,没有报错,即代表大功告成,现在即便是你知道我的服务器IP,我的2376端口也暴露在外,但没有公钥和私钥,你将无法连接到我服务器的docker,只有拥有秘钥的人可连.
如果你觉得配置起来太麻烦,然后自己服务器上又没啥重要值钱的东西,被攻击一下也无妨,那你可以仍用上面最原始那种方法,但可以把端口改成2376,因为2376端口一般是会配ca加密时使用的端口,所以黑客一般不会攻击这个接口,大部分都只攻击2375端口,这样可以诈过大部分攻击者.就说这么多,总之还是不要侥幸的好,这次长记性了,安全严谨第一位,否则两行泪啊...