说明
本地测试环境为springboot微服务项目。用户提交代码到gitlab,触发jenkins拉取gitllab上的代码,然后完成编译构建成jar包,同步完成sonarsqube代码质量检测。然后在jenkins内部完成生成镜像,并将镜像推送到harbor仓库中,然后部署到对应的服务器上。
依赖环境部署
环境准备
使用环境说明
使用的虚拟机环境centos7.9,使用vmware安装
同步主机时区为亚洲,并同步时间
[root@linux-node ~]# echo "ZONE=Asia/Shanghai" >> /etc/sysconfig/clock
[root@linux-node ~]# rm -f /etc/localtime
#链接到上海时区文件
[root@linux-node ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
关闭防火墙和selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
设置yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
安装docker
创建数据目录将数据持久话到该目录下,以便后期好维护
mkdir -p /data
安装maven
gitlab安装部署
harbor安装部署
jenkins安装部署
sonarqube部署
创建java工程并测试将代码上传到gitlab仓库
gitlab上创建项目
创建springboot工程,并将代码提交到hello-test工程下
jenkins集成篇
说明
jenkins插件安装
离线安装:将下载好的插件直接上传到目录plugins重启(我的目录是/data/jenkins_home/plugins)
上传后重启jenkins,重启可以在url后加restart完成。如:http://192.168.59.129:8090/restart
已经整理好的插件上传到gitee上,需要的话可以联系下载
https://gitee.com/jsonsvn/jenkins-plugins.git
创建自由风格的项目
jenkins全局配置
管理Jenkins中点击
配置maven
手动配置:
主机上安装maven后将maven的安装目录移动到jenkins数据卷中
重命名文件夹
在页面上配置,MAVEN_HOME要使用容器内部目录,不要使用宿主机目录
配置jdk
页面配置jdk
jenkins系统配置
我们要将构建好的jar包发送到目标服务器上并部署起来,需要使用Publish Over Ssh插件,用于jenkins可以连接到目标服务器。
配置
系统配置最下面会有个Publish over SSH
点击新增
密码需要点击高级设置,勾选Use password authentication, or use a different key,然后填写密码
Remote Directory 需要在设置的主机上提前创建好,否则会报错。
点击下面的测试按钮测试是否配置成功。
jenkins集成git
填入项目的地址
项目私有,创建私有的账号密码
指定分支
配置成功后jenkins会将代码下载到jenkins用户的家目录的workspace目录下,如下图操作:
集成maven构建
1.点击增加构建步骤----选择调用顶层Maven目标
2.配置maven构建执行的命令3.点击立即构建查看日志会看到执行的命令查看容器目录 会发现在workspace项目目录下多了个target目录,jar包在里面。
参数化构建过程
需要安装插件Git Parameter
为了将代码构建前切换到对应的版本,增加一个构建步骤
将其拖到构建步骤前,顺序是这样的。
需要在gitlab上创建标签
填写标签名
修改代码 打标签为2.0.0
然后刷新jenkins,发现构建已经变成 build with parameters
这样就可以完成基于标签去完成版本的发布了,需要回退的只需要点击对应的版本,让jenkins去构建完成就可以了。
集成sonarqube完成代码质量检测
配置sonar-sanner到jenkins中
将sonnar-scanner目录移动到jenkins数据卷目录中
修改conf/sonar-scanner.properties
#sonarqube服务器地址
sonar.host.url=http://192.168.59.129:9000
#源代码文件编码
sonar.sourceEncoding=UTF-8
使用sonar-sanner命令检测
/data/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectKey=hello-demo2 -Dsonar.java.binaries=./target
竟然成功了。为何没要求输入用户密码或者要sonar.projectKey?是因为本地有缓存了吗?
jenkins下载SonarQube Scanner插件
jenkins上系统配置sonar
系统配置中搜索sonar
点击增加sonar按钮
添加密钥时没相应,自己重启了几次jenkins没定用,然后就输入了个name后回车,然后重新进后就可以添加密钥了,也不知道为啥。
创建完成后点击保存。
添加sonar检测步骤
全局配置sonar
全局工具配置
配置sonar检测步骤
点击增加构建步骤
保存后构建测试。
查看日志可以看到代码检测的命令
报错:
由于之前用命令检测过代码,所以会报错,需要把之前生产的/.scannerwork目录删除。
将代码编译成镜像上传到harbor仓库中
说明
本步骤需要jenkins内部具有制作镜像的能力。
配置使得jenkins内部具有构建镜像能力 docker in docker配置
修改/var/run/docker.sock权限,使其属于root组,并且其他用户有读和写的权限
修改jenkins数据数据卷,jenkins内部要有执行docker命令的能力,需要将下面文件挂载到容器内部。
Jenkins docker-compose.yml文件
version: '3.1'
services:
jenkins:
image: jenkins/jenkins:2.319.1-lts
container_name: jenkins
ports:
- 8090:8080
- 8091:50000
volumes:
- /data/jenkins_home/:/var/jenkins_home/
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/docker/daemon.json:/etc/docker/daemon.json
由于之前使用docker run方式启动的jenkins,此时需要删除掉容器,不要删除之前创建的数据卷就可以,然后使用docker-compose方式启动,此时不会删除数据,以后推荐改成docker-compose方式,这样运维人员也知道你的启动时加了哪些参数了,易于维护。
docker stop jenkins
docker rm jenkins
docker-compose up -d
进入到容器内部,测试,发现成功。
jenkins制作自定义镜像并推送barbor
mv target/*.jar docker/
docker build -t hello-demo:$tag docker/
docker login -u admin -p Harbor12345 192.168.59.129:8888
docker tag hello-demo:$tag 192.168.59.129:8888/hello/hello-demo:$tag
docker push 192.168.59.129:8888/hello/hello-demo:$tag
构建步骤后增加执行shell 完成构建镜像并推送到harbor仓库中
harbor中查看
将镜像分发到对应的服务器并使用docker部署起来
1.告知目标服务器拉取哪个镜像
2.判断当前服务器是否正在运行该容器,需要删除
3.如果目标服务器已经存在当前镜像,需要删除
4.目标服务器拉取harbor上的镜像
5.将拉取下来的镜像运行成容器
准备脚本文件
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
port=$5
container_port=$6
imagename=$harbor_addr/$harbor_repo/$project:$version
echo $imagename
container_id=$(docker ps -a |grep $project |awk '{ print $1 }')
echo $container_id
if [ "$container_id" != "" ] ; then
docker stop $container_id
docker rm $container_id
fi
tag=$(docker images |grep $project |awk '{ print $2 }')
echo $tag
if [[ "$tag" =~ "$version" ]] ; then
docker rmi $imagename
fi
docker login -u admin -p Harbor12345 $harbor_addr
docker pull $imagename
docker run -it -d -p $port:$container_port --name $project $imagename
为了使得脚本文件在任意地方都能执行,将脚本文件放到环境变量中。
chmod u+x deploy.sh
cp deploy.sh /usr/bin
添加构建后操作操作步骤,选择
里面的端口为了灵活展示可以使用参数化构建添加变量的方式。此处略。