目录
测试环境
VMware® Workstation 12 Pro 12.1.1 build-3770994
Ubuntu16、docker 19.03.9
Jdk1.8 \Maven3.6.3\git2.17.1\OpenSSL 1.1.1\OpenSSH_7.6p1
Jenkins lts版 2.222.3.
工具putty、eclipse
github:https://github.com/leon2016/hello_word.git
测试效果
通过jenkins一键分布式部署github上springboot项目到两个服务器上,并支持定时构建。
一、Ubuntu安装Docker
1.1卸载旧版本
我使用的是putty连接本地虚拟机。
# apt-get remove docker docker-engine docker.io containerd runc
1.2设置 Docker 仓库
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。
# apt-get update
# apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
(1)添加 Docker 的官方 GPG 密钥:
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
(2)9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥:
#apt-key fingerprint 0EBFCD88
(3)使用以下指令设置稳定版仓库
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
1.3设置阿里云镜像加速器:
设置后下载速度会大幅提升。
# mkdir -p /etc/docker
# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lcu2fcdl.mirror.aliyuncs.com"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker
镜像加速器获取地址:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
1.4安装 Docker Engine-Community
方式一:执行下面命令可安装最新版本
# apt-get install docker-ce docker-ce-cli containerd.io (推荐)
方式二:执行下面命令安装特定稳定版本
# apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
安装下载需要一点时间,了解了一下Docker Engine :
- 社区版 ( CE, Community Edition )社区版 ( Docker Engine CE ) 主要提供了 Docker 中的容器管理等基础功能,主要针对开发者和小型团队进行开发和试验,社区版本是免费。
- 企业版 ( EE, Enterprise Edition )则在社区版的基础上增加了诸如容器管理、镜像管理、插件、安全等额外服务与功能,为容器的稳定运行提供了支持,适合于中大型项目的线上运行,企业版是收费的。
1.5测试docker是否安装成功
# docker run hello-world
查看docker版本:
# docker --version
1.6使用 Shell 脚本进行安装
Docker 在 get.docker.com 和 test.docker.com 上提供了方便脚本,用于将快速安装 Docker Engine-Community 的边缘版本和测试版本。脚本的源代码在 docker-install 仓库中。 不建议在生产环境中使用这些脚本。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
Tips:
如果要用 Docker 作为非root用户,则应考虑使用类似以下方式将用户添加到 docker 组:
$ sudo usermod -aG docker your-user
二、Docker基本使用及常用命令
参考:https://www.runoob.com/docker/docker-hello-world.html
2.1 docker 基本命令
docker run -name 容器名 -v 挂载 镜像 // 启动容器
docker run --rm // 每次退出清理容器文件系统,适合调试
docker run --restart=always // 自动重启容器,与上面互斥
docker ps -a // 查看运行的容器,-a表示查看所有容器
docker exec -it 容器id /bin/bash // 进入容器,exit退出
docker kill/stop 容器id // 强行停止/停止容器
docker run -d // 启动容器,-d表示后台启动
docker start 容器id // 启动一个已停止的容器
docker restart 容器id // 重启容器
docker logs -f +容器名 // 打印日志
docker start `docker ps -a -q` // 启动所有运行过的容器
docker stop `docker ps -a -q` // 停止所有运行过的容器
docker rmi 镜像id
docker rm 容器id
2.2 docker容器自动启动设置
在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:
docker run --restart=always
如果已经启动了则可以使用如下命令:
docker update --restart=always 容器id
三、安装启动jenkers
3.1官网
3.2 docker安装jenkins
普通安装
# apt-get update
# apt-get install jenkins
Docker安装jenkers(推荐):
简单安装启动命令如下,后面会讲到更复杂的命令:
# docker run --name jenkins --user=root --restart=always -p 8080:8080 -p 50000:50000 -v /opt/data/jenkins_home:/var/jenkins_home -d jenkins/jenkins:lts
Docker run详解参考:https://www.cnblogs.com/yfalcon/p/9044246.html
3 访问和解锁Jenkins
http://192.168.79.130:8080/
Docker的可以直接日志查看密码
# docker logs jenkins // jenkins是所创建的容器的名字
比如我的密码:48d6ffe4f7354f85aef0c5135e40269b
正确输入密码后进入上面插件安装页面。现在,docker、jenkins都正常运行了,下面准备发布一个springboot的helloworld项目。
四、准备一个springboot项目
可以直接用我github上的一个demo:
https://github.com/leon2016/hello_word.git
自己也可以快速生成springboot项目,地址:https://start.spring.io/
五、搭建服务器环境
5.1安装jdk
# apt-get install openjdk-8-jdk
# java -version # 查看是否安装成功
安装目录在 /usr/lib/jvm/java-8-openjdk-amd64
5.2安装maven
官网下载最新安装包:http://maven.apache.org/download.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
# mkdir /opt/maven
# cd /opt/maven
# wget <官网maven安装包下载地址>
# tar zvxf <安装包.gz>
修改maven镜像地址方法
在maven文件夹下的/conf/settings.xml的mirrors节点中添加(对所有的项目都有效)
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
命令:vi settings.xml-> 可输入/mirrors快速定位mirrors节点位置->i插入->esc->:wd保存
配置环境变量
在/etc/profile 中最后面添加以下几行
MAVEN_HOME=<maven安装目录>
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
执行source /etc/profile使环境变量生效
运行mvn -v验证maven是否安装成功
Tips:# whereis mvn也可查看安装目录
5.3安装git
# apt-get install git
设置提交用户名和邮箱
git config --global user.name "leon"
git config --global user.email "1754******53@qq.com"
5.4关闭防火墙
为了测试方便暂时关闭防火墙,暂时不讨论防火墙安全设置问题,后续总结。
sudo ufw status # 查看防火墙状态
sudo ufw disable #关闭防火墙
5.5克隆两个副本服务器备用
六、使用jenkins发布springboot项目
前面都是铺垫,现在才是激动人心的时刻。。
现在将配置jenkins实现一键分布式部署springboot项目,jenkins将帮我们:
- 从git仓库中检出代码
- 执行maven的
clean install
编译命令
- 将编译后的jar包通过ssh分发到指定的服务器
剩下的需要应用服务器配置:
- 应用服务器环境搭建:应用服务器应安装好java运行环境。
- 启动脚本:jenkins只是将jar包分发到了服务器,需要编写启动脚本
6.1安装推荐的插件
安装推荐的插件,可能需要等很长一段时间,出现错误了也没关系,后面可以再安装。
Tips1:使用容器镜像加速器
使用jenkins默认插件下载地址很慢,提速方法如下:
# docker ps // 找到jenkins容器的id ,我的是487a96db6adf
# docker exec -it 487a96db6adf /bin/bash // 使用docker exec命令进入容器命令行
执行下列修改/var/jenkins_home/updates/default.json文件,文件位于jenkins工作目录
# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
# exit退出容器
修改完成后,jenkins将使用百度和下面地址下载和更新插件:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
Tips2:插件安装失败解决方法
之前安装失败的插件可以在插件管理再次尝试安装:
6.2安装一个必备插件
同理安装Maven Release Plug-in、Publish Over SSH两个必备插件。
6.3创建管理员
6.4全局工具配置
出现红色错误提示处理方法:
方法一:通过-v参数挂载相应的目录 (推荐)
docker run --name=jenkins --restart=always \
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /root/.m2:/root/.m2 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/jvm/java-8-openjdk-amd64/bin/java:/usr/lib/jvm/java-8-openjdk-amd64/bin/java \
-v /usr/lib/jvm/java-8-openjdk-amd64:/usr/lib/jvm/java-8-openjdk-amd64 \
-v /opt/maven/apache-maven-3.6.3:/opt/maven/apache-maven-3.6.3 \
-v /opt/data/jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
方法二:docker exec命令进入docker安装相应的环境
如图,按照方法一挂载后,就没有报错了,可以正常设置jdk,git,maven,并保存成功了。
6.5系统配置
系统配置主要需要配置:git ,ssh应用服务器(后续springboot项目将部署到其上面)
最后点击保存就ok了,接下来,新建一个一键分布式部署springboot的任务。
6.6新建一个任务
(1)新建一个maven构建任务。
(2)配置git仓库和构建触发器
(3)配置构建命令及构建成功后分发SSH服务器
Tips:如果不知道Source files怎么配,可以配置好git后,执行一下构建,然后查看工作空间。
继续添加第2台服务器,配置方式同服务器1一样即可。
配置完后,保存就好了,下面我们开始构建。
Tips:Server.sh脚本代码如下,需要提前放置到应用服务器上,并给予执行权限,命令:chmod +x sh文件名。
#!/bin/bash
function killproject()
{
project_pid=$(netstat -lnp | grep 8090|awk '{print $7}'|cut -d/ -f1)
if [ $project_pid > 0 ];then
echo "项目已经启动了,开始关闭项目,项目pid为: $project_pid "
kill -9 $(netstat -lnp | grep 8090|awk '{print $7}'|cut -d/ -f1)
echo '项目关闭成功,开始重启项目。。。'
else
echo "项目未启动,直接启动"
fi
}
function start_project()
{
source /etc/profile
echo '正在启动项目。。。'
cd /usr/local/jenkins-target/
nohup java -jar demo-0.0.1-SNAPSHOT.jar >publish.log &2>1 &
}
function check_project()
{
check_pid=$(netstat -lnp | grep 8090|awk '{print $7}'|cut -d/ -f1)
if [ $check_pid > 0 ];then
echo "project is start and pid = : $check_pid "
else
echo "project are not start"
fi
}
killproject
start_project
sleep 15
check_project
6.7构建
(1)点击立即构建,双击进度条,选择控制台输出,可以查看日志
(2)构建成功标识
(3)验证
访问服务器1,服务器2的springboot项目接口,接口正常访问代表部署成功。
(4)版本回退(TODO)
上面构建成功了,只是一个比较好的开始。有时候,新发版本会出现问题,通过jenkins执行shell的能力,我们也可以构建一个任务专门用于版本回退,还有邮件通知、通过构建docker容器发布应用等等。(未完待续)
jenkins配置qq邮件通知已更新:https://blog.csdn.net/doctorvian/article/details/106297950
七、问题与解决
参考了许多资料,失败了多次才最终构建成功,这只是第一步,jenkins的功能十分强大,后续还可以添加很多实用的定制功能,如邮件提醒等。最后再总结一下,实践中遇到的一些问题和解决方法。
1.报错:Could not transfer artifact ... sun.security.validator.ValidatorException: No trusted certificate found
解决方式:
maven命令加-X获取更多保存日志。
docker run 添加maven本地仓库挂载,同时检查一下jdk,maven配置或挂载。
-v /root/.m2:/root/.m2 \
2.报错:ERROR: Aborted Maven execution for InterruptedIOException
这个错误偶尔会出现,重新构建即可,更多参考:
https://issues.jenkins-ci.org/browse/JENKINS-3273
3.报错:ssh分发jar包时出现No such file or dirctory
在应用服务器上创建相应目录,如果是在root用户下创建的,需要chmod 777 目标文件夹。
4.报错:permission denied
(1)如下图:这个是权限问题,是sh没有执行权限,可以通过chmod +x server.sh赋予执行权限。
(2)如下图:这个是推送jar到目标目录jenkins-target时,ssh登录用户leon没有jenkins-target目录的操作权限导致的,可以通过chmod 777 jenkins-target赋权解决。
参考文献
https://www.runoob.com/docker/ubuntu-docker-install.html
https://www.runoob.com/docker/docker-hello-world.html
https://www.jianshu.com/p/41f2def6ec59
https://www.cnblogs.com/dengfaheng/p/10959120.html
https://blog.csdn.net/wwd0501/article/details/78470534
https://blog.csdn.net/niuzaiwenjie/article/details/80747709
https://blog.csdn.net/qq_38270106/article/details/97764483
https://www.cnblogs.com/jiefu/p/10968296.html
https://www.jianshu.com/p/72d05e43a8f3
https://github.com/jenkinsci/docker
https://www.cnblogs.com/sxdcgaq8080/p/10489326.html
https://www.cnblogs.com/zsh-blogs/p/10508656.html
https://www.cnblogs.com/yyxianren/p/10904518.html
https://blog.csdn.net/zjh_746140129/article/details/80904876
https://www.cnblogs.com/ztxd/p/12346806.html
https://blog.csdn.net/weixin_33743661/article/details/92550013
https://www.cnblogs.com/zsh-blogs/p/10508656.html
https://www.jianshu.com/p/8b47631ae374