当前位置: 首页 > news >正文

大觅网之自动化部署(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 大觅网网站
至此,大觅网项目搭建完成。

相关文章:

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

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

【C++】入门基础知识-1

🍬个人主页:Yanni.— 🌈数据结构:Data Structure.​​​​​​ 🎂C语言笔记:C Language Notes 🏀OJ题分享: Topic Sharing 目录 前言: C关键字 命名空间 命名空间介…...

Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型

通用命令 get() / set() 这是Redis中两个最为核心的命令。 set插入 这里的key 和 value都是字符串,我们可以加双引号 或者单引号,或者不加。 get查找 如果查询的key值不存在,那么会返回一个 nil ,也就是代表空 在Redis中命令…...

使用电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、VSCode、ESP32C3)

文章目录 Wokwi 简介安装客户端(Mac/Linux)创建 Token Arduino IDEVSCode 配置安装 wokwi 插件打开编译后目录 ESP32C3 示例Arduino IDE创建模拟器运行模拟器 Wokwi 简介 Wokwi 是一款在线电子模拟器。您可以使用它来模拟 Arduino、ESP32、STM32 以及许…...

C嘎嘎入门篇:类和对象(1)

前言: 小编在之前讲述了C的部分入门基础,读者朋友一定要掌握好那些,因为C的学习和C有点不同,C的知识都是比较连贯的,所以我们学好了前面才可以学习后面的内容,本篇文章小编将会讲述C真正的入门篇&#xff1…...

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包,并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…...

unity_Occlusion_Culling遮挡剔除学习

unity_Occlusion_Culling遮挡剔除学习 文档: https://docs.unity.cn/cn/2019.4/Manual/occlusion-culling-getting-started.html没彻底搞明白,但是会用,虽然也不熟练 设置遮挡剔除 打开遮挡剔除面板 设置场景物体。设置为静态 设置场景 烘…...

vue初学随笔

Vue基础 Vue基本概念 Vue是什么 Vue是一个渐进式的JavaScript框架,它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 渐进式:各个特性可以根据项目需要逐渐引入和…...

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范(Java Bean Validation,简称 JSR 380),它并没有具体的实现,它的常用实现,是hibernate-validator。…...

微信小程序 - 最新详细安装使用 Vant weapp UI 框架环境搭建详细教程

前言 自从 2024 年开始,小程序做了很多改变和升级, 导致网上很多搭建教程文章的教程失效了,本文来做最新的教程。 第一步 为了更贴合新手,我这里创建了一个纯净无任何业务代码的小程序项目。...

【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)

文章目录 一、sizeof和strlen的对⽐1.sizeof2.strlen3.sizeof与strlen对比 二、数组和指针笔试解析1.一维数组2.字符、字符串数组和字符指针代码1代码2代码3代码4代码5代码6 3.二维数组4.总结 三、指针运算笔试题解析代码1代码2代码3代码4代码5代码6 一、sizeof和strlen的对⽐ …...

Vue中input框自动聚焦

在Vue中input自动聚焦的思路&#xff1a; 给需要聚焦的input设置ref <el-inputv-model"loginForm.username"ref"userNameInput"name"username"type"text"auto-complete"on"placeholder"username"keyup.enter.…...

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计旅游推荐网站

猜你喜欢评论 登录注册搜索 推荐定制景点/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 功能图如下所示&#xff1a; 一、设计目标 本次计算机毕业设计项目的主要目标是设计和开发一款功能完善、用户友好的旅游推荐网站。该网站旨在为广大旅游爱好者提供一个便捷、…...

已存在的Python项目使用依赖管理工具UV

1. 文档 uv文档 2. 如何转换 初始化 uv initrequirements.txt转换成pyproject.toml uv add $(cat requirements.txt)删除requirements.txt 如果更新pyproject.toml之后&#xff0c;使用命令 uv sync替换项目环境 如果有库没有加入依赖&#xff0c;自己手动加一下&am…...

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 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…...

如何像专家一样修复任何 iPhone 上的“iPhone 已禁用”错误

“我忘记了密码&#xff0c;并且我的 iPhone 在多次输入错误密码后就被禁用了&#xff0c;如何再次访问我的手机&#xff1f;” 作为最安全的数字设备之一&#xff0c;iPhone 必须使用正确的密码解锁。即使您可以使用 Face ID 或 Touch ID 访问您的设备&#xff0c;在充电或重…...

django drf to_representation

使用场景 1.需要对结果的中的某个字段进行进一步的处理&#xff1b; 2.模型类中没有的字段&#xff0c;添加到结果中进行响应&#xff1b; 例子 from django.db import modelsclass TestModel(models.Model):name models.CharField(_("名称"), max_length50, nul…...

2024最新国内镜像源设置(npm、yarn、pnpm)

淘宝镜像源https://registry.npmmirror.com/ 腾讯云镜像源https://mirrors.cloud.tencent.com/npm/ cnpm是一个基于npm的中国镜像源https://r.cnpmjs.org/ # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 npm config set registry https://registry.npmmirror.co…...

Java线程池和原子性

文章目录 前言1 线程池1.1 线程池概述1.1.1 线程池存在的意义1.1.2 Executors默认线程池 1.2 线程状态介绍1.2.1 线程状态源码1.2.2 线程状态含义1.2.3 线程状态转换图 2 原子性2.1 volatile关键字2.2 synchronized解决2.3 原子性2.4 AtomicInteger类2.5 悲观锁和乐观锁 前言 …...

【数据评估与清洗】对数据结构和内容进行清洗

评估数据 结构方面 需要清理&#xff1a;乱数据不需要清理&#xff1a;整洁数据 每列是一个变量每行是一个观察值每个单元格是一个值 内容方面 需要清理&#xff1a;脏数据 丢失数据重复数据不一致数据无效或错误数据 不需要清理&#xff1a;干净数据 # 获取整体信息 df.in…...

机器学习和深度学习的区别

1. 基本概念 1.1 机器学习定义 机器学习是人工智能的一个核心分支&#xff0c;它赋予计算机系统无需明确编程即可学习和改进的能力。通过分析大量数据&#xff0c;机器学习算法能够识别数据中的模式和趋势&#xff0c;从而做出预测或决策。这种方法通常涉及统计模型和优化技术…...

UE虚幻引擎云渲染汽车动画的优势!

在汽车广告和动画制作领域&#xff0c;虚幻引擎&#xff08;UE&#xff09;结合云渲染技术正掀起一场技术革命。这项技术以其高性能、成本效益和灵活性&#xff0c;为创作者提供了强大的工具&#xff0c;以实现更加逼真和高效的汽车动画制作。 一、为什么选择UE虚幻引擎制作汽车…...

Teams集成-会议侧边栏应用开发-实时转写

Teams虽然提供了转写的接口&#xff0c;但是不是实时的&#xff0c;即便使用订阅事件也不是实时的&#xff0c;为了达到实时转写的效果&#xff0c;使用recall.ai的转录和assembly_ai的转写实现。 前提&#xff1a;除Teams会议侧边栏应用开发-会议转写-CSDN博客的基本要求外&a…...

归并排序,外排序,计数排序(非比较排序)

归并排序&#xff1a;&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序…...

使用离火插件yoloV8数据标注,模型训练

1. 启动 2.相关配置 2.1 data.yaml path: D:/yolo-tool/yaunshen-yolov8/YOLOv8ys/YOLOv8-CUDA10.2/1/datasets/ceshi001 train: images val: images names: [蔡徐坤,篮球] 2.2 cfg.yaml # Ultralytics YOLOv8, GPL-3.0 license # Default training settings and hyp…...

JavaScript 学习

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

【算法】分治:归并之 912.排序数组(medium)

系列专栏 双指针 模拟算法 分治思想 目录 1、题目链接 2、题目介绍 3、解法 解决方案选择 解题步骤 4、代码 1、题目链接 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 …...

Cocos 3.8.3 实现外描边效果(逃课玩法)

本来想着用Cocos 的Shader Graph照搬Unity的思路来加外描边&#xff0c;发现不行&#xff0c;然后我就想弄两个物体不就行了吗&#xff0c;一个是放大的版本&#xff0c;再放大的版本上加一个材质&#xff0c;这个材质面剔除选择前面的面剔除就行了&#xff0c;果不其然还真行。…...

著名建筑物检测与识别系统源码分享

著名建筑物检测与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…...

使用php生成图片

可以用这方法生成图片 水印 字体可以在资源绑定下载&#xff0c;如果字体路径不对&#xff0c;则不会输出文字图片 public function generateImage($text,$id) { header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:0…...