栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

CICD持续集成部署系列9-Jenkins部署.NetCore微服务

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CICD持续集成部署系列9-Jenkins部署.NetCore微服务

CICD持续集成部署系列1- gitlab安装和使用

CICD持续集成部署系列2-使用 harbor 搭建 Docker 私有仓库

CICD持续集成部署系列3-Jenkins基础概念

CICD持续集成部署系列4-Jenkins安装和常用插件

CICD持续集成部署系列5-Jenkins与Git打通

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

6、该系列教程尚未结束,以后继续更新。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/693584.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号