本地测试环境为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
[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
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
linux安装docker
mkdir -p /data
linux安装maven
docker安装gitlab
docker安装harbor
docker安装jenkins
docker安装sonarsqube
idea创建springboot项目
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中点击
手动配置:
主机上安装maven后将maven的安装目录移动到jenkins数据卷中
重命名文件夹
在页面上配置,MAVEN_HOME要使用容器内部目录,不要使用宿主机目录
页面配置jdk
我们要将构建好的jar包发送到目标服务器上并部署起来,需要使用Publish Over Ssh插件,用于jenkins可以连接到目标服务器。
配置
系统配置最下面会有个Publish over SSH
点击新增
密码需要点击高级设置,勾选Use password authentication, or use a different key,然后填写密码
Remote Directory 需要在设置的主机上提前创建好,否则会报错。
点击下面的测试按钮测试是否配置成功。
填入项目的地址
项目私有,创建私有的账号密码
指定分支
配置成功后jenkins会将代码下载到jenkins用户的家目录的workspace目录下,如下图操作:
1.点击增加构建步骤----选择调用顶层Maven目标
2.配置maven构建执行的命令3.点击立即构建查看日志会看到执行的命令查看容器目录 会发现在workspace项目目录下多了个target目录,jar包在里面。
为了将代码构建前切换到对应的版本,增加一个构建步骤
将其拖到构建步骤前,顺序是这样的。
需要在gitlab上创建标签
填写标签名
修改代码 打标签为2.0.0
然后刷新jenkins,发现构建已经变成 build with parameters
这样就可以完成基于标签去完成版本的发布了,需要回退的只需要点击对应的版本,让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?是因为本地有缓存了吗?
系统配置中搜索sonar
点击增加sonar按钮
添加密钥时没相应,自己重启了几次jenkins没定用,然后就输入了个name后回车,然后重新进后就可以添加密钥了,也不知道为啥。
创建完成后点击保存。
全局工具配置
点击增加构建步骤
保存后构建测试。
查看日志可以看到代码检测的命令
报错:
由于之前用命令检测过代码,所以会报错,需要把之前生产的/.scannerwork目录删除。
本步骤需要jenkins内部具有制作镜像的能力。
修改/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
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中查看
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
添加构建后操作操作步骤,选择