欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

基于jenkins的devops工程实践,jenkins 持续集成

终极管理员 知识笔记 62阅读

文章目录 DevOpsDevOps概述Jenkins实战3实战1和实战2的加强版新增SonarQube和Harbor⭐环境准备⭐项目架构图对比Jenkins实战1和实战2新增内容有哪些SonarQube教程采用Docker安装SonarQube 在Jenkins所在的服务器上安装⭐访问SonarQube可视化界面⭐首次登陆SonarQube需要修改密码安装SonarQube中文插件 ⭐SonarQube的简单使用⭐下载sonar-scanner并上传到Jenkins所在的服务器上安装sonar-scannerSonarQube案例1使用sonar-scanner进行代码质量检测⭐ Jenkins整合SonarQube进行代码质量检测⭐在Jenkins下载SonarQube Scanner插件⭐在Jenkins配置SonarQube系统配置⭐在Jenkins配置SonarQube全局配置⭐架构图第4步案例给Jenkins的mytest任务配置SonarQube自动进行代码质量检测重点⭐ Harbor v2.4.2教程下载安装Harbor⭐访问Harbor⭐创建一个新的Harbor项目将本地镜像mytest推送到Harbor仓库中⭐修改daemon.json文件添加insecure-registries配置⭐给mytest镜像改名使其可以push到Harbor镜像仓库中⭐开始推送到Harbor仓库⭐ 测试拉取Harbor镜像Jenkins整合Harbor⭐让Jenkins容器内部可以使用Docker⭐架构图第5步案例Jenkins制作自定义镜像并上传到Harbor⭐架构图第6-7步案例通知目标服务器可以从Harbor上拉取镜像并运行容器⭐

DevOps DevOps概述

软件开发最初是由两个团队共同组成没有采用DevOps之前

开发团队从头开始设计和整体系统的构建编写代码。需要系统不停的迭代更新。运维团队将开发团队的代码进行测试通过后再部署上线。确保系统稳定运行。

没有采用DevOps的缺点

这看似两个目标不同的团队需要协同完成一个软件的开发。在开发团队指定好计划并完成编写代码后需要把代码交给运维团队。运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。这时开发团队需要经常等待运维团队的反馈。这无疑会延长整个软件开发的周期。

采用DevOps的优点

DevOps的方式可以让公司能够更快地应对更新和市场发展变化开发可以快速交付部署也更加稳定。核心就在于简化Dev和Ops团队之间的流程使整体软件开发过程更快速。说白了就是DevOps有利于快速完成项目不会浪费时间

整体的软件开发流程

PLAN开发团队根据客户的目标制定开发计划CODE根据PLAN开始编码过程需要将不同版本的代码存储在一个库中。BUILD编码完成后需要将代码构建并且运行。TEST成功构建项目后需要测试代码是否存在BUG或错误。DEPLOY代码经过手动测试和自动化测试后认定代码已经准备好部署并且交给运维团队。OPERATE运维团队将代码部署到生产环境中。MONITOR项目部署上线后需要持续的监控产品。INTEGRATE然后将监控阶段收到的反馈发送回PLAN阶段整体反复的流程就是DevOps的核心即持续集成、持续部署。

为了保证整体流程可以高效的完成各个阶段都有比较常见的工具如下图

Jenkins实战3实战1和实战2的加强版新增SonarQube和Harbor⭐ 环境准备⭐ 该Jenkins实战3建立在完成Jenkins实战1和Jenkins实战2的内容的基础上 项目架构图 对比Jenkins实战1和实战2新增内容有哪些 新增内容有如下 1Jenkins整合SonarQube实现代码质量检测。2将Jenkins制作好的镜像推送到Harbor仓库。 SonarQube教程 采用Docker安装SonarQube 在Jenkins所在的服务器上安装⭐

注意由于新版的SonarQube不再支持MySQL而是支持PostgreSQL。那么安装SonarQube时需要先安装PostgreSQL。

1安装Postgres数据库
docker pull postgres
2安装SonarQube版本是8.9.9社区版
docker pull sonarqube:8.9.9-community
3新建sonarqube目录
mkdir -p /usr/local/docker/sonarqube_docker
4跳转到sonarqube目录
cd /usr/local/docker/sonarqube_docker
5编写sonarqube的docker-compose文件
vi docker-compose.yml

内容如下

version: 3.1services:  db:    image: postgres    container_name: db    ports:      - 5432:5432    networks:      - sonarnet    environment:      POSTGRES_USER: sonar      POSTGRES_PASSWORD: sonar  sonarqube:    image: sonarqube:8.9.9-community    container_name: sonarqube    depends_on:      - db    ports:      - 9000:9000    networks:      - sonarnet    environment:      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar      SONAR_JDBC_USERNAME: sonar      SONAR_JDBC_PASSWORD: sonarnetworks:  sonarnet:    driver: bridge
6修改/etc/sysctl.conf文件
vi /etc/sysctl.conf

在该配置文件中添加下面的内容直接复制下面的内容到配置文件中保存退出即可

vm.max_map_count262144
7让刚刚修改的配置生效
[rootcentos7-jenkins sonarqube_docker]# sysctl -pvm.max_map_count  262144
8执行docker-compose文件
docker-compose up -d
访问SonarQube可视化界面⭐

访问地址sonarqube的ip9000端口。

SonarQube的账号和密码都是admin

首次登陆SonarQube需要修改密码 我的SonarQube密码修改成admin123456 安装SonarQube中文插件 ⭐




SonarQube的简单使用⭐ 下载sonar-scanner并上传到Jenkins所在的服务器上

sonar-scanner官网下载地址

查看sonar-scanner-cli是否上传成功
[rootcentos7-jenkins ~]# lsapache-maven-3.8.6-bin.tar.gz  jenkins anaconda-ks.cfg  jdk-8u333-linux-x64.tar.gz     sonar-scanner-cli-4.6.2.2472-linux.zip
安装sonar-scanner 1由于sonar-scanner-cli是zip格式的压缩文件而Linux下载解压这种格式文件需要安装一个工具
yum -y install unzip
2使用unzip解压刚刚上传的sonar-scanner包 注意我们下载的sonar-scanner名字可能会不一样所以这里需要更改
unzip sonar-scanner-cli-4.6.2.2472-linux.zip
3修改sonar-scanner解压出来的文件夹名字
mv sonar-scanner-4.6.2.2472-linux sonar-scanner
SonarQube案例1使用sonar-scanner进行代码质量检测⭐ 1跳转Jenkins宿主机数据卷目录
[rootcentos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data
2把解压出来的sonar-scanner目录移动到Jenkins宿主机数据卷目录中
[rootcentos7-jenkins data]# mv /root/sonar-scanner ./
3在Jenkins宿主机数据卷目录下执行下面命令修改sonar-scanner配置
[rootcentos7-jenkins data]# vi sonar-scanner/conf/sonar-scanner.properties

我们的配置文件内容如下记得下面的ip 192.168.184.80要换成你SonarQube的IP。

#Configure here general information about the environment, such as SonarQube server connection details for example#No information about specific project should appear here#----- Default SonarQube serversonar.host.url Default source code encodingsonar.sourceEncodingUTF-8
4查看sonar-scanner工具所在位置为Jenkins宿主机数据卷的sonar-scanner文件夹中的bin目录下 跳转到sonar-scanner工具目录下
[rootcentos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/

可以看到下面的sonar-scanner就是我们需要的代码质量检测工具

[rootcentos7-jenkins bin]# lssonar-scanner  sonar-scanner-debug
5跳转到我们的Jenkins从gitlab上拉取的mytest项目目录中该gitlab上的项目也就是我们创建的名为mytest的项目 Jenkins的项目目录也就是在/usr/local/docker/jenkins_docker/data/workspace下。
[rootcentos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data/workspace/mytest
6获取SonarQube的Token 可以看到我们生成的token是fa58b2f8903333918bfa22cf0bc07f3ac0e92435



7查看当前所在目录
[rootcentos7-jenkins mytest]# pwd/usr/local/docker/jenkins_docker/data/workspace/mytest
8利用sonar-scanner工具对Jenkins拉取的gitlab项目名为“mytest”的项目进行代码质量检测⭐ /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner上面所说的sonar-scanner工具所在的路径。如果前面按照我们这样配置则不需要更改-Dsonar.source./ 需要检测的代码所在的目录由于上面我们已经切换到代码所在目录中所在只需要指定./即可如果前面按照我们这样操作则不需要更改-Dsonar.projectnamelinux-mytest随便指定一个名称作为sonar-scanner的项目名。-Dsonar.loginfa58b2f8903333918bfa22cf0bc07f3ac0e92435把刚刚复制的token粘贴上去需要根据自己生成的token进行更改⭐-Dsonar.projectKeylinux-mytest 随便指定一个名称。-Dsonar.java.binaries./target/ 指定我们gitlab上的项目生成的二进制文件也就是class类文件所在目录说白了也就是指定gitlab上的项目的target文件夹路径。
[rootcentos7-jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source./ -Dsonar.projectnamelinux-mytest -Dsonar.loginfa58b2f8903333918bfa22cf0bc07f3ac0e92435 -Dsonar.projectKeylinux-mytest -Dsonar.java.binaries./target/
Jenkins整合SonarQube进行代码质量检测⭐ 在Jenkins下载SonarQube Scanner插件⭐ 在Jenkins配置SonarQube系统配置⭐



在Jenkins配置SonarQube全局配置⭐ 配置提示 1SONAR_RUNNER_HOME的值/var/jenkins_home/sonar-scanner


架构图第4步案例给Jenkins的mytest任务配置SonarQube自动进行代码质量检测重点⭐

配置提示

Execute SonarQube Scanner下面的Analysis properties配置
sonar.projectname${JOB_NAME}sonar.projectKey${JOB_NAME}sonar.source./sonar.java.binariestarget

1由于我们刚刚案例执行过了一次所以要在Jenkins宿主机上先删除一个目录

[rootcentos7-jenkins ~]# rm -rf /usr/local/docker/jenkins_docker/data/workspace/mytest/.scannerwork/
2开始配置




3测试构建可以看到我们的SonarQube已经整合到Jenkins中了


Harbor v2.4.2教程 下载安装Harbor⭐ 1先下载好Harbor然后通过xftp传到服务器上这里我们还是放在Jenkins所在的服务器上节约成本

Harbor v2.4.2下载链接

2查看是否上传成功可以看到上传成功了
[rootcentos7-jenkins ~]# ls | grep harborharbor-offline-installer-v2.4.2.tgz
3将Harbor解压到/usr/local下
tar -zxvf harbor-offline-installer-v2.4.2.tgz -C /usr/local
cd /usr/local/harbor/
4将harbor.yaml的模板文件复制一份 Harbor启动时只会加载harbor.yml而不会加载harbor.yml.tmpl
cp harbor.yml.tmpl harbor.yml
5修改harbor.yml
vim harbor.yml


6执行Harbor的install脚本文件在这之前必须要安装了Docker和Docker Compose。 当前所在的路径
[rootcentos7-jenkins harbor]# pwd/usr/local/harbor

开始执行然后会加载一大堆的东西需要等一下

[rootcentos7-jenkins harbor]# ./install.sh
访问Harbor⭐ 访问链接 harbor的ip地址:80端口 创建一个新的Harbor项目


将本地镜像mytest推送到Harbor仓库中⭐ 如何将本地镜像推送到Harbor仓库中最重要的一点就是要将镜像进行改名格式如下只有这样格式的镜像才能够被push到Harbor仓库 格式为Harbor地址/Harbor项目名/镜像名:版本 修改daemon.json文件添加insecure-registries配置⭐ 1进入编辑器
vi /etc/docker/daemon.json

内容如下

只添加insecure-registries配置对应的值为你当前的Harbor地址
{  registry-mirrors: [              ],  insecure-registries: [192.168.184.80:80]   }
2重启Docker服务
systemctl restart docker
给mytest镜像改名使其可以push到Harbor镜像仓库中⭐ 1改名之前先查看一下mytest镜像
[rootcentos7-jenkins harbor]# docker imagesREPOSITORY                      TAG               IMAGE ID       CREATED        SIZEmytest                          v1.0.0            fc62ecfe296d   10 hours ago   661MB
2给mytest镜像进行改名注意下面的镜像的IP地址一定要改成你当前Harbor的地址 mytest:v1.0.0旧镜像名称192.168.184.80:80/repo/mytest:v1.0.0新镜像名称
docker tag mytest:v1.0.0 192.168.184.80:80/repo/mytest:v1.0.0
3再次查看mytest镜像可以看到旧镜像和新镜像的IMAGE ID都是一样的可以说明这两个其实就是同一个镜像。只是名字不同罢了
[rootcentos7-jenkins harbor]# docker imagesREPOSITORY                      TAG               IMAGE ID       CREATED        SIZEmytest                          v1.0.0            fc62ecfe296d   11 hours ago   661MB192.168.184.80:80/repo/mytest   v1.0.0            fc62ecfe296d   11 hours ago   661MB
开始推送到Harbor仓库⭐ 1首先Docker要先登录Harbor仓库docker login 格式为docker login -u 用户名 -p 密码 Harbor地址注意我们Harbor默认的账号是admin密码是Harbor12345所以我们可以用这个账号密码去登录还有下面的Harbor地址别忘了改成你自己的Harbor地址。
docker login -u admin -p Harbor12345 192.168.184.80:80
2开始push
[rootcentos7-jenkins harbor]# docker push 192.168.184.80:80/repo/mytest:v1.0.0The push refers to repository [192.168.184.80:80/repo/mytest]5f70bf18a086: Pushed 34589845b783: Pushed 35c20f26d188: Pushed c3fe59dd9556: Pushed 6ed1a81ba5b6: Pushed a3483ce177ce: Pushed ce6c8756685b: Pushed 30339f20ced0: Pushed 0eb22bfb707d: Pushed a2ae92ffcd29: Pushed v1.0.0: digest: sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d size: 2418
3查看是否成功Push到Harbor仓库 测试拉取Harbor镜像 1先删除原来的mytest镜像
[rootcentos7-jenkins harbor]# docker images REPOSITORY                      TAG               IMAGE ID       CREATED        SIZE192.168.184.80:80/repo/mytest   v1.0.0            fc62ecfe296d   25 hours ago   661MBmytest                          v1.0.0            fc62ecfe296d   25 hours ago   661MB
[rootcentos7-jenkins harbor]# docker rmi -f fc62ecfe296dUntagged: 192.168.184.80:80/repo/mytest:v1.0.0Untagged: 192.168.184.80:80/repo/mytestsha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7dUntagged: mytest:v1.0.0Deleted: sha256:fc62ecfe296d996c03ac5ef9a0c073f5772aacf382e7f8215d18052d18707982
2拉取刚刚上传到Harbor仓库的mytest镜像注意这个Harbor镜像被我们设置为公开类型如果不是公开类型则不能这样拉取 80端口别忘了写。
[rootcentos7-jenkins harbor]# docker pull 192.168.184.80:80/repo/mytest:v1.0.0v1.0.0: Pulling from repo/mytest7448db3b31eb: Already exists c36604fa7939: Already exists 29e8ef0e3340: Already exists a0c934d2565d: Already exists a360a17c9cab: Already exists cfcc996af805: Already exists 2cf014724202: Already exists 4bc402a00dfe: Already exists bce9a3522658: Already exists 4f4fb700ef54: Already exists Digest: sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7dStatus: Downloaded newer image for 192.168.184.80:80/repo/mytest:v1.0.0192.168.184.80:80/repo/mytest:v1.0.0
Jenkins整合Harbor⭐ 让Jenkins容器内部可以使用Docker⭐

默认情况下Jenkins容器内部是使用不了Docker的我们这次就是为了解决这种情况。

解决方法有两个我们使用的是第二种

第一种在Jenkins容器内部安装一个Docker。缺点是会占用很多的资源浪费容器空间不推荐使用。

第二种Jenkins容器内部使用宿主机的Docker也就是说Jenkins容器和宿主机共同使用同一个Docker。推荐

1切换目录到/var/run/
[rootcentos7-jenkins harbor]# cd /var/run/
2修改docker.sock文件的所属组
[rootcentos7-jenkins run]# chown root:root docker.sock
3修改docker.sock文件的权限
[rootcentos7-jenkins run]# chmod orw docker.sock
4切换到Jenkins的docker-compose.yml文件的所在目录上
[rootcentos7-jenkins ~]# cd /root/jenkins/
5如果启动了Jenkins的docker-compose文件则执行下面的down命令
[rootcentos7-jenkins jenkins]# docker-compose down
6删除这个docker-compose文件
[rootcentos7-jenkins jenkins]# rm -rf docker-compose.yml
7重新编辑Jenkins的docker-compose.yml文件其实就是在原来的Jenkins的docker-compose文件多添加了一些volume罢了所以干脆删除了重新编辑。
[rootcentos7-jenkins jenkins]# vi docker-compose.yml

新文件内容如下

version: 3.1services:  jenkins:    image: jenkins/jenkins:2.359    container_name: jenkins    ports:      - 9200:8080      - 50000:50000    volumes:      - /usr/local/docker/jenkins_docker/data/:/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
8启动Jenkins的docker-compose
docker-compose up -d
9进入Jenkins容器内部测试现在是否可以使用Docker现在我们的Jenkins容器就可以使用Docker了
[rootcentos7-jenkins jenkins]# docker exec -it jenkins bash
[rootcentos7-jenkins jenkins容器]# docker version
架构图第5步案例Jenkins制作自定义镜像并上传到Harbor⭐ 1修改我们的springboot项目


2配置Jenkins

提示Execute shell的内容 修改点1下面的IP地址要改成你的Harbor的IP地址。修改点2harbor账号密码要是和我的不一样则也需要更改。
mv target/*.jar docker/docker build -t mytest:$tag docker/docker login -u admin -p Harbor12345 192.168.184.80:80docker tag mytest:$tag 192.168.184.80:80/repo/mytest:$tagdocker push 192.168.184.80:80/repo/mytest:$tag





架构图第6-7步案例通知目标服务器可以从Harbor上拉取镜像并运行容器⭐ 1在所有目标服务器上都放一份shell脚本文件原理是Jenkins通知目标服务器去执行shell脚本文件从而让目标服务器在Harbor上面拉取指定镜像。 原来的架构图上是把Dockerfile传到目标服务器让目标服务器通过docker build构建镜像缺点是当目标服务器有多台那每一台目标服务器都需要build构建一次n台服务器就是n次这样十分浪费服务器资源。现在的架构图是把镜像在Jenkins容器内构建然后把镜像push到Harbor上Jenkins通知所有目标服务器不管有多少台然后目标服务器就会执行下面的shell脚本会从Harbor拉取指定镜像这样一来不管有多少台目标服务器都只是build构建一次节省了很多资源。
vi /root/deploy.sh

内容如下

harbor_addr$1harbor_repo$2project$3version$4host_port$5container_port$6imageName$harbor_addr/$harbor_repo/$project:$versioncontainerIddocker ps -a | grep ${project} | awk {print $1}if [ $containerId !  ] ; then    docker stop $containerId    docker rm $containerIdfitagdocker images | grep ${project} | awk {print $2}if [[ $tag ~ $version ]] ; then    docker rmi -f $imageNamefidocker login -u admin -p Harbor12345 $harbor_addrdocker pull $imageNamedocker run -d -p $host_port:$container_port --name $project $imageNameecho SUCCESS
2给deploy.sh权限
chmod ax /root/deploy.sh
3测试运行deploy.sh要更改对应的值 shell脚本参数传值解释 配置文件的$1为192.168.184.80:80 harbor_addr。harbor的地址配置文件的$2为repoharbor_repo。harbor的项目名配置文件的$3为mytestproject。拉取的镜像名配置文件的$4为v3.0.0version。拉取的镜像版本配置文件的$5为8082host_port。宿主机端口配置文件的$6为8082container_port。容器的端口
cd /root
[rootcentos7-jenkins ~]# ./deploy.sh 192.168.184.80:80 repo mytest v3.0.0 8082 80823fd32cbb95573fd32cbb9557Untagged: 192.168.184.80:80/repo/mytest:v3.0.0Untagged: 192.168.184.80:80/repo/mytestsha256:bd9556efbf06af2fba04b482e318111266a725cc2b10edf215e1190874df06b3WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. See Succeededv3.0.0: Pulling from repo/mytestDigest: sha256:bd9556efbf06af2fba04b482e318111266a725cc2b10edf215e1190874df06b3Status: Downloaded newer image for 192.168.184.80:80/repo/mytest:v3.0.0192.168.184.80:80/repo/mytest:v3.0.02f73780159ee473a62e0d9e43874c8abcc7e173ac23ee0adfe162c442187e0f4SUCCESS
4查看项目镜像容器是否启动
[rootcentos7-jenkins ~]# docker ps | grep mytest3fd32cbb9557   192.168.184.80:80/repo/mytest:v3.0.0   /bin/sh -c java -j…   38 seconds ago   Up 37 seconds          0.0.0.0:8082->8082/tcp, :::8082->8082/tcp                                                  mytest
5测试访问项目 6把所有目标服务器的deploy.sh都放到/usr/bin下
[rootcentos7-jenkins ~]# mv /root/deploy.sh /usr/bin/
7配置两个端口的字符串参数宿主机端口和容器端口



8配置Jenkins构建后操作

提示

Exec command的内容
deploy.sh 192.168.184.80:80 repo ${JOB_NAME} $tag $host_port $container_port
9测试构建

标签:
声明:无特别说明,转载请标明本文来源!