目录
CICD持续集成部署系列2-使用 harbor 搭建 Docker 私有仓库
CICD持续集成部署系列6-NetCore项目编译发布构建镜像的方法说明
CICD持续集成部署系列7- Jenkins项目构建-Pipeline流水线项目构建
CICD持续集成部署系列8-Jenkins远程发送Shell命令-拉取镜像和发布应用(看相邻篇文章)
正文
实验的机器全部为CentOS 7.9版本。
192.168.157.102 --代码托管 gitlab
192.168.157.103 持续集成 Jenkins JDK Git
192.168.157.104 harbor 镜像存储registry
192.168.157.105 应用服务器 docker
一、准备NetCore开发项目
实验是使用.Net5开发一个Demo,使用VS2019自动生成Dockerfile,然后上传到gitlab上。
二、Jenkins创建流水线任务
1、创建新Item
2、添加参数
我一共添加了3个参数,大家可以根据实际工作需要创建参数。这些参数名称可以在写流水线脚本的时候作为参数使用。
3、编写Pipeline流水线脚本
脚本内容如下:
//code的git地址
def git_url="http://192.168.157.102:82/muxue_group/web_demo.git"
//定义项目名称
def project_name="web_demo"
//web目录的名称
def web_dictionary_name="WebDemo"
//定义harbor地址
def harbor_url="192.168.157.104:85"
//Harbor的项目名称
def harbor_project_name = "saas_api"
//harbor的账号密码的一个凭证
def haror_auth="2928eee9-51cf-4f9f-b0df-afbc90a8a7ec"
node {
stage('pull code') {
//第一步:从gitlab拉取源码
echo 'pull code'
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '9538c62c-2ea6-463f-acf9-f95adc64870b', url: "${git_url}"]]])
}
stage('build project') {
// 第二步:调用VS2019自动生成的Dockerfile,编译发布和构建镜像;
//定义镜像名称
def imageName="${project_name}:${tag}"
def tagImageName="${harbor_url}/${harbor_project_name}/${imageName}"
echo "当前分支${branch}"
sh "pwd"
//移动dockerfile文件到当前目录
sh "mv ${web_dictionary_name}/Dockerfile ."
//构建镜像-包括编译代码
sh "docker build -t ${imageName} ."
// 第三步:给镜像打标签,然后上传到Harbor镜像仓库;
//镜像打标签
sh "docker tag ${imageName} ${tagImageName}"
//对应的是harbor的账号和密码
withCredentials([usernamePassword(credentialsId: "${haror_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
echo "本地镜像上传到harbor"
//登录harbor
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像到harbor
sh "docker push ${tagImageName}"
echo "本地镜像上传到harbor-ok"
//删除本地镜像
sh "docker rmi -f ${imageName}"
sh "docker rmi -f ${tagImageName}"
echo "删除本地镜像成功"
}
echo "以下为远程调用进行项目部署"
//=====第四步 以下为远程调用进行项目部署========
echo "传参:$harbor_url $harbor_project_name $project_name $tag $port"
sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server105', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo "远程调用进行项目部署完成"
}
}
分析脚本:
(1)一共有4大步骤,如下
第一步:从gitlab拉取源码;
第二步:调用VS2019自动生成的Dockerfile,编译发布和构建镜像;
第三步:给镜像打标签,然后上传到Harbor镜像仓库;
第四步:远程调用.sh脚本进行项目部署;
(2)脚本相对来说很简单,其中有3处是使用 流水线语法片段生成器生成的。用到了很多bash脚本命令。
三、远程服务器创建.sh脚本
目录/opt/jenkins_shell/下创建一个deploy.sh脚本,内容为:
#! /bin/sh
#接收外部参数
#harbor地址
harbor_url=$1
#harbor里的项目名称
harbor_project_name=$2
#代码的项目名称
project_name=$3
#打的标签的名称
tag=$4
#对外暴露的端口
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
containerName="${harbor_project_name}__${project_name}__${tag}_c"
echo "镜像名${imageName}"
echo "容器名名${containerName}"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
# 登录Harbor
docker login -u admin -p Harbor12345 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -d -p $port:80 --name ${containerName} $imageName --restart=always
echo "容器启动成功"
分析脚本:
(1)首先是接收5个外部参数;
(2)查看本机是否有旧的相同的镜像和容器,有则删除;
(3)登录Harbor,拉取镜像;
(4)运行容器。
该脚本还可以根据实际项目需要继续优化。
四、Jenkins执行流水线
等待执行,首次执行会比较慢。
回顾
1、整个步骤其实设计了很多知识点以及安装部署等。
2、需要掌握的知识点大致罗列一下:dockerfile写法、docker命令、dotnet命令、Harbor、sh脚本、Linux的基础知识、Jenkins的插件玩法、Pipeline流水线的操作、Pipeline流水线脚本编写等。
3、我在此之前写了8个章节,简单的介绍了相关软件的安装和使用方法。大家可以先看之前8篇文章,再看本章节。
4、Jenkins+Docker+.NetCore 这个搭配的方案,其实还有很多优化的地方,其中一个明显的不足就是 Jenkins调用远程.sh脚本,其控制权相对转移了,对远程.sh脚本的执行过程明显是个黑盒子,这个我们以后使用K8s来实现,应该会好一些。
5、Jenkins的学习可以看下B站上《黑马程序员》的系列教程,讲的非常的好,网址如下:
https://www.bilibili.com/video/BV1kJ411p7mV?p=1
也可以在本公众号回复关键词 “jenkins”,下载该Jenkins所有的视频教程和对应的文档。
6、该系列教程尚未结束,以后继续更新。