From 74cebb37a84e1cdc9c7bb0cc513c8f31d2602737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 23 Dec 2023 21:14:56 +0800 Subject: [PATCH] =?UTF-8?q?doc:=E6=B7=BB=E5=8A=A0cicd=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- Yi.Abp.Net8/end.sh | 2 +- .../01.模块化.md | 0 .../02.动态Api.md | 0 .../03.依赖注入.md | 0 .../04.属性注入.md | 0 .../05.当前用户.md | 0 .../06.SqlSugarORM.md | 0 .../07.仓储.md | 0 .../08.Crud增删改查.md | 0 .../09.审计日志.md | 0 .../10.工作单元.md | 0 .../11.种子数据.md | 0 .../12.Jwt鉴权.md | 0 .../13.接口授权.md | 0 .../14.异常处理.md | 0 .../图书管理系统.md | 0 Yi.Doc.Md/04.橙子运维CICD教程/01.开始概述.md | 22 ++ Yi.Doc.Md/04.橙子运维CICD教程/02.环境安装.md | 141 ++++++++++ .../03.Jenkins流水线配置.md | 264 ++++++++++++++++++ 20 files changed, 430 insertions(+), 2 deletions(-) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/01.模块化.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/02.动态Api.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/03.依赖注入.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/04.属性注入.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/05.当前用户.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/06.SqlSugarORM.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/07.仓储.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/08.Crud增删改查.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/09.审计日志.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/10.工作单元.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/11.种子数据.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/12.Jwt鉴权.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/13.接口授权.md (100%) rename Yi.Doc.Md/{02.框架功能模块 => 02.框架功能模块教程}/14.异常处理.md (100%) rename Yi.Doc.Md/{03.实战演练 => 03.实战演练开发教程}/图书管理系统.md (100%) create mode 100644 Yi.Doc.Md/04.橙子运维CICD教程/01.开始概述.md create mode 100644 Yi.Doc.Md/04.橙子运维CICD教程/02.环境安装.md create mode 100644 Yi.Doc.Md/04.橙子运维CICD教程/03.Jenkins流水线配置.md diff --git a/README.md b/README.md index 7a35f5a7..3912ff6f 100644 --- a/README.md +++ b/README.md @@ -59,11 +59,12 @@ Rbac演示地址:https://ccnetcore.com:1000 (用户cc、密码123456) **** ### 详细到爆炸的Yi框架教程导航: +(既然选择开源,就本该怀揣着最纯粹分享的内心,我们全套打包分享,开源包括且不仅仅是:文档、框架代码、模块代码、运维CICD等,希望能够帮助到您) 1. [框架快速开始教程](https://ccnetcore.com/article/aaa00329-7f35-d3fe-d258-3a0f8380b742)(已完成) 2. [框架功能模块教程](https://ccnetcore.com/article/8c464ab3-8ba5-2761-a4b0-3a0f83a9f312)(已完成) 3. [实战演练开发教程](https://ccnetcore.com/article/e89c9593-f337-ada7-d108-3a0f83ae48e6) - +4. [橙子运维CICD教程](https://ccnetcore.com/article/6b80ed42-50cd-db15-c073-3a0fa8f7fd77)(已完成) **** ### 它的理念: diff --git a/Yi.Abp.Net8/end.sh b/Yi.Abp.Net8/end.sh index a24c1d2d..4ac12232 100644 --- a/Yi.Abp.Net8/end.sh +++ b/Yi.Abp.Net8/end.sh @@ -1,3 +1,3 @@ #!/bin/bash -kill $(ps -aux | grep Yi.Abp.Web.dll | awk '{print $2}') +kill $(lsof -t -i:19001) echo "Yi-进程已关闭" diff --git a/Yi.Doc.Md/02.框架功能模块/01.模块化.md b/Yi.Doc.Md/02.框架功能模块教程/01.模块化.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/01.模块化.md rename to Yi.Doc.Md/02.框架功能模块教程/01.模块化.md diff --git a/Yi.Doc.Md/02.框架功能模块/02.动态Api.md b/Yi.Doc.Md/02.框架功能模块教程/02.动态Api.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/02.动态Api.md rename to Yi.Doc.Md/02.框架功能模块教程/02.动态Api.md diff --git a/Yi.Doc.Md/02.框架功能模块/03.依赖注入.md b/Yi.Doc.Md/02.框架功能模块教程/03.依赖注入.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/03.依赖注入.md rename to Yi.Doc.Md/02.框架功能模块教程/03.依赖注入.md diff --git a/Yi.Doc.Md/02.框架功能模块/04.属性注入.md b/Yi.Doc.Md/02.框架功能模块教程/04.属性注入.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/04.属性注入.md rename to Yi.Doc.Md/02.框架功能模块教程/04.属性注入.md diff --git a/Yi.Doc.Md/02.框架功能模块/05.当前用户.md b/Yi.Doc.Md/02.框架功能模块教程/05.当前用户.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/05.当前用户.md rename to Yi.Doc.Md/02.框架功能模块教程/05.当前用户.md diff --git a/Yi.Doc.Md/02.框架功能模块/06.SqlSugarORM.md b/Yi.Doc.Md/02.框架功能模块教程/06.SqlSugarORM.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/06.SqlSugarORM.md rename to Yi.Doc.Md/02.框架功能模块教程/06.SqlSugarORM.md diff --git a/Yi.Doc.Md/02.框架功能模块/07.仓储.md b/Yi.Doc.Md/02.框架功能模块教程/07.仓储.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/07.仓储.md rename to Yi.Doc.Md/02.框架功能模块教程/07.仓储.md diff --git a/Yi.Doc.Md/02.框架功能模块/08.Crud增删改查.md b/Yi.Doc.Md/02.框架功能模块教程/08.Crud增删改查.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/08.Crud增删改查.md rename to Yi.Doc.Md/02.框架功能模块教程/08.Crud增删改查.md diff --git a/Yi.Doc.Md/02.框架功能模块/09.审计日志.md b/Yi.Doc.Md/02.框架功能模块教程/09.审计日志.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/09.审计日志.md rename to Yi.Doc.Md/02.框架功能模块教程/09.审计日志.md diff --git a/Yi.Doc.Md/02.框架功能模块/10.工作单元.md b/Yi.Doc.Md/02.框架功能模块教程/10.工作单元.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/10.工作单元.md rename to Yi.Doc.Md/02.框架功能模块教程/10.工作单元.md diff --git a/Yi.Doc.Md/02.框架功能模块/11.种子数据.md b/Yi.Doc.Md/02.框架功能模块教程/11.种子数据.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/11.种子数据.md rename to Yi.Doc.Md/02.框架功能模块教程/11.种子数据.md diff --git a/Yi.Doc.Md/02.框架功能模块/12.Jwt鉴权.md b/Yi.Doc.Md/02.框架功能模块教程/12.Jwt鉴权.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/12.Jwt鉴权.md rename to Yi.Doc.Md/02.框架功能模块教程/12.Jwt鉴权.md diff --git a/Yi.Doc.Md/02.框架功能模块/13.接口授权.md b/Yi.Doc.Md/02.框架功能模块教程/13.接口授权.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/13.接口授权.md rename to Yi.Doc.Md/02.框架功能模块教程/13.接口授权.md diff --git a/Yi.Doc.Md/02.框架功能模块/14.异常处理.md b/Yi.Doc.Md/02.框架功能模块教程/14.异常处理.md similarity index 100% rename from Yi.Doc.Md/02.框架功能模块/14.异常处理.md rename to Yi.Doc.Md/02.框架功能模块教程/14.异常处理.md diff --git a/Yi.Doc.Md/03.实战演练/图书管理系统.md b/Yi.Doc.Md/03.实战演练开发教程/图书管理系统.md similarity index 100% rename from Yi.Doc.Md/03.实战演练/图书管理系统.md rename to Yi.Doc.Md/03.实战演练开发教程/图书管理系统.md diff --git a/Yi.Doc.Md/04.橙子运维CICD教程/01.开始概述.md b/Yi.Doc.Md/04.橙子运维CICD教程/01.开始概述.md new file mode 100644 index 00000000..5893f7ff --- /dev/null +++ b/Yi.Doc.Md/04.橙子运维CICD教程/01.开始概述.md @@ -0,0 +1,22 @@ +## CiCd概述 +CI/CD是持续集成/持续交付(Continuous Integration/Continuous Delivery)的缩写。它是一种软件开发的实践方法,旨在加快软件交付的速度和质量。 + +说简单一点的实现,就是通过代码的提交或者合并等方式,直接将线上环境进行自动发布部署。 + +也可以结合gitlab+jenkins+harbor+docker+k8s进行制作镜像管理,但碍于服务器成本、网络等各类因素,gitee+jenkins为成本较低推荐方式。 + +> 本章也是基于该方式进行教程 + + +## 运维不容易,且行且珍惜 +最近收到很多朋友对CiCd非常感兴趣,橙子本人有幸担任过运维岗位,所以对这块功能略知一二 + +作为开源软件,不光文档开源、代码开源,我们希望分享的更多,让大家学习到更多有用的技术及知识,因此运维方式也同样开源! + +本教程是基于Yi框架进行CiCd的实战构建,不一定是和yi框架强绑定,其实也算是一个Jenkins的实战教程 + +> 说明,目前演示环境及正式环境都已经部署该套Cicd流程,比较简单稳定 + +从零开始制作一个完整的CiCd,其中对于新人来说,有非常多的坑,由于操作系统版本、网络环境等各类因素,橙子都基本被坑过,同时并不是只搭建一次才总结出来的经验,而是这几年下来总结下来的坑。 + +橙子老哥的教程,不同于网络视角,绝对干货满满,希望能够帮助到大家,我们也就很开心了~ \ No newline at end of file diff --git a/Yi.Doc.Md/04.橙子运维CICD教程/02.环境安装.md b/Yi.Doc.Md/04.橙子运维CICD教程/02.环境安装.md new file mode 100644 index 00000000..51021b4d --- /dev/null +++ b/Yi.Doc.Md/04.橙子运维CICD教程/02.环境安装.md @@ -0,0 +1,141 @@ +## 环境大纲 + +我先把整个流程的大纲罗列以下,后续的章节会介绍每一个环境 + +操作系统:Linux(centos 7) + +以下是之后将集成的环境: + +- jenkins环境 +- jdk17环境 +- jenkins权限 +- .net8环境 +- nohup环境 +- docker环境 +- node.js环境 +- 7z环境 +- git环境 + +## jdk17+Jenkin环境 + +> 强烈不建议将jenkins安装在docker中,会遇到各种牛马权限等命令问题,像这种运维工具,强烈推荐直接安装到主机中 + +这个可以通过yum进行安装,官网有对应的教程,跟着教程安装即可 + +官网教程地址:https://pkg.jenkins.io/redhat-stable/ + +使用以下命令先安装jdk17后,再安装jenkins +``` shell + sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo + sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key + + yum install fontconfig java-17-openjdk + yum install jenkins +``` +安装完成后,使用`systemctl start jenkins`启动即可 + +首次启动后,将会出现需要管理员密钥,这里跟着提示,去cat命令查看对应的文件,复制即可,后续下载推荐的安装插件,同时创建一个账号 + +> 这里推荐安装插件极有可能因为网络原因无法进行下载及安装,需要看一下,是什么导致的,如果显示是ssl导致的,可先跳过推荐插件下载,离线安装` skip-certificate-check.hpi `插件,即可加载成功 + +当安装完成后,如果下载插件慢,可以更换插件源,这个网上资料很多 + +另外,执行命令的时候,很多时候会显示jenkins无权限 + +需要给jenkins对应的目录权限,这里为Jenkins的主目录 +``` shell +chown -R jenkins:jenkins /var/lib/jenkins/ +``` + +## .Net8环境安装 + +好吧,如果想在centos中安装.net8也是一个坑,由于centos已经放弃维护了,yum也不支持直接安装了,需要我们手动下载.net sdk进行安装 + +> 如果centos版本不是很高,还会遇到c++库的一些版本问题 + +我们可以通过微软官网下载安装教程: +https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 + +由于centos7已经不支持了,所以我们只能选择二进制进行手动安装 + +下载完对应的文件之后,我们需要手动配置环境变量 + +这里,我是习惯安装到我的/opt/dotnet文件夹下 +``` shell +mkdir -p /opt/dotnet/dotnet && tar zxf dotnet-sdk-8.0.100-linux-x64.tar.gz -C /opt/dotnet/dotnet +export DOTNET_ROOT=/opt/dotnet/dotnet +export PATH=$PATH:/opt/dotnet/dotnet +``` + + +## docker环境安装 +这个安装没啥说的,网上资料一大把,就不重复了,安装个docker而已,洒洒水啦~ + +这里我还是给一下网上的教程 +``` shell +sudo yum install -y yum-utils device-mapper-persistent-data lvm2 +sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + +sudo yum install docker-ce + +#启动 +sudo systemctl start docker + +#设置开机自动启动 +sudo systemctl enable docker + +sudo docker version +``` + +## node.js环境安装 + +由于前端的代码需要编译并进行打包,我们还需要node.js的环境 + +> 版本别下载的太新了,太新了对操作系统的环境是有要求的,通常下载16-18的版本即可 + +以下是18.13版本的官网下载地址: +https://nodejs.org/dist/v18.13.0/ + +我们需要通过手动二进制去进行安装 + +与.net8安装操作几乎是一致的,可以将下载的包解压到/opt/nodejs目录下 + +然后设置环境变量 + +``` shell +export PATH=$PATH:/opt/nodejs/node-v18.13.0-linux-x64/bin\ +``` + +这里可以检测一下的环境变量 +``` shell +export PATH + +# 可以偷懒,直接强行赋值 +export PATH=/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/dotnet:/opt/nodejs/node-v18.13.0-linux-x64/bin +``` + +我们可以测试输出node和npm命令是否有反应 + +## 7z.zip环境安装 +因为我们设计到压缩包的传输,所以要压缩包的操作,这里推荐使用7z好用,但是我发现网上下载的操作奇奇怪怪的,我也放一个出来吧 +``` shell +# 先安装epel-release\ +yum -y install epel-release\ +# 在执行安装[7z]的功能\ +yum -y install p7zip p7zip-plugins + +``` + +可以测试使用7z的命令是否有反应 + +## git安装 +这个简单,直接 +``` shell +yum install git +``` +一步到位 +## 环境准备完成 + +好了,到此,基本核心的环境你已经准备完成 + +已经结束了?不,其实真正的坑多的,还是在jenkins这块,为此我单独将jenkins单独拿出篇幅,下章进行教程 \ No newline at end of file diff --git a/Yi.Doc.Md/04.橙子运维CICD教程/03.Jenkins流水线配置.md b/Yi.Doc.Md/04.橙子运维CICD教程/03.Jenkins流水线配置.md new file mode 100644 index 00000000..6a909b90 --- /dev/null +++ b/Yi.Doc.Md/04.橙子运维CICD教程/03.Jenkins流水线配置.md @@ -0,0 +1,264 @@ +## jenkins流水线 + +在上一章,已经将核心的环境给安装了,接下来我们可进行jenkins的流水线配置 + +> 这里开始配置的前提,需要将推荐插件下载,不安装插件流水线的功能都没有,同时检测`Publish Over SSH`插件是否已经安装,需要这个插件进行远程执行命令 + +## 配置凭据 +我们需要先将密钥配置好,因为我们等下的流水线的git拉去代码要将密钥进行登录 + +在`系统管理/凭据/系统/全局凭据 (unrestricted)`中添加一个用户名和密码的凭据,这里我们可以填写我们git仓库的的账号即可 + +## 配置免密登录 +这一步至关重要,由于我们会远程向其他服务器执行命名,需要先配置免密登录。 + +通常来说,jenkins只做拉去代码,打包发布成可执行的包,至于执行包发布给谁,可以通过ssh发送,对应的服务器只需要收到包,解压,然后直接启动即可,如果服务器资源不够,也可以考虑`127.0.0.1`当远程服务器 + +``` shell +#获取rsa密钥对 +ssh-keygen -t rsa\ + +#将密钥进行拷贝 +ssh-copy-id -i /root/.ssh/id_rsa.pub root\@localhost +``` +按以上的提示一步一步回车即可 + +如果提示命令没有找到,需安装openssh客户端 +``` shell +yum -y install openssh-clients\ +``` +## Publish over SSH配置 +由于我们使用到这个插件进行命令与文件的传输 + +需要在`系统管理/System/Publish over SSH`中进行配置这个插件 + +主要就是针对的上方的免密登录功能 + +以下详细介绍每一个配置吧~ +``` shell +name: 只是一个标识 + +Hostname: 远程ip,如果是本机可以localhost + +Username:远程登录用户名,可以root + +Remote Directory:远程传输根目录,待会传输文件的目录会拼接上这个,我是习惯传输到/home下,所以可以填写/home + +Key 输入框粘贴 `/root/.ssh/id_rsa` 中的密钥,全部都要粘贴进去哦~ +``` +保存之前,可以进行测试,看以下是否成功! + +## 环境变量配置 +如果之前配置的环境变量,不是系统环境变量,需要单独为jenkins赋上 + +不然执行命令,将提示命令未找到,主要是dotnet与npm + +我们可以在`系统管理/System`中的全局属性下有一个`环境变量` +``` shell +key: PATH +value: /usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/dotnet:/opt/nodejs/node-v18.13.0-linux-x64/bin +``` + +### 后端脚本编写 + +有了环境,我们可以将我们的代码手动发布上传,测试一下是否可以手动执行dotnet运行,如果成功,将说明环境安装成功 + +之后,我们可以写两个脚本,一个启动、一个关闭,放到我们的程序入口,关于程序的启动和关闭,可以由脚本来控制会减少很多的问题及困难 + +我们其实已经在程序里带出来了,就是框架中的`start.sh`及`end.sh` + +``` shell +#!/bin/bash +./end.sh +nohup dotnet Yi.Abp.Web.dll > /dev/null 2>&1 & +echo "Yi-启动成功!" + + +#!/bin/bash +kill $(lsof -t -i:19001) +echo "Yi-进程已关闭" + +``` + +编写启动和停止脚本,我们还要给它赋值权限,否则不是一个有效的执行文件 + +``` shell +chmod +x start.sh +chmod +x end.sh +``` + +> 这里如果提示:unix编码问题 ^M +可以使用vim进行转码 +``` shell +vim test.sh +:set ff=unix +:wq + +``` + + +## 流水线编写 + +好了,到了这步,如果你一切顺利,恭喜你,准备进入流水线的脚本编写了 + +> 心急吃不了热豆腐,我们得静下心来,这块需要慢慢配置,一点一点调试 + +首页->新建任务->流水线 + +> 以下脚本为Yi框架的cicd脚本,后端与前端及各个项目是不一样 + +我这里已经将脚本编写好,可根据实际情况进行更改,主要是密钥和授权等 + +### 后端流水线脚本: +``` java +pipeline { + agent any + + stages { + stage('git') { + steps { + git branch: 'abp', credentialsId: '38c9c74f-8658-4b8d-9ee7-d4c9923ef042', url: 'https://gitee.com/ccnetcore/Yi.git' + echo '仓库克隆成功' + } + } + stage('build') { + steps { + sh """ + cd Yi.Abp.Net8/src/Yi.Abp.Web; + dotnet publish -c Release; + """ + echo '构建成功' + } + } + stage('zip') { + steps { + sh """ + mkdir -p ./publish + 7za a ./publish/publish_01.zip ./Yi.Abp.Net8/src/Yi.Abp.Web/bin/Release/net8.0/publish/*; + """ + echo '压缩包成功' + } + } + stage('publish') { + steps { + sshPublisher(publishers: [sshPublisherDesc(configName: 'ccnetcore', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/yi/net8 +echo 开始解压 +unzip -o /home/yi/build/publish_01.zip -d ./ +echo 开始启动 +sh start.sh +echo 启动成功''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'yi/build', remoteDirectorySDF: false, removePrefix: 'publish', sourceFiles: 'publish/publish_01.zip')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) + echo '发布成功' + } + } + } +} + +``` +### 前端rbac脚本: +``` shell +pipeline { + agent any + + stages { + stage('git') { + steps { + git branch: 'abp', credentialsId: '38c9c74f-8658-4b8d-9ee7-d4c9923ef042', url: 'https://gitee.com/ccnetcore/Yi.git' + echo '仓库克隆成功' + } + } + stage('build') { + steps { + sh """ + cd Yi.RuoYi.Vue3; + npm config set registry https://registry.npm.taobao.org; + npm i; + npm run build:prod; + """ + echo '构建成功' + } + } + stage('zip') { + steps { + sh """ + mkdir -p ./publish + 7za a ./publish/publish_rbac_01.zip ./Yi.RuoYi.Vue3/dist/*; + """ + echo '压缩包成功' + } + } + stage('publish') { + steps { + sshPublisher(publishers: [sshPublisherDesc(configName: 'ccnetcore', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/yi/rbac +echo 开始解压 +unzip -o /home/yi/build/publish_rbac_01.zip -d ./ +echo 替换完成''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'yi/build', remoteDirectorySDF: false, removePrefix: 'publish', sourceFiles: 'publish/publish_rbac_01.zip')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) + echo '发布成功' + } + } + } +} + +``` + +### 前端bbs脚本 +``` shell +pipeline { + agent any + + stages { + stage('git') { + steps { + git branch: 'abp', credentialsId: '38c9c74f-8658-4b8d-9ee7-d4c9923ef042', url: 'https://gitee.com/ccnetcore/Yi.git' + echo '仓库克隆成功' + } + } + stage('build') { + steps { + sh """ + cd Yi.Bbs.Vue3; + npm config set registry https://registry.npm.taobao.org; + npm install; + npm run build; + """ + echo '构建成功' + } + } + stage('zip') { + steps { + sh """ + mkdir -p ./publish + 7za a ./publish/publish_bbs_01.zip ./Yi.Bbs.Vue3/dist/*; + """ + echo '压缩包成功' + } + } + stage('publish') { + steps { + sshPublisher(publishers: [sshPublisherDesc(configName: 'ccnetcore', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /home/yi/bbs +echo 开始解压 +unzip -o /home/yi/build/publish_bbs_01.zip -d ./ +echo 替换完成''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'yi/build', remoteDirectorySDF: false, removePrefix: 'publish', sourceFiles: 'publish/publish_bbs_01.zip')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)]) + echo '发布成功' + } + } + } +} + +``` + +编写完成之后,可以逐步一下一下进行测试,看看哪里有问题再进行更改 + +> 以上脚本,都是一步一个脚印,一晚一行代码磨出来的,比较适合现在的场景,可推荐使用,坑比较少 + +## 进阶 +后续,你可以尝试`gitlab+jenkins+harbor+docker+k8s`的路线,这块橙子也是搭建过好几次,但需求点过于多,比较费劲,同时一般只有非常大型的项目才用的上,再次就不过多赘述了,想讲实战讲清楚,估计是当前篇幅至少10倍以上,里面的坑我之前pdf简单汇总了一次,大概就有23面以上,现在可能很有很多工具,安装应该没有那么简单了,不过我还暂时没有去接触的场景,如果你想像我一样,可以一起播撒这颗种子,让更多人的收获 + +## 结语 +可以看的出来,一个大家认为很简答的cicd,如果像从零开始一下一下搭建出来,坑还是蛮多的,爬出这些坑也是比较费事,并没有网上说的那么容易 + +本人这种环境搭建不下10次以上,也只是`无他,熟能生巧而已` + +> 搞的多了,也就麻了,水来土挡,坑来我填 + +最后,如果你这边怀着激动心情,讲上述的过程全部跑成功了,那么恭喜你啦~我亲爱的朋友,这篇文章教程就有它真正的意义了! +