DevOps搭建(十四)-基于Jenkins流水线方式部署详细步骤

news/2024/7/7 6:34:43 标签: devops, jenkins, elasticsearch

图片

1、新建一个流水线项目

图片

进入配置最下方的流水线,可以选择Hello World最简单的demo体验。

图片

2、编写流水线脚本

2.1、编写整体的流水线脚本

整体他脚本格式如下,我们只要在对应的

//所有的脚本命令都放在pipeline中
pipeline {
    //指定任务在哪个集群节点中执行
    agent any
	
    //声明全局变量,方便后面使用
    environment {
        key = 'value'
    }

    stages {
        stage('拉取git仓库代码') {
            steps {
                echo '拉取git仓库代码 ok'
            }
        }
        stage('通过maven构建项目') {
            steps {
                echo '通过maven构建项目 ok'
            }
        }
        stage('通过SonarQube做代码质量检测') {
            steps {
                echo '通过SonarQube做代码质量检测 ok'
            }
        }
        stage('通过Docker制作自定义镜像') {
            steps {
                echo '通过Docker制作自定义镜像 ok'
            }
        }
        stage('将自定义对象推送到Harbor仓库') {
            steps {
                echo '将自定义对象推送到Harbor仓库 ok'
            }
        }
        stage('通过Publish Over SSH通知目标服务器') {
            steps {
                echo '通过Publish Over SSH通知目标服务器 ok'
            }
        }
    }
}

2.2、生成流水线语法

点击“流水线语法”链接进去

图片

里边有很多实例步骤,可以根据具体的需求选项生成,比如我们要生成一段git拉取代码的脚本,选择如下图:

图片

线下相关的git信息后,直接点击生成流水线脚本即可。

图片

2.3、将流水线脚本放到git上管理

为了方便维护流水线脚本,我们还可以将脚本放到git上,需要在项目根目录增加Jenkinsfile文件,将对应的脚本放到这个文件即可。

图片

2.4、制作完整流水线脚本

2.4.1、拉取git仓库代码

通过流水线语法->示例步骤->checkout: Check out from version control>生成流水线脚本

生成的脚本如下,其中$tag为上文定义的标签名称:

checkout scmGit(branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.88.125:8929/root/devops-test.git']])

将其粘贴到Jenkinsfile文件中

图片

2.4.2、通过maven构建项目

通过流水线语法->示例步骤->sh: Shell Script>生成流水线脚本

其中Sell Script输入以下打包原始脚本:

/var/jenkins_home/maven/bin/mvn clean package -DskipTests

生成的脚本如下

图片

生成的流水线脚本如下:

sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'

将其粘贴到Jenkinsfile文件中对应的步骤

图片

2.4.3、通过Docker制作自定义镜像

同理,原始脚本:

mv ./target/*.jar ./docker/
docker build -t ${JOB_NAME}:${tag} ./docker/

生成的流水线脚本如下:

sh '''mv ./target/*.jar ./docker/
docker build -t ${JOB_NAME}:${tag} ./docker/'''

图片

2.4.4、推送自定义对象到Harbor仓库

同理,原始脚本:

docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker image prune -f

其中,${harborUser} 、${harborPassword}、${harborAddress}、${harborRepo}为Jenkinsfile头部声明的全局变量,即Harbor的信息。

生成的流水线脚本如下:

sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker image prune -f'''

图片

2.4.5、通知目标服务器 

这里使用Publish Over SSH通知目标服务器。

通过Jenkins 流水线语法->示例步骤->sshPublisher: Send build artifacts over SSH>生成流水线脚本

图片

直接在Exec command项写如下原始脚本

/usr/bin/deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $hostPort $containerPort

注意:

1、上面脚本$hostPort、$containerPort这两个需要在Jenkins参数里定义,如分别设置8081、8080。

2、因为是在执行脚本的时候引用,这里变量就不要加花括号了直接$变量名。

附:之前写的deploy.sh脚本如下

#测试脚本:./deploy.sh 192.168.88.125:80 repo devops-test v1.1.0 8081 8080
harborAddr=$1
harborRepo=$2
project=$3
version=$4
#宿主机端口
hostPort=$5
#容器端口
containerPort=$6

imageName=$harborAddr/$harborRepo/$project:$version
echo -e "当前镜像信息:$imageName \n"

#停止并删除原有容器
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
  echo "停止并删除原有的容器:$containerId ……"
  docker stop $containerId
  docker rm $containerId
  echo -e "删除容器完毕。\n"
fi

#删除原有镜像
tag=`docker images | grep ${project} | awk '{print $2}'`
if [[ "$tag" =~ "$version" ]] ; then
  echo "删除原有镜像:$version ……"
  docker rmi $imageName
  echo -e "删除镜像完毕。\n"
fi

#登录Harbor
docker login -u admin -p Harbor12345 $harborAddr

#拉取镜像
echo "开始拉取镜像:$imageName ……"
docker pull $imageName
echo -e "拉取镜像完毕。\n"

#部署镜像
echo "开始部署镜像 ……"
docker run -d -p $hostPort:$containerPort --name $project $imageName
echo "部署镜像成功。"

生成的流水线脚本如下:

sshPublisher(publishers: [sshPublisherDesc(configName: 'local', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '/usr/bin/deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $hostPort $containerPort', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

在将其粘贴到Jenkinsfile文件中对应的步骤

注意:

这里有个小坑,上边的变量既有全局定义的变量,也有Jenkins声明的变量,如果用单引号,不会解析里边的变量,所以要用双引用引起来才会解析生效。

图片

前面所有的完整脚本如下

//所有的脚本命令都放在pipeline中
pipeline {
    //指定任务在哪个集群节点中执行
    agent any

    //声明全局变量,方便后面使用
    environment {
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.88.125:80'
        harborRepo = 'repo'
    }

    stages {
        stage('拉取代码') {
            steps {
                echo '开始拉取git仓库代码……'
                checkout scmGit(branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.88.125:8929/root/devops-test.git']])
                echo '开始拉取git仓库代码完毕。'
            }
        }
        stage('构建项目') {
            steps {
                echo '开始通过maven构建项目……'
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
                echo '通过maven构建项目完毕'
            }
        }
        stage('代码检查') {
            steps {
                echo 'TODO 通过SonarQube做代码质量检测'
            }
        }
        stage('制作镜像') {
            steps {
                echo '通过Docker制作自定义镜像……'
                sh '''mv ./target/*.jar ./docker/
                docker build -t ${JOB_NAME}:${tag} ./docker/'''
                echo '通过Docker制作自定义镜像完毕'
            }
        }
        stage('推送镜像') {
            steps {
                echo '将自定义对象推送到Harbor仓库……'
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
                docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
                docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
                docker image prune -f'''
                echo '将自定义对象推送到Harbor仓库完成'
            }
        }
        stage('通知目标') {
            steps {
                echo '通过Publish Over SSH通知目标服务器……'
                sshPublisher(publishers: [sshPublisherDesc(configName: 'local', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $hostPort $containerPort", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '通过Publish Over SSH通知目标服务器完毕'
            }
        }
    }
}

3、执行Jenkins立即构建

图片

在构建过程中,我们可以清晰的看到流水线每个阶段执行花费的时间和状态

图片

构建完成后,浏览器访问地址,如下,流水线部署成功

图片

图片


http://www.niftyadmin.cn/n/5304927.html

相关文章

VUE3-响应式

VUE3-响应式 响应式简介为什么使用Proxy图解实现流程DEMO实现讲解DEMO-reactiveDEMO-baseHandlerDEMO-EffectDEMO-Ref响应式简介 Vue 3引入了新的响应式系统。这个新的响应式系统使用了 ES6 的 Proxy 和 Reflect 的新特性,相对于 Vue 2.x 使用的 Observer 和 Watcher,提供了更…

亚信安慧AntDB数据库:数字化时代的数据库创新引领者

AntDB数据库以其卓越的创新能力,集中体现在融合统一与实时处理两大关键领域。作为一款服务全国超过10亿用户的分布式数据库,其独特之处在于长期积累的经验、多样性的支持能力、快速响应的数据处理速度以及卓越的系统稳定性。AntDB不仅仅是一个数据库系统…

基于ssm学生档案管理系统论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 JSP技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

01、Kafka ------ 下载、安装 ZooKeeper 和 Kafka

目录 Kafka是什么?安装 ZooKeeper下载安装启动 zookeeper 服务器端启动 zookeeper 的命令行客户端工具 安装 Kafka下载安装启动 Kafka 服务器 Kafka是什么? RabbitMQ的性能比ActiveMQ的性能有显著提升。 Kafka的性能比RabbitMQ的性能又有显著提升。 K…

Spring中的工厂类、bean的作用范围和生命周期

1.Spring中的工厂类 1.1ApplicationContext ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件 FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件 1.1.1service ApplicationContext:只要一读取配置文件…

istio 灰度发布部署(包括 deploy、svc、gw、vs 和 dr)

创建 deployment 分别部署两个版本的 deployment。在灰度发布的过程中,注意 pod 标签的设置,后续 svc 和 dr 就是根据标签来划分 pod apiVersion: apps/v1 kind: Deployment metadata:labels:app: bbjcxtversion: v1name: bbjcxtnamespace: mm-nbxt-hu…

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…

AIGC初探:提示工程 Prompt Engineering

简介 提升工程是什么 提示工程(Prompt Engineering)是人工智能领域中的一个概念,特别是在自然语言处理(NLP)领域中。它是一种通过设计和优化输入提示来提高AI模型表现的方法。 对于基于转换器的大型语言模型&#x…