以Jenkins为主的Docker容器化CICD

目录

 

一.项目环境

二.服务器的安装与配置

三.Jenkins集成SonarQube和Target

1.Jenkins集成SonarQube

1.1首先在Jenkins服务器中安装SonarScanner(SonarScanner是一种静态代码分析工具,用于发现软件项目中的代码质量问题。它是SonarQube生态系统的一部分,能够检测和报告源代码中的潜在问题,如代码复杂性、重复代码、安全漏洞、代码覆盖率等。)

​1.2在Jenkins页面安装连接SonarScanner的插件

1.3在Jenkins页面的系统配置中添加SonarQube,用于连接到SonarQube服务器

 2.Jenkins集成Target

四.实现自由风格的CI操作(包括Jenkins集成其他服务)

1.创建web工程提交到GitLab

1.1在GitLab创建远程仓库 

1.2在IDEA创建一个Git本地仓库并推送工程到远程仓库

1.3在GitLab查看提交情况

 2.Jenkins集成GitLab并从GitLab拉取工程代码

2.1Jenkins新建自由风格的项目

​2.2在Jenkins页面集成GitLab(私有仓库需要用户名和密码)

2.3构建项目成功后,可以看见Jenkins服务器的数据卷目录下存在该项目 

 3.将从GitLab拉取的代码构建为jar包(Jenkins调用本地的maven)

3.1在Jenkins页面的项目添加构建步骤---调用顶层Maven目标

3.2再次构建项目(这里没展示了),可以看见Jenkins服务器中/var/jenkins_home/workspace/my_hellojks中新增了target目录(target目录是 Maven 构建时默认生成的目录,存放构建过程中生成的各种输出文件),target目录下有了构建好的jar包

 4.进行代码质量检测

4.1在Jenkins页面的项目添加构建步骤---Execute SonarQube Scanner

4.2再次构建项目(没展示),可以看见SonarQube的页面新增了一个项目(第二个项目,第一个项目为后续流水线创建的)

 5.在Jenkins服务器把项目构建为镜像并推送到Harbor

5.1Jenkins容器化

5.2在Jenkins服务器修改/etc/docker/daemon.json(用于连接Harbor服务器),还需重启docker服务

5.3在Jenkins页面的项目添加构建步骤---执行shell($htag为后续步骤使用)

5.4再次构建项目(没展示),可以看见Jenkins服务器中有了镜像,Harbor也有了上传过来的镜像

6.Jenkins通知目标服务器在Harbor拉取镜像

6.1在Target服务器修改/etc/docker/daemon.json---跟Jenkins服务器是一样的

6.2在Target服务器PATH路径下,具体为/usr/local/bin目录下创建脚本文件deploy.sh,赋予可执行权限:chmod +x deploy.sh(这样文件就可以在任意目录下运行)

6.3在Jenkins页面添加端口号参数和构建步骤---Send build artifacts over SSH(Jenkins使目标服务器运行脚本,传递位置参数,其中$htag为后续步骤使用)

6.4再次构建项目(没展示),可以看见Target服务器已成功拉取镜像和启动容器(带版本号的为后续操作结果)

6.5访问目标服务器启动的容器的web页面

五.实现自由风格的CD操作

1.在IDEA修改代码并推送到GitLab,GitLab给修改后的代码添加标签

2.再次修改代码并推送到GitLab,GitLab再次添加标签

3.在Jenkins页面添加Git参数与构建步骤---执行shell(此步骤要执行在最前面)

4.再次构建项目时,可以看到新增了htag参数(export_port参数是之前的步骤添加的),并且可以选择构建哪个版本

5.构建结果:

   Harbor镜像有了2.0跟3.0两个版本 

   Target服务器也有了不同版本的镜像跟用2.0版本镜像启动的容器 

6.对CD操作的个人心得

六.流水线任务CICD

1.流水线的优势

2.新建流水线任务

3.工程代码中新增Jenkinsfile文件并推送到GitLab

4.在Jenkins页面中的流水线项目进行配置

5.重新构建后会发现,新增了一个新的阶段 Checkout SCM,即从 SCM 中检出脚本。

6.流水线管理项目,通过流水线语法将项目步骤生成流水线脚本并写入Jenkinsfile文件,代码内容如下

7.再次构建项目,结果如下:

七.项目总结


一.项目环境

五台CentOS7虚拟机(Jenkins、GitLab、SonarQube、Harbor、Target),都需要安装docker和docker compose。

服务器的IP地址分别为:

GitLab:192.168.249.191

SonarQube:192.168.249.192

Harbor:192.168.249.193

Jenkins:192.168.249.194

Target:192.168.249.195

注意:GitLab服务器的内存至少为4G

系统架构图:

二.服务器的安装与配置

分别在五台CentOS虚拟机上,拉取镜像并启动容器,在容器里运行GitLab、SonarQube、Harbor、Target和Jenkins服务,并配置好相关文件。

GitLab、SonarQube、Harbor和Jenkins四台服务器的安装配置如下:

GitLab:Docker:GItLab的安装配置_不吃辣9的博客-CSDN博客

SonarQube:Docker:SonarQube的安装配置_不吃辣9的博客-CSDN博客

Harbor:Docker:Harbor的安装配置_不吃辣9的博客-CSDN博客

Jenkins:Docker:Jenkins的安装配置_不吃辣9的博客-CSDN博客

Target目标服务器:

Jenkins 通过ssh 将命令发送到目标服务器,让目标服务器从 Harbor 拉取镜像、 运行容器,
因此需要在目标服务器中创建一个接收 Jenkins 发送数据的目录,创建在 /jenkins 下。

三.Jenkins集成SonarQube和Target

1.Jenkins集成SonarQube

1.1首先在Jenkins服务器中安装SonarScanner(SonarScanner是一种静态代码分析工具,用于发现软件项目中的代码质量问题。它是SonarQube生态系统的一部分,能够检测和报告源代码中的潜在问题,如代码复杂性、重复代码、安全漏洞、代码覆盖率等。)

从SonarQube官网上下载Linux版本SonarScanner,命令:

wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
使用unzip命令解压:
unzip sonar-scanner-cli-5.0.1.3006-linux.zip
移动到/var/jenkins_home/下并改名为son ar-scanner(是因为后续集成SonarScanner时需要其存在于Jenkins服务器的数据卷目录下 ):
mv sonar-scanner-5.0.1.3006-linux /var/jenkins_home/sonar-scanner
 
效果如下:

修改/var/jenkins_home/sonar-scanner/conf/sonar-scanner.properties配置文件如下:

1.2在Jenkins页面安装连接SonarScanner的插件

这里是已安装的插件,安装插件在Available plugins 

在全局工具配置中进行配置:

1.3在Jenkins页面的系统配置中添加SonarQube,用于连接到SonarQube服务器

 2.Jenkins集成Target

在系统配置中新增SSH Servers并添加

四.实现自由风格的CI操作(包括Jenkins集成其他服务)

1.创建web工程提交到GitLab

1.1在GitLab创建远程仓库 

1.2在IDEA创建一个Git本地仓库并推送工程到远程仓库

这里我使用的是IDEA,需要在IDEA创建一个Git本地仓库(由于我主要学习的是python,所以IDEA我不是特别会用,每个人学习的语言也可能会有差异,因此这里不讲Git的配置)

注意:第一次提交代码时,需要填写远程仓库的URL,clone下的http地址 

1.3在GitLab查看提交情况

 2.Jenkins集成GitLab并从GitLab拉取工程代码

2.1Jenkins新建自由风格的项目

2.2在Jenkins页面集成GitLab(私有仓库需要用户名和密码)

 2.3构建项目成功后,可以看见Jenkins服务器的数据卷目录下存在该项目 

 3.将从GitLab拉取的代码构建为jar包(Jenkins调用本地的maven)

3.1在Jenkins页面的项目添加构建步骤---调用顶层Maven目标

clean package -DskipTests" 是  Maven 命令,构建 项目并跳过运行测试。

 3.2再次构建项目(这里没展示了),可以看见Jenkins服务器中/var/jenkins_home/workspace/my_hellojks中新增了target目录(target目录是 Maven 构建时默认生成的目录,存放构建过程中生成的各种输出文件),target目录下有了构建好的jar包

 4.进行代码质量检测

 4.1在Jenkins页面的项目添加构建步骤---Execute SonarQube Scanner

配置了sonarqube服务器的用户名、密码和需要检测的项目名 

4.2再次构建项目(没展示),可以看见SonarQube的页面新增了一个项目(第二个项目,第一个项目为后续流水线创建的)

 5.在Jenkins服务器把项目构建为镜像并推送到Harbor

5.1Jenkins容器化

Jenkins服务本身是在docker容器里创建的,如果想在 Jenkins 中构建镜像,则需要 Jenkins 中有 Docker 引擎, 可以在 Jennkins中 再安装D ocker或者是 与宿主机共享Docker 引擎。这里采用的方法是与宿主机共享Docker引擎,因为另外一种方法不方便,不好维护。
修改 /var/run/docker.sock 权限
/var/run/docker.sock 文件是 docker client docker daemon 在本地进行通信的 socket 文件。默认的组为 docker,其他 用户没有读写权限,所以需要修改文件权限。
命令:
chown root:root docker.sock
chmod o+rw docker.sock
修改完权限之后, 删掉原来的Jenkins容器并重启Jenkins容器---新增 /var/run/docker.sock、 /usr/bin/docker(Docker命令文件)和 /etc/docker/daemon.json(实现镜像推送给harbor时使用的是http而不是https) 为数据卷。
docker run --name jenkins \
> --restart always \
> -p 8080:8080 \
> -p 50000:50000 \
> -v /var/jenkins_home:/var/jenkins_home \
> -v /var/run/docker.sock:/var/run/docker.sock \
> -v /usr/bin/docker:/usr/bin/docker \
> -v /etc/docker/daemon.json:/etc/docker/daemon.json \ 
> -d jenkins/jenkins:lts
进入容器查看容器化是否成功---能使用docker命令,则成功

5.2在Jenkins服务器修改/etc/docker/daemon.json(用于连接Harbor服务器),还需重启docker服务

5.3在Jenkins页面的项目添加构建步骤---执行shell($htag为后续步骤使用)

shell命令的内容主要为,让Jenkins服务器制作镜像后连接到Harbor并上传镜像

 5.4再次构建项目(没展示),可以看见Jenkins服务器中有了镜像,Harbor也有了上传过来的镜像

6.Jenkins通知目标服务器在Harbor拉取镜像

6.1在Target服务器修改/etc/docker/daemon.json---跟Jenkins服务器是一样的

 6.2在Target服务器PATH路径下,具体为/usr/local/bin目录下创建脚本文件deploy.sh,赋予可执行权限:chmod +x deploy.sh(这样文件就可以在任意目录下运行)

文件内容如下:

 6.3在Jenkins页面添加端口号参数和构建步骤---Send build artifacts over SSH(Jenkins使目标服务器运行脚本,传递位置参数,其中$htag为后续步骤使用)

6.4再次构建项目(没展示),可以看见Target服务器已成功拉取镜像和启动容器(带版本号的为后续操作结果)

 6.5访问目标服务器启动的容器的web页面

 

五.实现自由风格的CD操作

1.在IDEA修改代码并推送到GitLab,GitLab给修改后的代码添加标签

2.再次修改代码并推送到GitLab,GitLab再次添加标签

 3.在Jenkins页面添加Git参数与构建步骤---执行shell(此步骤要执行在最前面)

 

 4.再次构建项目时,可以看到新增了htag参数(export_port参数是之前的步骤添加的),并且可以选择构建哪个版本

 5.构建结果:

Harbor镜像有了2.0跟3.0两个版本 

Target服务器也有了不同版本的镜像跟用2.0版本镜像启动的容器 

6.对CD操作个人心得

CD操作很直观的让我感受到了对项目版本的控制,通过Jenkins可以非常方便的进行项目的交付与部署。

六.流水线任务CICD

1.流水线的优势

Jenkins流水线任务具有可编排性、可视化、可追踪性、可重复性、自动化、并行执行、弹性和灵活性等优点,能够帮助开发团队实现高效的持续集成和交付流程,并提升软件开发和交付的质量和效率,生产环境下一般用流水线任务而不是自由风格。但是对于自由风格的学习让我对整个CICD的流程有了十分清晰的了解。

2.新建流水线任务

3.工程代码中新增Jenkinsfile文件并推送到GitLab

项目采用 piple 方式进行构建管理,必须有一个构建脚本;采用 SCM 方式时,默认该脚本文件名为 Jenkinsfile。 在工程中新增 Jenkinsfile 文件。
新增Jenkinsfile文件之后,写入简单的代码并推送到GitLab,得到项目的GitLab远程仓库地址

4.在Jenkins页面中的流水线项目进行配置

选择SCM方式,SCM选择Git,仓库地址从GitLab复制过来,跟之前一样,脚本路径为Jenkinsfile

5.重新构建后会发现,新增了一个新的阶段 Checkout SCM,即从 SCM 中检出脚本。

 6.流水线管理项目,通过流水线语法将项目步骤生成流水线脚本并写入Jenkinsfile文件,代码内容如下

pipeline {
    agent any

    environment {
        harbor_user='admin'
        harbor_password='scy030325'
        harbor_host='192.168.249.193'
        harbor_repo='jks'
    }
    stages {
        stage('从gitlab拉取代码') {
            steps {
                checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '3cf5ee72-196f-4e9b-a16f-f3addffff636', url: 'http://192.168.249.191:9999/root/hello_myjenkins.git']])
            }
        }
        stage('将项目构建为jar包包') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }
        stage('代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.login=admin -Dsonar.password=scy030325 -Dsonar.projectKey=${JOB_NAME}'
            }
        }
        stage('构建并推送镜像到harbor') {
            steps {
                sh '''mv ./target/*.jar  ./docker/
                docker build -t ${JOB_NAME}:${ptag} ./docker
                docker login -u ${harbor_user} -p ${harbor_password} ${harbor_host}
                docker tag ${JOB_NAME}:${ptag} ${harbor_host}/${harbor_repo}/${JOB_NAME}:${ptag}
                docker image prune -f
                docker push ${harbor_host}/${harbor_repo}/${JOB_NAME}:${ptag}'''
            }
        }
        stage('通知目标服务器执行脚本') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'my_target-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harbor_host $harbor_repo $JOB_NAME $ptag 8080 $export_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

 7.再次构建项目,结果如下:

注意:流水线也可以添加Git参数和端口号参数

可以看到的是,流水线任务可视化,条理清晰地将项目步骤展示出来,如果项目构建失败,可以很直观的看到是哪一步出错了,也可以方便地看见项目每一个步骤的日志。

目标服务器中跟Harbor服务器中,都有了流水线任务制作的镜像,目标服务器的容器也成功启动

 访问目标服务器的页面也成功

结果其实跟自由风格的项目一样,但是流水线任务的优势非常明显,也因此,流水线任务在生产环境下的应用更多。

七.项目总结

我对docker容器在生产环境下的应用有了新的认识,加强了我对CI/CD流程和相关服务的了解,对后续学习新的云原生技术有了更浓厚的兴趣。

增强了我的排错能力与网络故障的分析能力,学会了如何从多方面考虑问题所在之处

让我对不同生产环境下,项目功能的不同需求有了更多地了解

注意:最后的钉钉提醒功能并未实现,是因为最近钉钉限制了添加自定义机器人的功能。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值