doc:添加cicd文档模块

This commit is contained in:
橙子
2023-12-23 21:14:56 +08:00
parent 04fb38757c
commit 74cebb37a8
20 changed files with 430 additions and 2 deletions

View File

@@ -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)(已完成)
****
### 它的理念:

View File

@@ -1,3 +1,3 @@
#!/bin/bash
kill $(ps -aux | grep Yi.Abp.Web.dll | awk '{print $2}')
kill $(lsof -t -i:19001)
echo "Yi-进程已关闭"

View File

@@ -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,其中对于新人来说,有非常多的坑,由于操作系统版本、网络环境等各类因素,橙子都基本被坑过,同时并不是只搭建一次才总结出来的经验,而是这几年下来总结下来的坑。
橙子老哥的教程,不同于网络视角,绝对干货满满,希望能够帮助到大家,我们也就很开心了~

View File

@@ -0,0 +1,141 @@
## 环境大纲
我先把整个流程的大纲罗列以下,后续的章节会介绍每一个环境
操作系统Linuxcentos 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单独拿出篇幅下章进行教程

View File

@@ -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次以上也只是`无他,熟能生巧而已`
> 搞的多了,也就麻了,水来土挡,坑来我填
最后,如果你这边怀着激动心情,讲上述的过程全部跑成功了,那么恭喜你啦~我亲爱的朋友,这篇文章教程就有它真正的意义了!