大觅网之自动化部署(Automated Deployment of Da Mi Network)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

本人主要分享计算机核心技术:系统维护、数据库、网络安全、自动化运维、容器技术、云计算、人工智能、运维开发、算法结构、物联网、JAVA 、Python、PHP、C、C++等。
不同类型针对性训练,提升逻辑思维,剑指大厂,非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。

大觅网之自动化部署
技能目标:
- 了解 Pipeline 的概念
- 会使用分段生成器生成流水线脚本
- 掌握通过 Pipeline 构建项目的方法

3.1 案例分析

3.1.1 案例概述

某公司最近开发了一套大型票务类电商网站,被命名为大觅网。大觅网为用户提供了通
Web 界面购票的服务,主要功能包括:商品搜索、用户注册登录、商品详情、选座、下
单等功能。大觅网的整个部署过程会用到云计算的相关知识,包括 OpenStack 的多节点部
署、OpenStack 网络路由创建和云主机创建;也会用到 Docker 容器的相关知识,包括
Dockerfile 制作镜像、Docker Compose 多容器关联制作等;还会用到 Jenkins 自动构建发
布大觅网项目。整个项目采用多知识相结合,共同协调配合来完成部署。本章详细介绍大觅
网的基础环境部署。

3.1.2 案例前置知识点

1. Pipeline 简介

Pipeline 又被称作流水线,是 Jenkins 的一套插件。流水线提供了一组可扩展的工具,
用于将简单到复杂的交付流程建模为流水线“代码”。流水线作为一个新功能,是从 Jenkins
2.x 版本开始支持的,基于其重要性现在已经作为推荐插件的一部分。
流水线项目的创建,通常通过以下三种方式:
经典 UI
Blue Ocean
在源码管理系统中定义
“经典 UI”是在 Jenkins 中直接输入基本的流水线;“Blue Ocean”在构建流水线项目
时,会自动编写 Jenkins 文件并提交到源代码仓库中;“在源码管理系统中定义”需要手动
编写 Jenkins 文件,之后在提交到代码仓库中,三者的提交方式不同。
流水线脚本其实也是一种编程语言,它提供了丰富的帮助文档。在 Jenkins 构建页面内
就有内置文档,可方便查看。通过文档的学习和指引可以让项目构建变得更加容易。这些文
档会根据安装的插件不同自动进行调整,同时在需要的地方都有链接地址。为了初学者更快
速的掌握 Pipeline 脚本编写,它还提供了“片段生成器”的功能。该功能有助于各个步骤
创建代码段,实现简单、快速生成 Pipeline 脚本内容,同时可尝试不同的参数进行不同的
调整。
2. Tengine 简介
Tengine 是由淘宝网发起的 Web 服务器项目。针对网站访问量大的需求,它基于开源
软件 Nginx 进行了优化,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在淘宝
网、天猫商城等大型网站得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、
易用的 Web 平台。从 2011 12 月开始,Tengine 成为一个开源项目。Tengine 团队在积
极地开发和维护这个项目,其团队的核心成员来自于淘宝、搜狗等互联网企业,它是社区合
作的成果。

3.1.3 案例环境

1. 本案例实验环境

本案例基于《云原生平台实战》第三、四章中 OpenStack 多节点部署和云主机创建。
OpenStack 上创建两台虚拟云主机作为实验环境,具体云主机环境配置如表 2-1 所示。
3-1 大觅网搭建环境
主机操作系统主机名/IP 地址主要软件
虚拟云主机CentOS 7.3-x86_64damiwang/192.168.9.18OpenStackDocker
虚拟云主机CentOS 7.3-x86_64gitlab/192.168.9.13Gitlab

2. 案例环境用到的用户名和密码

3-2 案例用到的用户名和密码
类型用户名密码
Gitlabrootbdqn123456
MySQLroot123456
Jenkinsadmin123456
Nexusadminadmin123

3. 案例需求

1)所有单项目编译构建的业务实现删除及清理。
2)通过 Pipeline 脚本实现所有业务的部署。

4. 案例实现思路

1)基于业务部署环境,删除所有业务容器、镜像及 Jenkins 缓存。
2)通过 Pipeline 构建 common 基础项目并上传私服仓库。
3)通过 Pipeline 构建相关业务项目并发布。
4)通过浏览器访问测试大觅网。

3.2 案例实施

3.2.1 删除现有业务部署

1.删除现有业务发布容器

大觅网自动发布可直接使用大觅网业务部署搭建完成的环境,将其进行简单改造就可以
开始自动化案例的部署。大觅网的所有业务都是采用容器方式启动的,为了通过 Pipeline
方式重新构建业务容器,所有旧业务容器都需要删除。
[root@damiwang ~]# cd /home/px2/tools/dm
[root@damiwang dm]# docker-compose down
Removing dm_file-consumer_1
... done
Removing dm_base-consumer_1
... done
Removing dm_user-provider_1
... done
Removing dm_user-consumer_1
... done
Removing dm_scheduler-provider_1 ... done
Removing dm_scheduler-consumer_1 ... done
Removing dm_pay-provider_1
... done
Removing dm_pay-consumer_1
... done
Removing dm_order-provider_1
... done
Removing dm_order-consumer_1
... done
Removing dm_item-search_1
... done
Removing dm_item-provider_1
... done
Removing dm_item-consumer_1
... done
Removing dm_base-provider_1
... done
Removing dm_zipkin-server_1
... done
Removing dm_zuul-gateway_1
... done
Removing dm_config-server_1
... done
Removing dm_discovery-eureka_1
... done
Network envdm is external, skipping

2.删除现有业务镜像

大觅网的业务项目在通过 Docker 方式启动之前,都是需要先生成对应的镜像。在开始
自动化部署之前,原有业务镜像也需要删除。
[root@damiwang dm]# docker image rm $(docker image ls | grep ^dm_ | awk '{print $3}')
Untagged: dm_file-consumer:latest
Deleted: sha256:892f23e3fc8f2c95cbc4ff1cda0c0b5ca63067dbdc29d3c79ec691e647346949
Deleted: sha256:de91421b8f2108d02e13fa2add10fddf2aca77bea5e157fb1f763b025dc4a5a5
Deleted: sha256:08c310293b29e4f737316271c101ad1d456a1380d210380200e58e3030c57de9
Deleted: sha256:6aea649938ec67a4572aed1dd5de6e0bd8013c3e4cf29739bed2a6def07616b3
Deleted: sha256:8198ac39fc23034e9b4da66fb136cb2c5552faf0bc9d469f420362c27af9dd9a
Deleted: sha256:8ccfbf538a84eaa4de7652d14a7e022dfcc55b0ca88dfd3c5903b9db77886a39
Untagged: dm_user-provider:latest
...省略部分内容...
Untagged: dm_discovery-eureka:latest
Deleted: sha256:99c656f6ba1e7c2a88364948c2b5793664a5faefa54c412d984ab11bda2dce94
Deleted: sha256:540632374f2b2d71d63b33fcb9e13733b0d9e1961f83be740869aa60cb43a948
Deleted: sha256:4ef2f1eda0af8c913bc3c8dbe53e3337facda683f26737dab8cbd352153711ef
Deleted: sha256:e897cf16cabfd96b469b4a1f1587d5e4eee64c6d8fbcf66e2b01a26c31c284e3
Deleted: sha256:30837158808466c38521e14094621052422b502c6bf50aeab7d1f51d8af8bcd6

Deleted: sha256:f0bec7156c9fabe618596ae55a73c1044eb3ea68aea4ab0a0fd13721da124e76

3.清空 Jenkins 发布缓存

通过 Jenkins 构建的业务项目缓存也需要删除。
[root@damiwang envdm]# pwd
/home/px2/envdm[root@damiwang envdm]# docker-compose exec jenkins bash
[root@538694f400f5 webapps]# rm -rf /root/.jenkins/workspace/*
[root@538694f400f5 webapps]# rm -rf /root/.jenkins/cache

3.2.2 通过 Pipeline 自动化部署业务

1. 安装 Pipeline 插件

Jenkins 流水线项目的构建需要“pipeline”插件的支持。该插件的安装方法为:“系
统管理”“插件管理”“可选插件”选项卡,右上角搜索“pipeline”,找到 Ppeline
插件,如图 3.1 所示。然后,单击“直接安装”按钮进行安装。
3.1 pipeline 插件安装

2. 构建 pipeline-common 流水线

(1)创建流水线视图

进入 Jenkins 首页,单击最上方“所有”选项卡后面的“+”创建 pipeline 视图,如图
3.2 所示。
3.2 创建视图
将新视图命名为 dmw-pipeline,之后单击“确定”按钮,如图 3.3 所示。
3.3 创建 dmw-pipeline 视图
最后,直接单击左下角的“保存”按钮,不需要填写额外信息,保持默认。

(2)新建 pipeline-common 流水线项目

Jenkins 首页单击“新建任务”,项目名称填写“pipeline-common”,项目类型选择
“流水线”,此处的流水线选项是需要 Pipeline 插件的支持的,如果没有安装 Pipeline 插件
则看不到“流水线”选项。之后单击“OK”创建项目,如图 3.4 所示。
3.4 pipeline-common 流水线项目创建
进入到“pipeline-common”流水线项目的配置页面,直接下拉到“流水线”模块。在
“定义”的下拉框内选择“Scripted Pipeline”,“Script”代码框内右侧的下拉框内同样选
择“Scripted Pipeline”,此时会列出 Pipeline 脚本基础语法架构。当前显示的只是一个示
例,实际的 Pipeline 脚本编写完成后也是类似的结构,如图 3.5 所示。
3.5 Pipeline 脚本示例
之前大觅网业务部署,在进行 dm-base-consumer 项目构建时,整个构建过程可以分
为拉取代码、编译、编译后执行命令三个部分。为了降低 Pipeline 脚本的编写难度,官方
提供了“分段生成器”功能,它可以帮助生成 Pipeline 脚本,简化书写步骤。本案例就通
过“分段生成器”来辅助编写 Pipeline 脚本。单击 Pipeline 模块下的“流水线语法”(如
3.5 左下角的链接),之后进入到“分段生成器”界面,如图 3.6 所示。
3.6 分段生成器界面
单击“示例步骤”下拉框,选择“git: Git”,就会出现之前单个项目配置时的代码拉取
界面,如图 3.7 所示。
3.7 分段生成器的 Git 配置界面
“仓库 URL”填写“common”项目的代码拉取地址,“凭据”选择对应的凭据,然
后单击“生成流水线脚本”按钮生成 Pipeline 脚本对应的语句。这条语句就可以应用到
Pipeline 脚本内。分段生成器辅助生成的语句可以简化 Pipeline 脚本的编写,避免手动一条
条的去编写,减少了错误的出现,提高了工作效率。
复制该语句到“pipeline-common”项目配置页,填入 Pipeline 脚本内,填入之前先清
空之前的示例。如图 3.8 所示。
3.8 Pipeline 脚本内 Git 配置
上述 Pipeline 脚本的具体内容如下。
node {
stage('Clone') {
echo "git clone common"
git
credentialsId:
'811f040f-8e2f-4424-8f60-0f92f8080e91',
url:
'http://192.168.9.13/root/common.git'
}
}
脚本内的“node”是流水线分配的一个执行区域,“stage”是区域内的执行步骤。
回到“分段生成器”界面,进行“Build”第二阶段的代码生成。要实现“Build”需要
切换到目录“/root/.jenkins/workspace/pipeline-common/dm-common/”使用“dir: Change
current directory”来辅助实现代码语句的生成,如图 3.9 所示。
3.9 分段生成器切换目录
“示例步骤”选择“dir: Change current directory”,“Path”填写要切换的路径,单
击“生成流水线脚本”按钮。切换目录是为了进行编译,通过直接调用 sh 命令实现,应用
到流水脚本后为 sh mvn clean deploy -Dmaven.test.skip=true”,将编译命令和切换命
令相结合就构成了“Build”的完整流水线脚本,如图 3.10 所示。
3.10 Build 阶段流水线脚本
上述 Pipeline 脚本的具体内容如下。
node {
stage('Clone') {
echo "git clone common"
git
credentialsId:
'811f040f-8e2f-4424-8f60-0f92f8080e91',
url:
'http://192.168.9.13/root/common.git'
}
}
node {
stage('Build') {
echo "begin build"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
由于 common 项目属于基础支持项目,并不需要发布,所以没有通过 Docker 发布的内
容,只需要将 common 项目及其六个子项目分别加入进来进行构建即可。这六个子项目的
dm-common-module→dm-common-dto→dm-common-dao→dm-common-client→dm-co
mmon-utils→dm-common-ext-utils,加入步骤可参考 dm-common 项目。完整的 Pipeline
脚本内容如下。
node {
stage('Clone') {
echo "git clone common"
git
credentialsId:
'811f040f-8e2f-4424-8f60-0f92f8080e91',
url:
'http://192.168.9.13/root/common.git'
}
}
node {
stage('Build dm-common') {
echo "begin dm-common"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Build dm-common-module') {
echo "begin dm-common-module"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/dm-common-module/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Build dm-common-dto') {
echo "begin dm-common-dto"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/dm-common-dto/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Build dm-common-dao') {
echo "begin dm-common-dao"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/dm-common-dao/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Build dm-common-client') {
echo "begin dm-common-client"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/dm-common-client/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}stage('Build dm-common-utils') {
echo "begin dm-common-utils"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/dm-common-utils/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Build dm-common-ext-utils') {
echo "begin dm-common-ext-utils"
dir('/root/.jenkins/workspace/pipeline-common/dm-common/dm-common-ext-utils/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
}
可以看到代码的拉取作为一个 node,其他的子项目 Buid 是放到一起的,这样不用每个
子项目都要去拉取一次代码,简化了 Buid 过程。
将上述完整 Pipeline 脚本保存入项目后。单击左侧菜单栏中的“立即构建”,所有步
骤都构建成功后即可出现如图 3.11 所示页面。
3.11 pipeline-common 项目构建
3. 构建 pipeline-dm-env 项目
Pipeline-dm-env 流 水 线 项 目 包 括 的 四 个 子 项 目 分 别 是 : dm-config-server
dm-discovery-eurekadm-gateway-zuuldm-zipkin-server。跟上面 pipeline-common
目类似,这四个子项目也需要逐个加入 pipeline-dm-env 流水线项目内。
在“dmw-pipeline”视图中新建“pipeline-dm-env”项目。单击“新建任务”,项目名
称处填写“pipeline-dm-env”,同样选择“流水线”项目类型,单击“OK”按钮创建该项
目,如图 3.12 所示。
3.12 pipeline-dm-env 项目创建
在“流水线”模块内填入流水线脚本代码,相关代码依旧可以通过分段生成器来辅助编
写,通过“流水线语法”进入分段生成器。如图 3.13 所示。
3.13 pipeline 脚本输入框
使用分段生成器生成拉取 Git 仓库代码,“示例步骤”选择“git: Git”,“仓库 URL
填写“http://192.168.9.13/root/env-project.git”,“凭据”选择对应的 damiwang 凭据,之
后单击“生成流水线脚本”生成 pipeline 脚本语句,如图 3.14 所示。
3.14 分段生成器生成拉取代码语句
Build”阶段的代码语句可直接复制 pipeline-common 的内容,然后修改切换路径的
地址。以子项目 dm-discovery-eureka 为例,Pipeline 脚本内容如下所示。
stage('Build dm-discovery-eureka') {
echo "maven build dm-discovery-eureka"
dir('/root/.jenkins/workspace/pipeline-dm-env/dm-discovery-eureka/') {
sh "mvn clean package -Dmaven.test.skip=true"
}
}
Pipeline-dm-env 流水线项目相对于 pipeline-common 多了发布的过程,发布 Deploy
的脚本代码同样可以通过分段生成器来生成。在分段生成器内选择“sshPublisher: Send
build artifacts over SSH”,填入 dm-discovery-eureka 项目的发布参数:“Name”选择对
应的发布服务器;“Source files”填写“dm-discovery-eureka/target/*.jar”;“Remove prefix
填写“dm-discovery-eureka/target/”;“Remote directory”填写“dm/dm-discovery-eureka
;
Exec command”填写
cd /home/px2/tools/dm
sudo `which docker-compose` stop config-server
sudo `which docker-compose` build config-server
sudo `which docker-compose` up -d config-server
页面效果如图 3.15 所示。
3.15 分段生成器 SSH Publisher 填写
填写完成后,单击“生成流水线脚本”按钮生成流水线代码。如图 3.16 所示。
3.16 SSH Publisher 流水线代码生成
将拉取代码、编译和编译后执行的命令三个部分生成的代码拷贝到流水线脚本内,生成
dm-discovery-eureka 项目的流水线脚本。同时,也可以将另外三个项目依照上述步骤加入
到流水线脚本内,最终的完整流水线脚本内容如下所示。
node {
stage('Clone dm-discovery-eureka') {
echo "git clone dm-discovery-eureka"
git
credentialsId:
'811f040f-8e2f-4424-8f60-0f92f8080e91',
url:
'http://192.168.9.13/root/env-project.git'
}
}
node {
stage('Build dm-discovery-eureka') {
echo "maven build dm-discovery-eureka"
dir('/root/.jenkins/workspace/pipeline-dm-env/dm-discovery-eureka/') {
sh "mvn clean package -Dmaven.test.skip=true"
}
}
stage('Deploy dm-discovery-eureka') {
echo "docker deploy dm-discovery-eureka"
sshPublisher(publishers:
[sshPublisherDesc(configName:
'server9.18',
transfers:
[sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/px2/tools/dm
sudo `which docker-compose` stop discovery-eureka
sudo `which docker-compose` build discovery-eureka
sudo `which docker-compose` up -d discovery-eureka''', execTimeout: 120000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory:
'dm/dm-discovery-eureka', remoteDirectorySDF: false, removePrefix: 'dm-discovery-eureka/target/',
sourceFiles:
'dm-discovery-eureka/target/*.jar')],
usePromotionTimestamp:
false,
useWorkspaceInPromotion: false, verbose: false)])
}
}
node {
stage('Build dm-config-server') {
echo "maven build dm-config-server"
dir('/root/.jenkins/workspace/pipeline-dm-env/dm-config-server/') {
sh "mvn clean package -Dmaven.test.skip=true"
}
}
stage('Deploy dm-config-server') {
echo "docker deploy dm-config-server"
sshPublisher(publishers:
[sshPublisherDesc(configName:
'server9.18',
transfers:
[sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/px2/tools/dm
sudo `which docker-compose` stop config-server
sudo `which docker-compose` build config-server
sudo `which docker-compose` up -d config-server''', execTimeout: 120000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory:
'dm/dm-config-server', remoteDirectorySDF: false, removePrefix: 'dm-config-server/target/',
sourceFiles:
'dm-config-server/target/*.jar')],
usePromotionTimestamp:
false,
useWorkspaceInPromotion: false, verbose: false)])
}
}
node {
stage('Build dm-gateway-zuul') {
echo "maven build dm-gateway-zuul"
dir('/root/.jenkins/workspace/pipeline-dm-env/dm-gateway-zuul/') {
sh "mvn clean package -Dmaven.test.skip=true"
}
}
stage('Deploy dm-gateway-zuul') {
echo "docker deploy dm-gateway-zuul"
sshPublisher(publishers:
[sshPublisherDesc(configName:
'server9.18',
transfers:
[sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/px2/tools/dm
sudo `which docker-compose` stop zuul-gateway
sudo `which docker-compose` build zuul-gateway
sudo `which docker-compose` up -d zuul-gateway''', execTimeout: 120000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory:
'dm/dm-gateway-zuul', remoteDirectorySDF: false, removePrefix: 'dm-gateway-zuul/target/',
sourceFiles:
'dm-gateway-zuul/target/*.jar')],
usePromotionTimestamp:
false,
useWorkspaceInPromotion: false, verbose: false)])
}
}
node {
stage('Build dm-zipkin-server') {
echo "maven build dm-zipkin-server"
dir('/root/.jenkins/workspace/pipeline-dm-env/dm-zipkin-server/') {
sh "mvn clean package -Dmaven.test.skip=true"
}
}
stage('Deploy dm-zipkin-server') {
echo "docker deploy dm-zipkin-server"
sshPublisher(publishers:
[sshPublisherDesc(configName:
'server9.18',
transfers:
[sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/px2/tools/dm
sudo `which docker-compose` stop zipkin-server
sudo `which docker-compose` build zipkin-server
sudo `which docker-compose` up -d zipkin-server''', execTimeout: 120000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory:
'dm/dm-zipkin-server', remoteDirectorySDF: false, removePrefix: 'dm-zipkin-server/target/',
sourceFiles:
'dm-zipkin-server/target/*.jar')],
usePromotionTimestamp:
false,
useWorkspaceInPromotion: false, verbose: false)])
}
}
脚本内容填写完成,保存退出后,单击“立即构建”,进行项目的编译和发布工作。执
行成功的结果,如图 3.17 所示。
3.17 pipeline-dm-env 项目构建成功
4. 构建 pipeline-dm-base 项目
Pipeline-dm-base 流 水 线 项 目 包 括 两 个 子 项 目 , 分 别 是 dm-base-consumer
dm-base-provider。在 Jenkins 首页单击“新建任务”,创建 pipeline-dm-base 流水线项目,
如图 3.18 所示。
3.18 pipeline-dm-base 流水线项目创建通过“流水线语法”进入分段生成器,如图 3.19 所示。
3.19 pipeline-dm-base 项目流水线脚本配置界面
通过分段生成器生成拉取 Git 仓库代码部分流水线脚本,如图 3.20 所示。
3.20 拉取代码流水线脚本生成
项目编译 Build 部分同样采用拷贝修改的方法,如下所示。
stage('Build dm-base-consumer') {
echo "build dm-base-consumer"
dir('/root/.jenkins/workspace/pipeline-dm-base/dm-base-consumer/') {
sh ''mvn clean package -Dmaven.test.skip=true
}
}
以上编译过程需要切换到对应的 dm-base-consumer 目录下,之后再进行项目的编译。
在“分段生成器”上选用“sshPublisher: Send build artifacts over SSH”,填写基于
SSH 的相关发布命令,如图 3.21 所示。
3.21 分段生成器生成发布命令填入
单击“生成流水线脚本”按钮,生成 Pipeline 脚本所需的代码片段,如图 3.22 所示。
3.22 dm-base-consumer 生成对应流水线脚本语句
以上是 dm-base-consumer 项目的生成过程,另一个项目 dm-base-provider 的生成过
程也类似。二者都生成完成后,可形成完整的流水线脚本,内容如下所示。
node {
stage('Clone dm-base-consumer') {
echo "git clone dm-base-consumer"
git
credentialsId:
'811f040f-8e2f-4424-8f60-0f92f8080e91',
url:
'http://192.168.9.13/root/base-consumer.git'
}
stage('Build dm-base-consumer') {
echo "build dm-base-consumer"
dir('/root/.jenkins/workspace/pipeline-dm-base/dm-base-consumer/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Deploy dm-base-consumer') {
echo "deploy dm-base-consumer"
sshPublisher(publishers:
[sshPublisherDesc(configName:
'server9.18',
transfers:
[sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/px2/tools/dm
sudo `which docker-compose` stop base-consumer
sudo `which docker-compose` build base-consumer
sudo `which docker-compose` up -d base-consumer''', execTimeout: 120000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory:
'dm/dm-base-consumer', remoteDirectorySDF: false, removePrefix: 'dm-base-consumer/target/',
sourceFiles:
'dm-base-consumer/target/*.jar')],
usePromotionTimestamp:
false,
useWorkspaceInPromotion: false, verbose: false)])
}
}
node {
stage('Clone dm-base-provider') {
echo "git clone dm-base-provider"
git
credentialsId:
'811f040f-8e2f-4424-8f60-0f92f8080e91',
url:
'http://192.168.9.13/root/base-provider.git'
}
stage('Build dm-base-provider') {
echo "build dm-base-provider"
dir('/root/.jenkins/workspace/pipeline-dm-base/dm-base-provider/') {
sh 'mvn clean deploy -Dmaven.test.skip=true'
}
}
stage('Deploy dm-base-provider') {
echo "deploy dm-base-provider"
sshPublisher(publishers:
[sshPublisherDesc(configName:
'server9.18',
transfers:
[sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/px2/tools/dm
sudo `which docker-compose` stop base-provider
sudo `which docker-compose` build base-provider
sudo `which docker-compose` up -d base-provider''', execTimeout: 120000, flatten: false,
makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory:
'dm/dm-base-provider', remoteDirectorySDF: false, removePrefix: 'dm-base-provider/target/',
sourceFiles:
'dm-base-provider/target/*.jar')],
usePromotionTimestamp:
false,
useWorkspaceInPromotion: false, verbose: false)])
}
}
项目保存退出后,同样单击“立即构建”按钮,完成 pipeline-dm-base 项目的构建。
5. 构建其他业务项目
除了以上项目外,还需要构建另外的五个流水线项目,分别是:pipeline-dm-item
pipeline-dm-orderpipeline-dm-paypipeline-dm-schedulerpipeline-dm-user。其中每
一个流水线项目都包括对应的 consumer provider 项目。相关项目都创建成果后的结果如
3.23 所示。
图 3.23 所有流水线项目
6. 测试业务项目
相 关 的 基 础 服 务 、 业 务 服 务 都 构 建 完 成 后 , 就 可 以 进 行 项 目 测 试 。 访 问
http://192.168.9.18:8888 查看大觅网的首页内容,如图 3.24 所示。
3.24 大觅网网站
至此,大觅网项目搭建完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频整体解码流程和同步流程

目录 1. 整体解码流程1. 初始化 FFmpeg2. 打开媒体文件3. 查找解码器4. 打开解码器5. 读取和解码数据6. 处理解码后的帧7. 释放资源 2. 音视频同步整体流程1. 解复用媒体流2. 解码3. 以音频为时钟源进行音视频同步的策略4. 缓冲区设计 现在先说大体流程,不分析代码 …

使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?

1.对python爬虫的看法 首先说说我对python的看法,我的专业是大数据,我从事的工作是java开发,但是在工作之余,我对python又很感兴趣,因为我觉得python是一门很好的语言,第一:它可以用来爬取数据…

如何使用 Rust 框架进行 RESTful API 的开发?

一、RESTful API 的开发 使用 Rust 框架进行 RESTful API 开发,你可以选择多种流行的 Rust Web 框架,如 Actix-web、Rocket、Warp 和 Tide 等。以下是使用这些框架进行 RESTful API 开发的基本步骤和概念: 选择框架:根据项…

探索 Snowflake 与 Databend 的云原生数仓技术与应用实践 | Data Infra NO.21 回顾

上周六,第二十一期「Data Infra 研究社」在线上与大家相见。活动邀请到了西门子数据分析师陈砚林与 Databend 联合创始人王吟,为我们带来了一场关于 Snowflake 和 Databend 的技术探索。Snowflake,这个市值曾超过 700 亿美元的云原生数据仓库…

李宏毅机器学习2023-HW10-Adversarial Attack

文章目录 TaskBaselineFGSM (Fast Gradient Sign Method (FGSM)I-FGSM(Iterative Fast Gradient Sign Method)MI-FGSM(Momentum Iterative Fast Gradient Sign Method)M-DI2-FGSM(Diverse Input Momentum Iterative Fast Gradient Sign Method) Reportfgsm attackJepg Compress…

性能优化与资源管理:优化Selenium脚本的执行效率,合理管理浏览器实例和系统资源

目录 引言 一、Selenium基础与常用方法 1.1 Selenium简介 1.2 Selenium基础用法 二、Selenium性能优化技巧 2.1 使用WebDriverWait实现显式等待 2.2 启用无头模式 2.3 设置合理的页面加载策略 2.4 禁用图片和JavaScript加载 2.5 优化元素定位 2.6 合理使用隐式等待和…

从0开始linux(5)——vim

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 vim的多种模式底行模式命令命令模式视块模式(visual block) vim的配置 vim是linux系统的文本编辑器。就像windows的记事本一样。 使用vim指令可以使用vim打开一个文本文…

JavaWeb美食推荐管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优…

JavaScript 学习

一、输出 为方便调试可以输出内容&#xff0c;但是用户是看不到的。要在开发者模式中看。 console . log ( "Hello" )&#xff1b; 二、外部文件引用 可以直接在html中写JS <head> <meta charset"utf-8"> <script> console.log("he…

ZYNQ:开发环境搭建

资料下载 http://47.111.11.73/docs/boards/fpga/zdyz_qimxing(V2).html Vivado软件是什么&#xff1f; Vivado软件是Xilinx&#xff08;赛灵思&#xff09;公司推出的一款集成设计环境&#xff08;IDE&#xff09;&#xff0c;主要用于FPGA&#xff08;现场可编程门阵列&am…

零代码构建自己强大的Agent智能体,偷偷甩掉90%的人

转自公众号&#xff1a;渡码 Agent&#xff08;智能体&#xff09;的概念大家应该并不陌生了&#xff0c;今天分享通过可视化的方式构建各种各样强大的智能体。 关于Agent的定义&#xff0c;我并不想引用官方正式的说法。而是按照我的理解通俗地解释一下。 大模型好比是面粉…

第166天:应急响应-拒绝服务钓鱼指南DDOS压力测试邮件反制分析应用日志

案例一&#xff1a;内网应急-日志分析-爆破&横向&数据库 数据库 这里不同数据库日志不一样&#xff0c;我用mysql分析 首先MySQL数据库需要支持远程连接 GRANT ALL PRIVILEGES ON . TO root% IDENTIFIED BY 123.com WITH GRANT OPTION; 其次开启日志 -- 查看general…

Flutter为Android添加签名并打包

前言 我们需要将App进行数字签名才能发布到商店里。在这里就具体描述一下如果给App添加签名 为App签名 创建一个用户上传的秘钥库 如果你已经有一个秘钥库了&#xff0c;可以直接跳到下一步&#xff0c;如果没有则按照下面的指令创建一个 keytool 可能不在我们的系统路径中…

MySQL多版本并发控制MVCC实现原理

MVCC MVCC 是多版本并发控制方法&#xff0c;用来解决读和写之间的冲突&#xff0c;比如脏读、不可重复读问题&#xff0c;MVCC主要针对读操作做限制&#xff0c;保证每次读取到的数据都是本次读取之前的已经提交事务所修改的。 概述 当一个事务要对数据库中的数据进行selec…

【初阶数据结构】详解二叉树 - 树和二叉树(三)(递归的魅力时刻)

文章目录 前言1. 二叉树链式结构的意义2. 手搓一棵二叉树3. 二叉树的遍历&#xff08;重要&#xff09;3.1 遍历的规则3.2 先序遍历3.3 中序遍历3.4 后序遍历3.5 遍历的代码实现3.5.1 先序遍历代码实现3.5.2 中序遍历代码实现3.5.3 后序遍历代码实现 4. 统计二叉树结点的个数5.…

微服务注册中⼼2

5.Nacos配置管理 Nacos除了可以做注册中⼼&#xff0c;同样可以做配置管理来使⽤ 5.1 统⼀配置管理 当微服务部署的实例越来越多&#xff0c;达到数⼗、数百时&#xff0c;逐个修改微服务配置就会让⼈抓狂&#xff0c;⽽且很容易出错。我们需要⼀种统⼀配置管理⽅案&#xf…

Java.反射

目录 1.获取class 的三种方式 2.利用反射获取构造方法 3.利用反射获取成员变量 4.利用反射获取成员方法 1.获取class 的三种方式 全类名怎么找? 全类名报名&#xff0b;类名 package MyReflect;public class Student {private String id;private String name;private int…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; A. 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护。…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25 1. PromSec: Prompt Optimization for Secure Generation of Functional Source Code with Large Language Models (LLMs) M Nazzal, I Khalil, A Khreishah, NH Phan - arXiv preprint arXiv:2409.12699, 2…

Python--操作列表

1.for循环 1.1 for循环的基本语法 for variable in iterable: # 执行循环体 # 这里可以是任何有效的Python代码块这里的variable是一个变量名&#xff0c;用于在每次循环迭代时临时存储iterable中的下一个元素。 iterable是一个可迭代对象&#xff0c;比如列表&#xff08;…