基于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中文插件 ⭐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 [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系统配置⭐ 配置提示
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开始配置 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
[rootcentos7-jenkins harbor]# pwd/usr/local/harbor
开始执行然后会加载一大堆的东西需要等一下
[rootcentos7-jenkins harbor]# ./install.sh
访问Harbor⭐ 访问链接 harbor的ip地址:80端口 创建一个新的Harbor项目 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
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测试构建