基于华为CodeArts的前后端分离项目的云上持续交付与部署
利用华为CodeArts持续交付项目演示流程
软件开发生产线(CodeArts)是面向开发者提供的一站式云端平台,即开即用,随时随地在云端交付软件全生命周期,覆盖需求下发、代码提交、代码检查、代码编译、验证、部署、发布,打通软件交付的完整路径,提供软件研发流程的端到端支持。
1 准备工作
本文以开源项目若依(ruoyi-vue前后端分离版)(https://gitee.com/y_project/RuoYi-Vue)为例,简要记录将该项目在华为CodeArts上编译构建和部署的基本流程。
这里提前将项目ZIP包下载到本地,并解压到本地目录,如下图所示。
在下载的压缩包中,ruoyi-ui是基于Vue2的前端项目,可以删除,或者移到其它目录;其它ruoyi-开头的目录是后端项目,sql目录存放的是sql脚本文件。
若要使用Vue3的前端项目,可以在站点(https://gitee.com/ys-gitee/RuoYi-Vue3)下载,本文档使用Vue3,其目录内容如下:
整个项目的目录结构如下,前后端项目分别存放在不同的目录
2 购买CodeArts套餐



3 创建项目
在CodeArts控制台,点击右上角的“前往需求管理”。
在打开的页面中,可以看到如下图所示的项目管理页面。
点击“新建-->新建项目”
在打开的选择模板页面中,选择以“DevOps全流程示例项目”模板新建一个项目。
输入项目名称。
4 代码托管
在进行开发工作的过程中,可在CodeArts的代码仓库中,新建一个云端代码仓库,然后通过本地Git端将代码与云端托管仓库同步,通过本地IDE进行开发。
前期基本流程如下图所示:
4.1 安装Git Bash
Git Bash客户端软件是本地Windows PC使用Git必须安装的软件,可在Git的官网(https://git-scm.com/)下载安装包并执行安装程序。安装成功以后,在Windows开始菜单中会增加Git Bash选项,如下图所示。

4.2 配置git个人信息
安装完成,运行Git Bash,在弹出终端页面按照以下操作进行个人配置。
# Myname为你的git代码仓的用户名
git config --global user.name "MyName"
# my@email.com为你绑定到git代码仓的邮箱
git config --global user.email "my@email.com"
示例如下:
4.3 生成一对SSH密钥
在Git Bash终端中执行【ssh-keygen -t rsa -C "your SSH key comment"】命令,回车后会提示输入一个密码,建议一路回车即可,示例如下:
在~/.ssh文件夹(即“我的文档”下的.ssh文件夹)下生成一对RSA密钥,密钥注释内容为ruoyi-devcloud(可自定义,无需照抄)。
注:若“我的文档”路径或账号中存在中文,建议新建英文账号,并将密钥文件生成到默认目录下。在CMD下新建用户并将用户加入到管理员组的命令如下(用管理员身份执行CMD):
# 新建zhangsan用户名,密码为Mima1234$
net user zhangsan Mima1234$ /add
# 将zhangsan用户添加到管理员组
net localgroup administrators zhangsan /add
#后期如果不需要了,可以执行以下命令删除zhangsan用户
net user zhangsan /delete
新添加的账号在“开始”菜单中可以看到,直接点击该用户名就可以切换到该用户系统。
公钥为id_rsa.pub,私钥为id_rsa,私钥无须处理,保存在本机即可,公钥的内容需要复制到代码仓库中,用于远程连接时进行身份验证。
执行【cat id_rsa.pub】命令可以查看公钥内容,该内容后面会用到,这里可以先记录一下。
4.4 新建仓库
在CodeArts项目控制台,点击"代码-->代码托管"。
打开如下图所示页面,并点击“新建仓库”。
可直接新建空的仓库,也可以按模板新建仓库,或者导入外部仓库。
下面以新建空白仓库为例进行介绍。
如下图所示,选择“普通仓库”仓库类型,并单击“下一步”。
在如下所示页面中,填写仓库名称,不要勾选“允许生成README文件”,其它基本信息通常按默认设置即可。
最后单击确击,即可创建一个空白仓库。
同样的方法,再新建一个前端项目代码的空白仓库
最后的仓库列表如下:
创建好仓库后,在仓库首页的右上角,点击"克隆/下载"按钮,可以复制仓库地址,下载仓库内容,或前往设置SSH密钥。
4.5 添加SSH密钥
在仓库页面,依次单击右上角账号-->个人设置-->代码托管-->SSH密钥-->添加SSH密钥,粘贴前面查看到的公钥字符串,添加“标题”,单击“确定”按钮完成SSH密钥添加,如下图所示。
4.6 推送本地代码
4.6.1 推送后端项目代码
在Git Bash终端中进入后端项目D:\develop\cloudexp\RuoYi-backend,然后依次执行以下命令:
# 进入你的代码所在的目录,以下目录要换成你自己的目录
cd /d/develop/cloudexp/RuoYi-backend
# 初始化一个新的 Git 仓库,在当前目录创建 .git 子目录,包含所有必要的仓库文件
git init
# 列出当前配置的所有远程仓库及其 URL,-v 表示 verbose(详细模式)
git remote -v
# 删除名为 "origin" 的远程仓库配置,若确认远程没有origin,则可忽略此命令
git remote remove origin
# 添加一个新的远程仓库,命名为 "origin",仓库地址的获取方法在前面截图中有说明
git remote add origin "此处请替换成你的后端项目仓库地址"
# 将当前目录下的所有更改(包括新文件、修改的文件和删除的文件)添加到暂存区
git add --all
# 将暂存区的更改提交到本地仓库,-m 后面是提交信息,比如这里的 "The first ruoyi-backend commit"
git commit -m "The first ruoyi-backend commit"
# 将本地 master 分支的提交推送到远程 origin 仓库
git push -u origin master
成功执行上述命令后,刷新仓库,可以看到代码已成功推送到仓库,如下所示。
4.6.2 推送前端项目代码
在Git Bash终端中进入前端项目D:\develop\cloudexp\RuoYi-frontend,然后依次执行以下命令:
# 进入你的代码所在的目录,以下目录要换成你自己的目录
cd /d/develop/cloudexp/RuoYi-frontend
# 初始化一个新的 Git 仓库,在当前目录创建 .git 子目录,包含所有必要的仓库文件
git init
# 列出当前配置的所有远程仓库及其 URL,-v 表示 verbose(详细模式)
git remote -v
# 删除名为 "origin" 的远程仓库配置,若确认远程没有origin,则可忽略此命令
git remote remove origin
# 添加一个新的远程仓库,命名为 "origin",仓库地址的获取方法在前面截图中有说明
git remote add origin "此处请替换成你的前端项目仓库地址"
# 将当前目录下的所有更改(包括新文件、修改的文件和删除的文件)添加到暂存区
git add --all
# 将暂存区的更改提交到本地仓库,-m 后面是提交信息,比如这里的 "Initiatal commit frontend"
git commit -m "Initiatal commit frontend"
# 将本地 master 分支的提交推送到远程 origin 仓库
git push -u origin master
成功执行上述命令后,刷新仓库,可以看到代码已成功推送到仓库,如下所示。
最后的形成以下两个代码仓
4.6.3 多人协同开发
在项目开发过程中,若存在团队协作开发,则每个团队成员在开始工作之前,应该基于最新的master(或main)分支创建一个新的分支,并使用新分支而不是直接在master分支上工作,这有助于隔离每个人的工作,防止与他人的工作发生冲突,确保文件安全和版本控制。
(1)创建分支
执行以下命令,在master分支的基础上创建一个名为zhangsan的新分支。
# 进入你的代码所在的目录,以下目录要换成你自己的目录
cd /d/develop/cloudexp/RuoYi-backend
# 切换到名为 master 的分支(主分支)
git checkout master
# 从远程仓库拉取最新的代码变更(git fetch),并合并(git merge)到当前分支(master)
git pull
# 创建一个名为zhangsan的新分支,并立即切换到该分支。
git checkout -b zhangsan
在如下图所示的所在分支中可以看新的分支。
(2)编写代码
接下来就可以本地编写或修改源文件,完成自己的功能开发。比如新增一个文件file1。
(3)提交代码
在本地仓库中,需要定期提交自己的更改,每次提交都应该是一个完整的、独立的更改。
# 进入你的代码所在的目录,以下目录要换成你自己的目录
cd /d/develop/cloudexp/RuoYi-backend
# 添加所有更改到暂存区
git add .
# 提交更改
git commit -m "这里填写你想让大家知道的信息摘要"
(4)推送更改到远程仓库
为了让其他人可以看到你的更改,需要将你的分支(zhangsan)推送到远程仓库(origin),并请求其他成员评价和反馈修改意见,git命令命令如下:
# 将暂存区内的更改推送到zhangsan分支
git push -u origin zhangsan
此时在仓库的zhangsan分支下可以看到新推送上来的文件,但master分支中没有任何改变,有效保证了master分支的安全性。
(5)创建合并请求
为允许团队成员审查你的代码更改,并提出反馈或建议的更改,还需要在新的分支中创建一个合并请求(也称拉取请求(Pull Request))
在新的分支中,点击右上角的“新建合并请求”。
设置源分支与目标分支
填写标题,然后点击最下方的“新建合并请求”按钮,完成合并请求操作。
(6)审查和讨论
新建合并请求后,其他团队成员就可以查看和审查你的代码更改,并提出评论或请求更改,如下图所示。
(7)提交更改
当成员提出需要修改的反馈和评价后,你需要根据这些反馈更新你的代码,然后再次提交更改,命令如下:
# 将所有更新添加到暂存区
git add .
# 修改最后一次提交信息
git commit --amend -m "此处填写你想让大家看到的提交信息摘要"
# 强制推送更新到远程仓库
git push --force-with-lease origin zhangsan
(8)合并代码
一旦你更新的代码通过了审查并被批准,项目的维护者就会合并你的分支到master分支。
项目维护者可以在代码托管平台的界面上完成合并操作,如下图所示。
(9)更新本地仓库
合并代码后,为确保本地master分支是最新的,应更新本地仓库,git命令如下:
# 切换到名为 master 分支(主分支)
git checkout master
# 拉取最新文件
git pull
(10)清除分支(可选)
本地仓库更新后,可以删除不再需要的本地和远程新分支,git命令如下:
# # 删除本地分支(如果已合并)
git branch -d zhangsan
# 删除远程分支(如果已合并)
git push origin --delete zhangsan
最后简要说明一下分支与fork的区别:
- Fork创建的是一个完全独立的仓库副本,与原始仓库完全独立;而分支是在当前仓库内创建的一个独立的开发线,仍然属于同一个仓库
- Fork适用于希望在原项目的基础上进行独立开发或贡献开源项目;而分支适用于在当前仓库上进行独立的开发工作,不影响主分支的代码
4.7 代码检查
代码检查功能可以对代码进行静态检查,包括是否有简单编码问题,圈复杂度等。每个问题会有对应的级别。
在CodeArts项目控制台,依次点击"代码检查-->新建任务"
在如下所示的新建任务页面,选择刚刚新建的仓库,然后单击下方的“新建任务”按钮。
点击“确定并执行”立即运行代码检查,也可以点击"确定",在接下来的页面中设置质量门禁、执行计划、规则集等内容。以便按自定义的规则和要求定时自动运行代码检查任务。
检查完成后,会给出检查报告,如下所示
若检查不通过,可在“代码问题”中查看详情报告。
注:对本项目而言,此处错误暂不理会。对于企业真实项目的发布级代码,不允许存在任何静态检查问题。
同样的操作,可对后端项目代码进行代码检查,此处过程从略。
后端项目的代码检查会不通过,可以不用理会,或者为它设置质量门禁放行。
最后的代码检查任务列表如下所示。
5 编译构建
这步是从刚才创建的代码仓库中拉取代码,然后执行编译构建命令,对于后端项目,输出的则是一个个可执行的jar包或war包;而前端项目则为dist目录及其内容。
5.1 编译构建后端目项目
后端项目编译构建一般使用spring-boot-maven-plugin和maven-assembly-plugin两种方式。
使用spring-boot-maven-plugin方式打包时会将该项目中所有依赖的包(包括静态文件)统一打包至一个jar包中,执行的时候直接执行 java -jar ${jarname}.jar,这种最简单,但是打出来的包会比较大且无法修改配置。
使用 maven-assembly-plugin方式一般打包完成后,会有一个完整的项目结构,里面通常包含有以下内容以及其它各种需求的脚本:
- bin: 放项目脚本,包括打包部署等
- conf:存放配置文件
- docs:说明文档
- lib:依赖的jar包
企业一般采用maven-assembly-plugin方式。
本文档采用较简单的spring-boot-maven-plugin方式。
5.1.1 新建编译构建任务
在CodeArts项目控制台,依次点击左侧的“持续交付-->编译构建”。
然后新建一个构建任务,在如下图所示任务基本信息中,填写任务名称,选择归属项目和前面创建的仓库,然后进入下一步。
选择用Maven模板进行构建。
在构建步骤中,选择构建环境主机类型,这里选择x86服务器。
在“代码下载配置”中,直接采用默认即可。
在构建步骤的“Maven构建”环节中,按需求选择工具版本、编辑打包命令以及其它参数配置。Ruoyi官网说明要求使用至少jdk8以上版,这里选择jdk11,缓存配置设置为不使用缓存,否则可能会出现下载的jar包不完整。其它配置和命令按默认即可。
在“上传软件包到软件发布库”中,确认构建包路径,这里直接采用默认即可。
5.1.2 执行后端项目构建任务
完成上述工作后,直接单击右上角的“保存并执行构建”按钮,单击“确定”
开始自动编译构建,如下图所示
5.1.3 查看输出
成功编译构建后,依次单击“制品仓库”-->”软件发布库“可以查看到生成的jar包,如下所示。
5.2 编译构建前端项目
5.2.1 新建编译构建任务
与后端项目构建任务相似,主要步骤如下。
然后新建一个构建任务,在如下图所示任务基本信息中,填写任务名称,选择归属项目和前面创建的仓库,然后进入下一步。
选择用npm模板进行构建。
在构建步骤中,选择构建环境主机类型,这里选择x86服务器。
在“代码下载配置”环节中,保留默认配置。
在使用“Npm构建”前端项目时,因前端项目中的package.json中标明构建脚本为build:prod或者build:stage,故npm构建命令应对应调整。
npm构建配置如下图所示,工具版本选择Nodejs18以上。
npm构建命令参考如下
export PATH=$PATH:~/.npm-global/bin
#设置缓存目录
npm config set cache /npmcache
npm config set prefix '~/.npm-global'
# 禁用安全审计
npm config set audit false
# 设置使用华为npm 镜像以提高下载速度
npm config set registry https://repo.huaweicloud.com/repository/npm/
#加载依赖
npm install --verbose
#默认构建
npm run build:prod
前端项目构建成功后,会生成一个dist目录,其目录结构如下,其中包括了一个assets子目录。
而华为云CodeArts不支持上传文件夹至软件发布库,如下图所示。
故在“上传软件包到软件发布库”之前,需要增加一个过程,将dist目录打成一个包。
点击“上传软件包到软件发布库”上方的加号,增加一个过程,选择“执行shell命令”
设置过程名称,并填写打包命令【tar -czf ./dist.tar.gz dist/**】
在“上传软件包到软件发布库”过程中,将“构建包路径”的值指定为“./dist.tar.gz”。
5.2.2 执行前端项目构建任务
完成上述工作后,直接单击右上角的“保存并执行构建”按钮,在弹出的对话框中单击“确定”按钮,开始自动编译构建,稍候片刻,成功完成编译,如下图所示。
5.2.3 查看输出
成功编译构建后,依次单击“制品仓库”-->”软件发布库“可以查看到dist.tar.gz包,如下所示。
6 购买并配置云服务器
接下来就要将构建输出的jar包部署到服务器中,下面以部署在华为云弹性服务器为例,下面简要介绍在华为公有云上购买弹性云服务器。
6.1 购买弹性云服务器
访问华为云官网(https://www.huaweicloud.com/product/ecs.html),(自定义购买-->按需计费)购买一台弹性云服务器ECS。这里过程从略,只给出几个关键截图。
点击“立即购买”按钮后,稍等片刻,在弹性云服务器列表中可以看到申请到的ECS。请记录好其中的主机名或主机ID,弹性IP地址,后面需要用到。
6.2 配置安全组
在”云服务器控制台“,点击”网络与安全“下的“安全组”,可看到一个名为default的安全组。
点击default安全组右侧的”配置规则“,可看到该安全组默认已开放了22和3389两个远程连接端口。
本项目还需要放通80、3306、6379和8080端口,在“入方向规则”下,点击“快速添加规则”,添加放行这些端口的规则,如下图所示。
最后放行的端口列表如下。
7 安装并配置数据库
在部署前需要创建和设置好数据库,可以直接在ECS服务器上安装并配置数据库,也可以购买云数据库。
7.1 编辑数据库连接信息
7.1.1 编辑数据库连接信息
若使用云数据库,或者Web服务器与数据库服务器进行分离部署时,以及其它自定义的数据库连接方式,则在构建编译前还要修改后端项目中ruoyi-admin\src\main\resources目录下的application-druid.yml文件,指定数据库服务器地址、端口、数据库名称,以及连接账号和密码,主要配置内容如下所示。
7.1.2 编辑Redis连接信息
Redis服务连接配置信息位于ruoyi-admin\src\main\resources目录下的application.yml文件中,在其中需要指定Redis服务所在主机EIP、端口和连接密码。(注意password:后面有一个空格)
注:若有修改上述配置文件,则需要回到5.2.2重新执行后端项目构建任务,如下图所示。
7.2 安装MariaDB数据库
7.2.1 远程连接ECS
利用XShell远程连接ECS服务器,如下所示的IP地址为ECS的EIP地址,登录账号root,密码为前面购买ECS时设置的root密码。
7.2.2 安装并启动数据库服务
成功连接ECS后,可在ECS中安装mariadb软件包,并启动服务,如下所示。
[root@ecs-dc3b-1692 ~]# dnf -y install mariadb-server mariadb
……此处省略安装过程输出信息……
# 启动mariadb服务
[root@ecs-dc3b-1692 ~]# systemctl start mariadb
# 设置开机自启动
[root@ecs-dc3b-1692 ~]# systemctl enable mariadb
7.3 数据库安全增强
执行mysql_secure_installation 命令增强数据库安全。
注:Ruoyi-vue数据库连接密码默认指定为password(ruoyi-admin目录下的application-druid.yml文件中可以查看或修改,建议编译构建前修改,否则要重新编译构建),下面的新密码要求与application-druid.yml配置文件中的密码一致。
[root@ecs-dc3b-1692 ~]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): #此处直接回车
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n #此处按n
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Set root password? [Y/n] y #此处按y键设置新密码,要求与前面指定的连接密码相同
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y #此处按y删除匿名用户
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n #此处按n键,允许root远程连接数据库
... skipping.
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y #此处按y键,删除测试数据库及其访问权限
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y #此处按y键,重载权限表
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
7.4 连接数据库
7.4.1 新建连接
打开Navicat(这里使用Navicat Premium 15),新建一个MariaDB连接,如下图所示。
填写连接名(可自定义)、ECS服务器IP地址(EIP)、端口号3306(要求与application-druid.yml文件中的一致)和登录账号/密码(要求与application-druid.yml文件中的一致)
7.4.2 连接数据库
点击左下角的“测试连接”,开始连接测试,会出现如下1130的错误。
出现1130错误是远程主机被禁止连接,虽然在初始化时允许root用户远程登录,但是仍需要解除IP地址的限制。具体操作过程如下:
(1)登录数据库
[root@ecs-dc3b-1692 ~]# mysql -u root -p
Enter password: #此处输入前面设置的密码
……此处省略其它输出信息……
MariaDB [mysql]>
(2)查看数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
(3)更改当前数据库
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
(4)查看数据库表
MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows in set (0.00 sec)
(5)查找user表
MariaDB [mysql]> select host,user from user;
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| ::1 | root |
| ecs-3dbc | root |
| localhost | root |
+-----------+------+
4 rows in set (0.00 sec)
从上面的输出可以看到root用户当前只允许在localhost、127.0.0.1等本地主机连接。
可以将localhost更改为%,也可以再添加一个root,其host为%,以允许在任意主机上远程连接。
下面以添加一个新的root,密码为前面自己设置的密码(这里以password为例),并允许在任意主机上远程连接。
(6)新建一个root用户
这里新建一个root用户,并允许它在任何主机远程连接数据库。其中的%表示允许在任意主机远程连接数据库。这里示例为密码为password,要求使用application-druid.yml文件中设定的密码替换掉。
# 创建一个用户,并指定密码(这里示例为password,以下的password要用自己的密码替换掉)
MariaDB [mysql]> create user 'root'@'%' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
# 授予root用户权限
MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
(7)刷新权限表并退出数据库连接
MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> select user,host from user;
+------+-----------+
| user | host |
+------+-----------+
| root | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | ecs-7d14 |
| root | localhost |
+------+-----------+
5 rows in set (0.00 sec)
MariaDB [mysql]> exit
Bye
(8)再次测试连接,可以成功连接了,如下图所示。
7.5 创建数据库
7.5.1 创建数据库
打开数据库连接,右键该连接,选择“新建数据库”。
填写数据库名(要求与application-druid.yml文件中的保持相同,这里以ruoyi-vue作为示例),指定字符集为utf8mb4和排序规则utf8mb4_unicode_ci。
7.5.2 导入sql文件
在后端项目的sql目录中,可以看到如下两个sql文件。
在Navicat中,右键刚才新建的ruoyi-vue数据库,选择“运行SQL文件”,分别导入运行这两个SQL文件。
浏览选择SQL文件
点击“开始”运行导入的SQL文件。
同样的操作,导入并运行另一个SQL脚本文件。
全部成功运行后,刷新ruoyi-vue数据库下的表,就可以看到该库中的数据表了(30或31个表)。
8 安装与配置Redis
8.1 安装Redis
在ECS服务器上,执行以下命令安装Redis
[root@ecs-dc3b-1692 ~]# dnf -y install redis
……安装过程省略……
8.2 配置Redis服务
这里只需要指定Redis连接密码和绑定主机,要求连接密码与application.yml中配置的一样。
[root@ecs-dc3b-1692 ~]# vim /etc/redis.conf
……在底线命令模式下,执行set nu命令显示行号……
绑定主机到0.0.0.0,以允许任意主机连接。
8.3 启动Redis服务
执行以下命令启动Redis服务,并设置为开机自启动。
# 启动mariadb服务
[root@ecs-dc3b-1692 ~]# systemctl start redis
# 设置开机自启动
[root@ecs-dc3b-1692 ~]# systemctl enable redis
8.4 测试连接
下载并安装RedisDesktopManager客户端工具,对Redis服务进行测试连接
测试连接是否成功
9 部署项目
9.1 部署后端项目
spring-boot-maven-plugin 构建完之后会生成一个可执行的jar包,部署任务就是把jar包上传到服务器上面并且执行部署脚本运行。这里就需要利用前面购买的ECS和服务配置环境并部署上线项目。
9.1.1 新建主机集群
在CodeArts项目控制台,依次点击左侧的设置-->通用设置-->基础资源管理-->新建主机集群
在新建主机集群基本信息中,填写集群名称,选择主机OS类型为Linux,如下所示。
在新建主机集群的目标主机中,点击“添加或导入目标主机”
在如下所示的新增目标主机页面,填写前面记录的ECS主机名或主机ID、弹性IP地址、登录账号和SSH连接端口。
将ECS的相关信息填写到对应位置后,添加成功后的目标主机信息如下所示。
要求连通性验证能成功。
9.1.2 新建部署应用
在CodeArts项目控制台,依次点击左侧的持续交付-->部署-->新建应用。
填写应用名称,单击“下一步”
选择使用“SpringBoot应用部署”模板进行部署
在部署步骤中的安装JDK环节,设置jdk版本,这里选择与前面构建任务时相同的版本jdk11。其它保持默认即可。
在部署步骤中的部署来源环节,设置源类型和部署目录等。这里源类型选择为“构建任务”,并选择前面新建的构建任务名称,部署目录可自定义,这里以/usr/local/ruoyi-vue为例。
在部署步骤中的“停止SpringBoot服务”和“启动SpringBoot服务”环节,设置好包的绝对路径。其它保持默认即可。
因为在部署来源环节已将包下载到/usr/local/ruoyi-vue目录,因此包的绝对路径就是/usr/local/ruoyi-vue/${package_name}.jar。
在部署步骤中的“URL健康测试”环节,保持默认即可。
最后单击右上角的“保存”按钮。
9.1.3 新建环境
在部署任务的“环境管理”中,新建一个部署环境。
设置新环境基本信息,包括环镜名称、主机和OS类型,这里的OS指定为Linux。
保存基本信息,然后在新环境的资源列表中,导入前面新建的主机集群。
导入成功后的新建环境资源列表如下。
最后环境列表如下
9.1.4 设置参数
在部署任务的参数设置中,因包的来源为构建任务,不存在下载URL,故可删除package_url参数。
同时将host_group、端口(后端服务端口默认为8080)和package_name(后端服务包名默认为ruoyi-admin)指定为该项目默认的值。
9.1.5 保存并执行部署
完成上述操作后,单击右上角的”保存并部署“按钮。
点击确定,开始部署,过程如下所示。
稍等片刻后,可以看到成功部署完成,如下图所示。
此时,可测试访问后端项目(http://弹性IP地址:8080),如下图所示。
到此,后端项目就部署成功了。
9.2 部署前端项目
因9.1.1已经建好了主机集群,这里就可以直接使用该集群部署前端项目了。
9.2.1 新建部署应用
在CodeArts项目控制台,依次点击左侧的持续交付-->部署-->新建应用。
填写应用名称,单击“下一步”
因前端为Vue3版本,故这里选择用“Vue应用部署”模板进行部署
在部署步骤中的安装/停止nginx环节,可选择默认的配置参数。
在下载软件包之前,为避免软件包重名产生的问题,可增加一个过程,将旧的软件包删除。点击“下载软件包”上方的加号,增加一个执行Shell命令的步骤。
编辑Shell命令步骤,包括步骤名称和要执行的Shell命令
增加的Shell命令如下:
if [ -d dist ]
then
rm -rf dist
fi
if [ -f dist.tar.gz ]
then
rm -f dist.tar.gz
fi
在下载软件包环节,按图示设置构建任务和部署目录等。
在“解压软件包”过程中,保持默认配置即可。
在“启动nginx”环境,nginx配置文件所在位置保持默认即可。
在nginx.conf配置文件中,特别要注意的是站点根目录和反向代理的设置。
站点根目录是dist目录所在位置,故应指定为${package_path}/dist
配置反向代理块时,API接口名称可从前端项目的.env.production文件中看到,如下图所示。
因前后端均部署在同一台ECS服务器上,故代理的后端服务器名称可直接使用localhost,否则需要指定后端服务器的EIP或主机名。
nginx配置文件内容可参考配置成如下:
# 请输入您的nginx配置文件内容,以下为示例配置
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen ${service_port};
server_name localhost;
root ${package_path}/dist;
index /index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
在“服务启动测试”环节,采用默认配置即可。
最后单击右上角的“保存”按钮。
9.2.2 新建环境
在部署任务的“环境管理”中,与9.1.3节相同的方法新建一个环境,如下图所示。
接下来导入主机,如下图所示。
最后新建的环境列表如下图所示。
9.2.3 设置参数
在部署任务的参数设置中,可参照下图设置,删除package_url。host_group指定为9.2.2中新建的环境、前端项目端口默认为80,package_path这里设置成与构建任务时的一样(/usr/local/ruoyi-vue),package_name为构建任务时输出的包名(即dist.tar.gz)。
9.2.4 保存并执行部署
完成上述操作后,单击右上角的”保存并部署“按钮。
开始部署,稍等片刻后,可以看到成功部署完成,如下图所示。
注:第一次部署时,在停止nginx时可能会出现如下错误:
原因说明:这是因为首次部署时,nginx服务首次启动前还没有生成这个nginx.pid文件,而停止nginx服务时需要用到该文件,故而提示该文件不存在。当nginx服务启动后就会自动生成该文件,故重新再部署一次即可。
此时,可测试访问项目首页(http://弹性IP地址),如下图所示。
可以正常登录
10 构建流水线
流水线就是将前面的各种任务组合起来,然后就可以手动或定时自动化操作前面的所有代码检查、编译构建和部署了。
10.1 前端项目流水线
10.1.1 新建流水线
在CodeArts控制台,依次点击“流水线”-->”新建流水线”。
填写流水线基本信息,包括名称和代码仓等。
在选择模板页面,选择Node.js模板构建前端项目。
单击“确定”完成流水线的创建。
10.1.2 编排前端流水线任务
按照流程,应先对前端项目代码进行检查,通过后就可以进行构建编译,最后完成前端项目的部署。依此思路,操作过程如下:
(1)新建阶段
点击新建阶段,新建一个阶段,如下图所示。
新建阶段后,就可以为新的阶段新建任务了。
(2)调整任务顺序
构建与代码检查并行执行不太合理,这里将构建放到代码检查完成之后。
将“构建”任务拖到“新建任务”框中,形成一个新的任务,如下所示。
(3)编辑代码检查任务
点击“代码检查”任务,对该任务进行编辑,包括名称、调度的任务和检查模式等。
(4)编辑构建任务
点击“构建”任务,对该任务进行编辑,包括名称、调度的任务和代码仓库。
(5)新增部署任务
新增一个阶段,并新建一个空任务
将该新任务配置为部署
编辑前端部署任务,包括其名称、要调度的任务和主要参数。
10.1.3 保存并执行
点击右上角的“保存并执行”按钮。
确认无误后,点击“执行” 按钮,开始按流水线方式自动完成代码检查、编译构建和项目部署。
稍等片刻后,可看到成功完成。
10.2 后端项目流水线
10.2.1 新建后端流水线
同样方法,在CodeArts控制台,依次点击“流水线”-->”新建流水线”。
填写流水线基本信息,包括名称和代码仓等。
选择使用Maven模块构建后端项目。
最后,单击“确定”按钮,完成后端流水线的创建过程。
10.2.2 编排后端流水线任务
同样的道理,按照流程,应先对后端项目代码进行检查,然后构建编译,最后进行部署。依此思路,操作过程如下:
(1)新建阶段
点击“新建阶段”,新建一个阶段,如下图所示。
(2)调整任务顺序
代码检查与构建并发执行不太合理,这里将构建任务拖到代码检查之后的阶段,形成如下所示的顺序。
(3)编辑代码检查任务
点击“代码检查”任务,对该任务进行编辑,包括名称、调度的任务和检查模式。
(4)编辑构建任务
点击“构建”任务,对该任务进行编辑,包括名称、调度的任务和代码仓库。
(5)新增部署任务
新建一个阶段,并新增一个空任务。
将该空任务配置为部署。
编辑后端部署任务,包括其名称、要调度的任务和主要参数。
10.2.3 保存并执行
点击右上角的“保存并执行”按钮。
确认无误后,点击“执行” ,开始按流水线方式自动完成代码检查、编译构建和项目部署。
稍等片刻后,可看到成功完成。
完成上述工作后,最后形成的流水线列表如下所示。
10.3 流水线执行计划
流水线还可以设置执行计划,当某个事件产生时就自动执行,也可以创建定时计划任务。
10.3.1 流水线触发事件
当源代码仓库出现某个事件时就可以触发执行流水线,常见的仓库触发事件如下所示。
10.3.2 流水线定时任务
也可以设置计划任务,让流水线在指定的时间自动执行,点击上图中的“创建定时任务”可设置和开启一个定时任务。
11 小结
完成上述操作后,就可以在本地进行前后端项目开发,并每时每刻将修改后的代码推送到相应的git仓库,然后执行相应的流水线,就可以自动完成项目的持续交付与集成部署(CI/CD)了,非常便利和自动化。
实验结束后,删除ECS时的注意事项如下图所示。
12 可能存在的问题与解决方案
12.1 问题1
在部署后端时,有极少数同学出现如下问题:
11:07:28.479 [Druid-ConnectionPool-Create-1119371910] ERROR c.a.d.p.DruidDataSource - [run,2916] - create connection SQLException, url: jdbc:mysql://xxx.xxx.xx.xxx:3306/ruoyi-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8, errorCode 1045, state 28000
java.sql.SQLException: Access denied for user 'root'@'ruoyi-vue-mysql' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:446)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:132)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:244)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:126)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1687)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1803)
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2914)
可能的原因应该是7.4节中连接数据库时有命令未成功完成。
解决方案:
参照7.4节,在mysql数据库中执行以下命令即可:
# 创建用户
CREATE USER 'root'@'ruoyi-vue-mysql' IDENTIFIED BY '你的数据库连接密码';
# 授予权限
GRANT ALL PRIVILEGES ON `ruoyi-vue`.* TO 'root'@'ruoyi-vue-mysql';
# 刷新权限
FLUSH PRIVILEGES;
更多推荐
所有评论(0)