project - 2

项目环境准备

环境准备说明:

本阶段共使用虚拟机6台,操作系统使用RockyLinux8.6

环境准备要求:
  • 最小化安装即可
  • 配置好主机名和IP地址
  • 搭建好yum源
  • 关闭防火墙和SELinux!!!
项目主机列表
主机名 IP地址 规格 角色 服务
Programer 192.168.88.10/24 1vCPUs+1GiB+20G 程序员主机 Git
GitLab 192.168.88.20/24 2vCPUs+4GiB+20G 内部代码托管平台 GitLab
Jenkins 192.168.88.30/24 2vCPUs+2GiB+20G 持续集成工具 Jenkins
Services 192.168.88.50/24 2vCPUs+4GiB+20G 应用服务器 RabbitMQ MySQL Elasticsearch Redis
Backend 192.168.88.60/24 2vCPUs+2GiB+20G 后端服务器 HIS后端jar包
Fontend 192.168.88.70/24 1vCPUs+1GiB+20G 前端服务器 Nginx

Git安装

Programer主机安装Git

#安装中文支持(选做)

root@Programer \~# echo $LANG #查看当前系统语言及编码

en_US.UTF-8

root@Programer \~# yum -y install langpacks-zh_CN.noarch #安装中文支持

root@Programer \~# vim /etc/locale.conf #配置系统使用中文及编码

LANG="zh_CN.UTF-8"

root@Programer \~# reboot #重启使语言配置生效

root@Programer \~# echo $LANG #确认使用中文编码

zh_CN.UTF-8

root@Programer \~#

#yum源中集成了Git软件包,使用yum安装Git

root@Programer \~# yum clean all; yum repolist -v #插件yum源是否可用

...

Total packages: 8,265

root@Programer \~# yum -y install git #使用yum安装Git

...

Complete!

root@Programer \~#git --version #查看Git版本

git version 2.31.1

root@Programer \~# git --help #查看Git命令帮助信息

Git版本库操作

Git工作流程
Git基础配置
  • Git基础配置

--local: 仓库级(仓库目录下.git/config)

--global: 全局级(~/.gitconfig)

--system: 系统级(/etc/gitconfig)

root@Programer \~# git config --global user.name mark #设置用户名

root@Programer \~#git config --global user.email mark@tedu.cn #设置用户邮箱

root@Programer \~# git config --global init.defaultBranch master #设置版本库默认分支

root@Programer \~#git config --list #查看已有Git配置

user.name=mark

user.email=mark@tedu.cn

init.defaultbranch=master

root@Programer \~# cat ~/.gitconfig #查看Git配置持久化文件

user

name = mark

email = mark@tedu.cn

init

defaultBranch = master

root@Programer \~#

Git创建版本库
  • Git初始化空版本库

#使用Git命令初始化空版本库

root@Programer \~# ls

root@Programer \~# git init myproject #初始化空版本库

已初始化空的 Git 仓库于 /root/myproject/.git/

root@Programer \~# ls #确认版本库已创建

myproject

root@Programer \~# ls -a myproject/

. .. .git

root@Programer \~# ls -a myproject/.git/

. .. branches config description HEAD hooks info objects refs

root@Programer \~#

  • 将已有目录制作成版本库

#将已有目录制作成Git版本库

root@Programer \~# mkdir mytest #创建空目录

root@Programer \~# ls -a mytest/

. ..

root@Programer \~# cd mytest/

root@Programer mytest# git init #将已有目录制作成Git版本库

已初始化空的 Git 仓库于 /root/mytest/.git/

root@Programer mytest# ls -a

. .. .git

root@Programer mytest# ls -a .git/

. .. branches config description HEAD hooks info objects refs

root@Programer mytest# cd

root@Programer \~#

Git版本库操作

#熟悉Git基础命令使用

root@Programer \~# cd myproject/

root@Programer myproject# git status #查看Git本地仓库状态

位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

root@Programer myproject#echo "Learning Git" >> readme.md #创建readme文件

root@Programer myproject# git status #查看Git本地仓库状态

位于分支 master

尚无提交

未跟踪的文件:

(使用 "git add <文件>..." 以包含要提交的内容)

readme.md

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

root@Programer myproject# git add readme.md #将文件信息添加到暂存区

root@Programer myproject#git status #查看Git本地仓库状态

位于分支 master

尚无提交

要提交的变更:

(使用 "git rm --cached <文件>..." 以取消暂存)

新文件: readme.md

root@Programer myproject# git commit -m "add readme" #将暂存区文件提交到本地仓库

master(根提交) 09d8603 add readme

1 file changed, 1 insertion(+)

create mode 100644 readme.md

root@Programer myproject# git status

位于分支 master

无文件要提交,干净的工作区

root@Programer myproject#

Git版本库查询

#查看本地Git版本库信息

root@Programer myproject# git log #本地版本库提交记录(详细)

commit 09d8603547b7f7c6cf5b2850dd241d4b8b799b74 (HEAD -> master)

Author: mark <mark@tedu.cn>

Date: Wed Feb 22 15:00:46 2023 +0800

add readme

root@Programer myproject# git log --pretty=oneline #本地版本库提交记录(简略)

09d8603547b7f7c6cf5b2850dd241d4b8b799b74 (HEAD -> master) add readme

root@Programer myproject#git log --oneline #本地版本库提交记录(极简)

09d8603 (HEAD -> master) add readme

root@Programer myproject#

Git练习(生成多个版本)

#数量掌握Git本地版本库操作

root@Programer \~# cd myproject/

root@Programer myproject# echo 123 > test.txt #新建test.txt文件

root@Programer myproject#git add test.txt #将test.txt添加到暂存区

root@Programer myproject# git commit -m "add test.txt" #生成新版本

master 27466f7 add test.txt

1 file changed, 1 insertion(+)

create mode 100644 test.txt

root@Programer myproject# echo 456 > test.txt #修改test.txt文件

root@Programer myproject# git add . #将修改文件添加到暂存区

root@Programer myproject# git commit -m "modify test.txt" #生成新版本

master 58cdf79 modify test.txt

1 file changed, 1 insertion(+), 1 deletion(-)

root@Programer myproject# echo 789 > test.txt #修改test.txt文件

root@Programer myproject# git add ./ #将修改文件添加到暂存区

root@Programer myproject# git commit -m "done test.txt" #生成新版本

master 0f44bf0 done test.txt

1 file changed, 1 insertion(+), 1 deletion(-)

root@Programer myproject# git log --pretty=oneline #查看本地提交记录(简略)

0f44bf04834eac643a0d56901039cec73128d3cc (HEAD -> master) done test.txt

58cdf7905a95a956fc65da264aab827fc7290dbf modify test.txt

27466f79df8e0cbfd3f8f2349143e054db8ac693 add test.txt

09d8603547b7f7c6cf5b2850dd241d4b8b799b74 add readme

root@Programer myproject# git log --oneline #查看本地提交记录(极简)

0f44bf0 (HEAD -> master) done test.txt

58cdf79 modify test.txt

27466f7 add test.txt

09d8603 add readme

root@Programer myproject#

Git指针操作

查看Git指针信息

#使用git log命令查看HEAD指针

root@Programer \~# cd myproject/

root@Programer myproject# git log --pretty=oneline #查看Git指针

0f44bf04834eac643a0d56901039cec73128d3cc (HEAD -> master) done test.txt

58cdf7905a95a956fc65da264aab827fc7290dbf modify test.txt

27466f79df8e0cbfd3f8f2349143e054db8ac693 add test.txt

09d8603547b7f7c6cf5b2850dd241d4b8b799b74 add readme

root@Programer myproject# cat test.txt #查看文件内容

789

root@Programer myproject#

利用指针实现Git版本还原

#reset子命令用于版本还原

root@Programer myproject#git reset --hard 58cdf7905a #还原到指定版本

HEAD 现在位于 58cdf79 modify test.txt

root@Programer myproject# git log --oneline #确认HEAD指针移动

58cdf79 (HEAD -> master) modify test.txt

27466f7 add test.txt

09d8603 add readme

root@Programer myproject# cat test.txt #查看文件内容

456

root@Programer myproject#

#reflog子命令用于获取HEAD指针移动轨迹

root@Programer myproject#git reflog

58cdf79 (HEAD -> master) HEAD@{0}: reset: moving to 58cdf79

0f44bf0 HEAD@{1}: commit: done test.txt

58cdf79 (HEAD -> master) HEAD@{2}: commit: modify test.txt

27466f7 HEAD@{3}: commit: add test.txt

09d8603 HEAD@{4}: commit (initial): add readme

root@Programer myproject#git reset --hard 0f44bf0

HEAD 现在位于 0f44bf0 done test.txt

root@Programer myproject# git log --oneline

0f44bf0 (HEAD -> master) done test.txt

58cdf79 modify test.txt

27466f7 add test.txt

09d8603 add readme

root@Programer myproject# git reflog

0f44bf0 (HEAD -> master) HEAD@{0}: reset: moving to 0f44bf0

58cdf79 HEAD@{1}: reset: moving to 58cdf79

0f44bf0 (HEAD -> master) HEAD@{2}: commit: done test.txt

58cdf79 HEAD@{3}: commit: modify test.txt

27466f7 HEAD@{4}: commit: add test.txt

09d8603 HEAD@{5}: commit (initial): add readme

root@Programer myproject# cat test.txt

789

Git分支操作

Git分支管理

#查看当前分支信息,branch子命令

root@Programer \~# cd myproject/

root@Programer myproject# git status #查看本地Git仓库信息

位于分支 master

无文件要提交,干净的工作区

root@Programer myproject#git branch -v #查看分支信息

* master 0f44bf0 done test.txt

root@Programer myproject#

#创建分支

root@Programer myproject# git branch hotfix #创建hotfix分支

root@Programer myproject# git branch feature #创建feature分支

root@Programer myproject# git branch -v #查看分支信息

feature 0f44bf0 done test.txt

hotfix 0f44bf0 done test.txt

* master 0f44bf0 done test.txt

root@Programer myproject#

#切换分支,checkout子命令

root@Programer myproject# git branch -v #查看分支信息

feature 0f44bf0 done test.txt

hotfix 0f44bf0 done test.txt

* master 0f44bf0 done test.txt

root@Programer myproject# git checkout hotfix #切换分支

切换到分支 'hotfix'

root@Programer myproject# git branch -v #查看分支信息

feature 0f44bf0 done test.txt

* hotfix 0f44bf0 done test.txt

master 0f44bf0 done test.txt

root@Programer myproject#git checkout feature #切换分支

切换到分支 'feature'

root@Programer myproject#git branch -v #查看分支信息

* feature 0f44bf0 done test.txt

hotfix 0f44bf0 done test.txt

master 0f44bf0 done test.txt

root@Programer myproject#

#删除分支

root@Programer myproject# git branch develop #创建develop分支

root@Programer myproject#git branch -v

develop 0f44bf0 done test.txt

* feature 0f44bf0 done test.txt

hotfix 0f44bf0 done test.txt

master 0f44bf0 done test.txt

root@Programer myproject# git branch -d develop #删除develop分支

已删除分支 develop(曾为 0f44bf0)。

root@Programer myproject#

Git合并分支

#无冲突分支合并

root@Programer \~# cd myproject/

root@Programer myproject#git checkout hotfix #切换到hotfix分支

切换到分支 'hotfix'

root@Programer myproject#echo haha > haha.txt #创建haha文件

root@Programer myproject# git add ./ #添加haha到暂存区

root@Programer myproject#git commit -m "add haha.txt" #生成新版本

hotfix 108cf46 add haha.txt

1 file changed, 1 insertion(+)

create mode 100644 haha.txt

root@Programer myproject# ls

haha.txt readme.md test.txt

root@Programer myproject# cat haha.txt

haha

root@Programer myproject# git checkout master #切换到master分支

切换到分支 'master'

root@Programer myproject# echo xixi > xixi.txt #创建xixi文件

root@Programer myproject# git add ./ #添加xixi到暂存区

root@Programer myproject# git commit -m "add xixi.txt" #生成新版本

master 32f0842 add xixi.txt

1 file changed, 1 insertion(+)

create mode 100644 xixi.txt

root@Programer myproject# ls

readme.md test.txt xixi.txt

root@Programer myproject# git branch -v #切换到master分支

feature 0f44bf0 done test.txt

hotfix 108cf46 add haha.txt

* master 32f0842 add xixi.txt

root@Programer myproject# git merge hotfix #合并hotfix分支到master分支

Merge made by the 'recursive' strategy.

haha.txt | 1 +

1 file changed, 1 insertion(+)

create mode 100644 haha.txt

root@Programer myproject# ls #确认文件

haha.txt readme.md test.txt xixi.txt

root@Programer myproject# cat haha.txt

haha

root@Programer myproject# cat xixi.txt

xixi

root@Programer myproject#

#有冲突分支合并(修改不同分支中相同文件的相同行)

root@Programer myproject# git branch -v #查看分支

feature 0f44bf0 done test.txt

hotfix 108cf46 add haha.txt

* master b4bea28 Merge branch 'hotfix' 合并hotfix分支

root@Programer myproject# git checkout hotfix #切换到hotfix分支

切换到分支 'hotfix'

root@Programer myproject#echo "hahaha" > a.txt #创建a.txt文件

root@Programer myproject# git add . #添加到暂存区

root@Programer myproject# git commit -m "hotfix" #生成新版本

hotfix af8a04b hotfix

1 file changed, 1 insertion(+)

create mode 100644 a.txt

root@Programer myproject# git checkout master #切换到master分支

切换到分支 'master'

root@Programer myproject#echo "xixixi" > a.txt #创建a.txt

root@Programer myproject# git add . #添加到暂存区

root@Programer myproject# git commit -m "master" #生成新版本

master f556200 master

1 file changed, 1 insertion(+)

create mode 100644 a.txt

root@Programer myproject#git merge hotfix #合并hotfix分支到master分支

冲突(add/add):合并冲突于 a.txt

自动合并 a.txt

自动合并失败,修正冲突然后提交修正的结果。 #文件冲突,合并失败,手工解决

root@Programer myproject# cat a.txt

<<<<<<< HEAD

xixixi

=======

hahaha

>>>>>>> hotfix

root@Programer myproject# vim a.txt #手工解决冲突

root@Programer myproject# cat a.txt

xixixi

hahaha

root@Programer myproject# git add ./ #添加到暂存区

root@Programer myproject# git commit -m "resolv conflict"#生成新版本,解决冲突

master 2a6f272 resolv conflict

root@Programer myproject#

Git标签操作

Git标签管理

#使用tag子命令管理标签

root@Programer \~# cd myproject/

root@Programer myproject# git tag #查看已有标签

root@Programer myproject#git tag v1 #创建v1标签

root@Programer myproject# git tag #查看已有标签

v1

root@Programer myproject# git tag v2 #创建v2标签

root@Programer myproject# git tag #查看已有标签

v1

v2

root@Programer myproject#git tag -d v2 #删除v2标签

已删除标签 'v2'(曾为 2a6f272)

root@Programer myproject#

GitLab服务器搭建

使用rpm包本地部署GitLab服务器

#确认GitLab主机硬件配置

root@GitLab \~# free -m

total used free shared buff/cache available

Mem: 3896 113 3691 8 90 3615

Swap: 0 0 0

#安装解压软件

root@GitLab \~#yum -y install unzip

#解压实验素材(提前从server1主机/linux-soft/s3/PROJECT02.zip拷贝的资料)

root@GitLab \~# unzip PROJECT02.zip

#查看解压的素材资料

root@GitLab \~# ls PROJECT02/GitLab/

gitlab-ce-12.4.6-ce.0.el7.x86_64.rpm

#安装GitLab软件包,强制忽略依赖安装

root@GitLab \~# rpm -ivh --nodeps gitlab-ce-12.4.6-ce.0.el7.x86_64.rpm

#重载GitLab配置(需要耐心等待)

root@GitLab \~# gitlab-ctl reconfigure

...

Running handlers:

Running handlers complete

Chef Client finished, 527/1423 resources updated in 02 minutes 05 seconds

gitlab Reconfigured!

#重启GitLab相关服务

root@GitLab \~#gitlab-ctl restart

ok: run: alertmanager: (pid 1975) 0s //报警服务

ok: run: gitaly: (pid 1986) 1s //Git后台服务

ok: run: gitlab-exporter: (pid 2014) 0s //Prometheus数据采集器

ok: run: gitlab-workhorse: (pid 2020) 1s //反向代理服务器

ok: run: grafana: (pid 2117) 0s //数据可视化服务

ok: run: logrotate: (pid 2129) 0s //日志文件管理服务

ok: run: nginx: (pid 2135) 1s //静态WEB服务

ok: run: node-exporter: (pid 2142) 0s //Prometheus数据采集器

ok: run: postgres-exporter: (pid 2148) 1s //Prometheus数据采集器

ok: run: postgresql: (pid 2159) 0s //数据库服务

ok: run: prometheus: (pid 2168) 0s //Prometheus监控服务

ok: run: redis: (pid 2178) 1s //缓存数据库服务

ok: run: redis-exporter: (pid 2183) 0s //Prometheus数据采集器

ok: run: sidekiq: (pid 2192) 0s //异步执行队列服务

ok: run: unicorn: (pid 2203) 0s //Rails托管WEB服务

root@GitLab \~#

GitLab使用

GitLab初始化

GitLab服务器中组成员的角色有

  • Guest:发表评论、不能读写版本库

  • Reporter:可以克隆代码,不能提交

  • Developer:可以克隆代码、开发、提交、push

  • Maintainer:可以创建项目、添加 tag 、保护分支、添加项目成员、编辑项目

  • Owner:可以设置项目的访问权限、删除项目、迁移项目、管理组成员、开发组可以赋予这个权限

#GitLab主机确认80端口被监听

root@GitLab \~# ss -anptul | grep :80

tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=11166,fd=7),("nginx",pid=11165,fd=7),("nginx",pid=11164,fd=7))

root@GitLab \~#

#浏览器访问: http://192.168.88.20/

GitLab用户管理
GitLab组管理
GitLab项目管理

代码托管

关联Programer主机myproject仓库与GitLab服务器上myproject项目

#参考提示命令"推送已有Git仓库部分"

root@Programer \~# cd myproject/

root@Programer myproject# git remote -v #查看远程仓库关联信息

root@Programer myproject# git remote add origin http://192.168.88.20/devops/myproject.git #关联远程项目

root@Programer myproject# git remote -v #查看远程想看关联信息

origin http://192.168.88.20/devops/myproject.git (fetch)

origin http://192.168.88.20/devops/myproject.git (push)

root@Programer myproject# git push -u origin --all #推送本地仓库所有分支

Username for 'http://192.168.88.20': mark #用户名

Password for 'http://mark@192.168.88.20': #密码

枚举对象中: 29, 完成.

对象计数中: 100% (29/29), 完成.

使用 2 个线程进行压缩

压缩对象中: 100% (19/19), 完成.

写入对象中: 100% (29/29), 2.21 KiB | 2.21 MiB/s, 完成.

总共 29(差异 5),复用 0(差异 0),包复用 0

remote:

remote: To create a merge request for feature, visit:

remote: http://gitlab.example.com/devops/myproject/merge_requests/new?merge_request[source_branch]=feature

remote:

remote: To create a merge request for hotfix, visit:

remote: http://gitlab.example.com/devops/myproject/merge_requests/new?merge_request[source_branch]=hotfix

remote:

To http://192.168.88.20/devops/myproject.git

* new branch feature -> feature

* new branch hotfix -> hotfix

* new branch master -> master

分支 'feature' 设置为跟踪来自 'origin' 的远程分支 'feature'。

分支 'hotfix' 设置为跟踪来自 'origin' 的远程分支 'hotfix'。

分支 'master' 设置为跟踪来自 'origin' 的远程分支 'master'。

root@Programer myproject#git push -u origin --tags #推送本地仓库所有标签

Username for 'http://192.168.88.20': mark #用户名

Password for 'http://mark@192.168.88.20': #密码

总共 0(差异 0),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/myproject.git

* new tag v1 -> v1

登录GitLab项目管理页面查看推送情况(http://192.168.88.20/devops/myproject

HTTP方式免密推送

#每次推送都需要认证,可以设置免密推送

#store:永久存储

#cache:默认缓存15分钟,期间无需认证,可通过cache --timeout=3600设置超时时间

#git remote add origin http://name:pass@192.168.88.20/devops/myproject.git

#持久保存密码

root@Programer myproject# git config --global credential.helper store

root@Programer myproject#git push #推送代码(本次需要认证)

Username for 'http://192.168.88.20': mark #用户名

Password for 'http://mark@192.168.88.20': #密码

Everything up-to-date

root@Programer myproject# git push #再次推送测试免密

Everything up-to-date

root@Programer myproject# cat ~/.git-credentials

http://mark:1234.com@192.168.88.20

HIS项目代码托管
  • HIS项目代码准备

#Programer主机准备HIS代码

root@Programer \~# ls PROJECT02/Case/HIS/HIS.zip

HIS.zip

#解压医疗下项目的代码

root@Programer \~# unzip PROJECT02/Case/HIS/HIS.zip

root@Programer \~# ls HIS

HIS-BACKEND #HIS项目后端代码,SpringBoot框架编写

HIS-CONFIG #HIS项目后端程序运行配置文件

HIS-FONTEND #HIS项目前端代码(已编译)

HIS-FONTEND-DEPENDENCY #HIS项目前端代码编译依赖库(npm库)

HIS-FONTEND-SOURCECODE #HIS项目前端代码(未编译,VUE框架编写)

HIS-SQL #HIS项目数据库SQL文件

root@Programer \~#

  • HIS后端代码托管

#关联GitLab服务器HIS-BACKEND项目与Programer主机HIS-BACKEND代码

root@Programer \~#cd HIS/HIS-BACKEND/

root@Programer HIS-BACKEND# git init #初始化仓库

已初始化空的 Git 仓库于 /root/HIS/HIS-BACKEND/.git/

root@Programer HIS-BACKEND# git remote add origin http://192.168.88.20/devops/HIS-BACKEND.git #关联本地与远程

root@Programer HIS-BACKEND# git remote -v

origin http://192.168.88.20/devops/HIS-BACKEND.git (fetch)

origin http://192.168.88.20/devops/HIS-BACKEND.git (push)

root@Programer HIS-BACKEND# git add ./ #添加代码到暂存区

root@Programer HIS-BACKEND# git commit -m "Init Backend Code" #提交本地版本库

root@Programer HIS-BACKEND# git tag v1 #创建v1标签

root@Programer HIS-BACKEND#git push -u origin --all #推送本地所有分支

root@Programer HIS-BACKEND#git push -u origin --tags #推送本地所有标签

总共 0(差异 0),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/HIS-BACKEND.git

* new tag v1 -> v1

  • HIS前端代码托管

#关联GitLab服务器HIS-FONTEND项目与Programer主机HIS-FONTEND代码

root@Programer HIS-BACKEND# cd

root@Programer \~# cd HIS/HIS-FONTEND

#初始化仓库

root@Programer HIS-FONTEND#git init

已初始化空的 Git 仓库于 /root/HIS/HIS-FONTEND/.git/

#关联本地与远程

root@Programer HIS-FONTEND#git remote add origin \

http://192.168.88.20/devops/HIS-FONTEND.git

root@Programer HIS-FONTEND# git remote -v

origin http://192.168.88.20/devops/HIS-FONTEND.git (fetch)

origin http://192.168.88.20/devops/HIS-FONTEND.git (push)

root@Programer HIS-FONTEND#git add ./ #添加文件到暂存区

root@Programer HIS-FONTEND#git commit -m "Init Fontend Code"#提交到本地版本库

root@Programer HIS-FONTEND# git tag v1 #创建v1标签

root@Programer HIS-FONTEND# git push -u origin --all #推送所有分支

root@Programer HIS-FONTEND# git push -u origin --tags #推送所有标签

总共 0(差异 0),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/HIS-FONTEND.git

* new tag v1 -> v1

Jenkins部署

Jenkins安装部署

#Jenkins主机安装OpenJDK11环境

root@Jenkins \~# yum -y install java-11-openjdk-devel.x86_64

root@Jenkins \~#java -version

openjdk version "11.0.15" 2022-04-19 LTS

OpenJDK Runtime Environment 18.9 (build 11.0.15+9-LTS)

OpenJDK 64-Bit Server VM 18.9 (build 11.0.15+9-LTS, mixed mode, sharing)

#安装工具相关软件(Git用于拉取代码、postfix用于发邮件)

root@Jenkins \~# yum -y install git postfix

#安装解压软件,并解压素材(提前从server1主机/linux-soft/s3/PROJECT02.zip拷贝的资料)

root@Jenkins \~# yum -y install unzip

root@Jenkins \~# unzip PROJECT02.zip

#查看软件包

root@Jenkins \~# ls PROJECT02/Jenkins/

apache-maven-3.6.3-bin.tar.gz jenkins-2.361.4-1.1.noarch.rpm jenkins_plugins.tar.gz

#安装Jenkins

root@jenkins \~# yum -y localinstall \PROJECT02/Jenkins/jenkins-2.361.4-1.1.noarch.rpm

#启动Jenkins服务

root@Jenkins \~# systemctl enable jenkins.service #设置Jenkins开机自启动

root@Jenkins \~# systemctl start jenkins.service #启动Jenkins服务器

root@Jenkins \~# ss -antpul | grep java #确认8080端口被监听

tcp LISTEN 0 50 *:8080 *:* users:(("java",pid=13602,fd=8))

root@Jenkins \~#

Jenkins初始化

#获取Jenkins初始密码

root@Jenkins \~# cat /var/lib/jenkins/secrets/initialAdminPassword

1aaf609acf3843a8aaf17e8b1f22e8ea

root@Jenkins \~#

#浏览器访问: http://192.168.88.30:8080/

离线部署Jenkins插件

#离线部署Jenkins插件

root@Jenkins \~# ls /var/lib/jenkins/plugins/ #空目录,没有任何插件

root@Jenkins \~#ls PROJECT02/Jenkins/

apache-maven-3.6.3-bin.tar.gz jenkins-2.361.4-1.1.noarch.rpm jenkins_plugins.tar.gz

#解压Jenkins插件,保留文件归属(-P绝对路径解压,-p保留权限)

root@Jenkins \~# tar -xPpf PROJECT02/Jenkins/jenkins_plugins.tar.gz -C /

root@Jenkins \~# ls -l /var/lib/jenkins/plugins/ #确认该目录下文件归属

root@Jenkins \~#systemctl restart jenkins.service #重启Jenkins加载插件

root@Jenkins \~#ss -antpul | grep java

tcp LISTEN 0 50 *:8080 *:* users:(("java",pid=13917,fd=8))

root@Jenkins \~#

Jenkins工程构建

#确认代码拉取情况

root@Jenkins \~#ls /var/lib/jenkins/workspace/ #Jenkins工作目录

HIS-FONTEND

root@Jenkins \~#ls /var/lib/jenkins/workspace/HIS-FONTEND/ #确认HIS-FONTEND代码拉取

favicon.ico index.html static

root@Jenkins \~# rm -rf /var/lib/jenkins/workspace/* #清理Jenkins工作目录

root@Jenkins \~#

#确认代码拉取情况

root@Jenkins \~# ls /var/lib/jenkins/workspace/ #Jenkins工作目录

HIS-FONTEND

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-FONTEND/ #确认拉取到子目录

HIS-FONTEND-v1

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-FONTEND/HIS-FONTEND-v1/

favicon.ico index.html static

root@Jenkins \~# rm -rf /var/lib/jenkins/workspace/* #清理Jenkins工作目录

root@Jenkins \~#

#填写到Jenkins中HIS-FONTEND工程的构建过程shell语句

rm -rf .git #删除拉取到Jenkins本地目录中的版本库

tar -zcf fontend.tar.gz * #对代码进行打包操作

#确认HIS-FONTEND构建结果

root@Jenkins \~# ls /var/lib/jenkins/workspace/

HIS-FONTEND

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-FONTEND/ #目录下有代码tar包

favicon.ico fontend.tar.gz index.html static

root@Jenkins \~# rm -rf /var/lib/jenkins/workspace/* #清理Jenkins工作目录

root@Jenkins \~#

HIS前端代码测试

Fontend主机部署Nginx

#HIS前端代码为编译后代码,可直接部署在nginx上查看效果

#安装nginx软件

root@Fontend \~# yum -y install nginx

#查看默认nginx网页根目录资料

root@Fontend \~# ls /usr/share/nginx/html/

#设置nginx服务开机自启动,并立刻启动服务

root@Fontend \~# systemctl enable nginx --now

root@Fontend \~# ss -antpul | grep nginx

tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=11255,fd=6),("nginx",pid=11254,fd=6),("nginx",pid=11253,fd=6))

root@Fontend \~# curl http://localhost/ #访问测试

Jenkins代码自动发布

上图中Exec command命令代码如下:

#!/bin/bash

cd /usr/share/nginx/html/

tar -xf fontend.tar.gz

rm -rf fontend.tar.gz

#Jenkins主机确认HIS前端代码拉取及打包情况

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-FONTEND/

favicon.ico fontend.tar.gz index.html static

#Fontend主机确认代码包推送情况

root@Fontend \~# ls /usr/share/nginx/html/

favicon.ico index.html static

#访问Fontend主机测试前端页面展示效果 http://192.168.88.70/

Elasticsearch部署

Elasticsearch服务部署

#OpenJDK环境部署

root@Services \~# yum -y install java-1.8.0-openjdk-devel

...

Complete!

#安装解压软件,解压实验素材(提前从server1主机/linux-soft/s3/PROJECT02.zip拷贝的资料)

root@Services \~# yum -y install unzip

root@Services \~# unzip PROJECT02.zip

#安装Elasticsearch服务

root@Services \~#ls PROJECT02/Elasticsearch/

accounts.json data.sh elasticsearch-6.8.0.rpm elasticsearch-analysis-ik-6.8.0.zip elasticsearch-head.tar logs.jsonl

root@Services \~# yum -y localinstall \PROJECT02/Elasticsearch/elasticsearch-6.8.0.rpm

#配置Elasticsearch服务

root@Services \~# vim /etc/elasticsearch/elasticsearch.yml

node.name: Services #23行,ES节点名称

path.data: /var/lib/elasticsearch #33行,ES数据存储路径

path.logs: /var/log/elasticsearch #37行,ES日志存储路径

network.host: 0.0.0.0 #55行,监听地址

http.port: 9200 #59行,HTTP端口

http.cors.enabled: true #60行,开启HTTP跨域访问支持

http.cors.allow-origin: "*" #61行,允许跨域的访问范围

#启动Elasticsearch服务,设置服务开机自启动

root@Services \~# systemctl enable elasticsearch --now

root@Services \~# ss -antpul | grep java

tcp LISTEN 0 128 *:9200 *:* users:(("java",pid=9847,fd=209))

tcp LISTEN 0 128 *:9300 *:* users:(("java",pid=9847,fd=196))

#测试Elasticsearch服务

root@Services \~#curl http://localhost:9200/ #访问9200端口,返回一段json数据

{

"name" : "Services",

"cluster_name" : "elasticsearch",

"cluster_uuid" : "1cf7N861QBC_C0RE8gm0OA",

"version" : {

"number" : "6.8.0",

"build_flavor" : "default",

"build_type" : "rpm",

"build_hash" : "65b6179",

"build_date" : "2019-05-15T20:06:13.172855Z",

"build_snapshot" : false,

"lucene_version" : "7.7.0",

"minimum_wire_compatibility_version" : "5.6.0",

"minimum_index_compatibility_version" : "5.0.0"

},

"tagline" : "You Know, for Search"

}

root@Services \~#

Elasticsearch插件部署
Elasticsearch插件安装方式

#插件安装方法

#方式一:从官网下载ES插件,通常为ZIP格式,解压到/usr/share/elasticsearch/plugins/目录

#方式二:使用elasticsearch-plugin命令

#elasticsearch-plugin install file://path/xx.zip

#elasticsearch-plugin install http://addresss/xx

#elasticsearch-plugin install ftp://address/xx

#方式三:容器

IK分词器插件

#查看插件列表

root@Services \~# /usr/share/elasticsearch/bin/elasticsearch-plugin list

#本地IK分词器插件(unzip -d选项可以指定解压路径)

root@Services \~# mkdir /usr/share/elasticsearch/plugins/analysis-ik

root@Services \~# unzip \PROJECT02/Elasticsearch/elasticsearch-analysis-ik-6.8.0.zip \

-d /usr/share/elasticsearch/plugins/analysis-ik/

#查看插件列表

root@Services \~# /usr/share/elasticsearch/bin/elasticsearch-plugin list

analysis-ik

#重启服务加载插件,测试IK分词器

root@Services \~# systemctl restart elasticsearch

root@Services \~# curl -H "Content-Type: application/json" -XPOST

http://localhost:9200/_analyze?pretty -d '

{

"analyzer": "standard",

"text": "华为手机"

}'

#测试标准分词,返回结果如下

{

"tokens" : [

{

"token" : "华",

"start_offset" : 0,

"end_offset" : 1,

"type" : "<IDEOGRAPHIC>",

"position" : 0

},

{

"token" : "为",

"start_offset" : 1,

"end_offset" : 2,

"type" : "<IDEOGRAPHIC>",

"position" : 1

},

{

"token" : "手",

"start_offset" : 2,

"end_offset" : 3,

"type" : "<IDEOGRAPHIC>",

"position" : 2

},

{

"token" : "机",

"start_offset" : 3,

"end_offset" : 4,

"type" : "<IDEOGRAPHIC>",

"position" : 3

}

]

}

root@Services \~#curl -H "Content-Type: application/json" -XPOST http://localhost:9200/_analyze?pretty -d '

{

"analyzer": "ik_smart",

"text": "华为手机"

}'

#测试IK分词器,返回结果如下

{

"tokens" : [

{

"token" : "华为",

"start_offset" : 0,

"end_offset" : 2,

"type" : "CN_WORD",

"position" : 0

},

{

"token" : "手机",

"start_offset" : 2,

"end_offset" : 4,

"type" : "CN_WORD",

"position" : 1

}

]

}

HEAD插件(容器部署)

#安装podman工具

root@Services \~#yum -y install podman

Complete!

#查看本地已有镜像

root@Services \~#podman images

REPOSITORY TAG IMAGE ID CREATED SIZE

#导入ES-HEAD插件镜像

root@Services \~# podman load -i PROJECT02/Elasticsearch/elasticsearch-head.tar

root@Services \~# podman images #确认ES-HEAD镜像已导入

REPOSITORY TAG IMAGE ID CREATED SIZE

localhost/elasticsearch-head latest d008a8ccd029 7 weeks ago 862 MB

#查看有运行的容器,应为空

root@Services \~# podman ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

#启动ES-HEAD容器

root@Services \~# podman run -d --name es-head --hostname es-head -p 9100:9100 localhost/elasticsearch-head:latest #后台运行ES-HEAD容器

f222cb764271574148d31b184bd0aebda419ce3ebd43843c0ff8f1f4dc6ba53c

#确认ES-HEAD容器已运行

root@Services \~# podman ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

f222cb764271 localhost/elasticsearch-head:latest /bin/sh -c grunt ... 2 seconds ago Up 2 seconds ago 0.0.0.0:9100->9100/tcp es-head

root@Services \~#ss -antpul | grep 9100 #确认9100端口被监听

tcp LISTEN 0 128 0.0.0.0:9100 0.0.0.0:* users:(("conmon",pid=12651,fd=5))

#测试访问Elasticsearch-HEAD插件:http://192.168.88.50:9100/

Elasticsearch API
Elasticsearch常用API

#测试指定API

root@Services \~# curl -H "Content-Type: application/json" -XGET http://localhost:9200/_cat/health

#返回结果如下:

1677142976 09:02:56 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%

root@Services \~# curl -H "Content-Type: application/json" -XGET http://localhost:9200/_cat/health?v

#返回结果如下

epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent

1677142979 09:02:59 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%

#创建索引(必做练习)

root@Services \~# curl -H "Content-Type: application/json" -XPUT http://localhost:9200/tedu/ -d '

{ "settings": {

"index": {

"number_of_shards": 1,

"number_of_replicas": 0

}

}

}'

#返回结果如下:

{"acknowledged":true,"shards_acknowledged":true,"index":"tedu"}root@Services \~#

#调用API批量导入数据

root@Services \~# cd PROJECT02/Elasticsearch/

root@Services Elasticsearch# ls data.sh logs.jsonl accounts.json

accounts.json data.sh logs.jsonl

root@Services Elasticsearch# cat data.sh

#!/bin/bash

curl -H "Content-Type: application/json" -XPUT http://localhost:9200/account/user/_bulk --data-binary @accounts.json

curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_bulk --data-binary @logs.jsonl

root@Services \~# bash data.sh

RabbitMQ服务
RabbitMQ部署

#安装Erlang

root@Services \~#ls PROJECT02/RabbitMQ/

erlang-25.2-1.el8.x86_64.rpm pika-1.3.1-py3-none-any.whl rabbitmq_demo.tar.gz RabbitMQ.py rabbitmq-server-3.11.5-1.el8.noarch.rpm

root@Services \~#cd PROJECT02/RabbitMQ/

root@Services RabbitMQ# yum -y localinstall erlang-25.2-1.el8.x86_64.rpm

#安装RabbitMQ

root@Service RabbitMQ#yum -y localinstall rabbitmq-server-3.11.5-1.el8.noarch.rpm

#启动RabbitMQ服务,并设置开机自启动

root@Service RabbitMQ#systemctl enable rabbitmq-server --now

root@Service RabbitMQ# ss -antpul | grep :5672 #确认5672端口监听

tcp LISTEN 0 128 *:5672 *:* users:(("beam.smp",pid=13298,fd=35))

#查看RabbitMQ服务状态

root@Services \~# rabbitmqctl status

Status of node rabbit@Services ...

Runtime

OS PID: 13298

OS: Linux

Uptime (seconds): 15

Is under maintenance?: false

RabbitMQ version: 3.11.5

RabbitMQ release series support status: supported

Node name: rabbit@Services

Erlang configuration: Erlang/OTP 25 erts-13.1.3 source 64-bit smp:2:2

... ...

#启用RabbitMQ网页管理插件

root@Services \~# rabbitmq-plugins list #列出所有插件

root@Services \~#rabbitmq-plugins enable rabbitmq_management #启动网页管理插件

Enabling plugins on node rabbit@Services:

rabbitmq_management

The following plugins have been configured:

rabbitmq_management

rabbitmq_management_agent

rabbitmq_web_dispatch

Applying plugin configuration to rabbit@Services...

The following plugins have been enabled:

rabbitmq_management

rabbitmq_management_agent

rabbitmq_web_dispatch

started 3 plugins.

root@Services \~# rabbitmq-plugins list

Listing plugins with pattern ".*" ...

Configured: E = explicitly enabled; e = implicitly enabled

| Status: * = running on rabbit@Services

|/

rabbitmq_amqp1_0 3.11.5

rabbitmq_auth_backend_cache 3.11.5

rabbitmq_auth_backend_http 3.11.5

rabbitmq_auth_backend_ldap 3.11.5

rabbitmq_auth_backend_oauth2 3.11.5

rabbitmq_auth_mechanism_ssl 3.11.5

rabbitmq_consistent_hash_exchange 3.11.5

rabbitmq_event_exchange 3.11.5

rabbitmq_federation 3.11.5

rabbitmq_federation_management 3.11.5

rabbitmq_jms_topic_exchange 3.11.5

E\* rabbitmq_management 3.11.5

e\* rabbitmq_management_agent 3.11.5

rabbitmq_mqtt 3.11.5

rabbitmq_peer_discovery_aws 3.11.5

rabbitmq_peer_discovery_common 3.11.5

rabbitmq_peer_discovery_consul 3.11.5

rabbitmq_peer_discovery_etcd 3.11.5

rabbitmq_peer_discovery_k8s 3.11.5

rabbitmq_prometheus 3.11.5

rabbitmq_random_exchange 3.11.5

rabbitmq_recent_history_exchange 3.11.5

rabbitmq_sharding 3.11.5

rabbitmq_shovel 3.11.5

rabbitmq_shovel_management 3.11.5

rabbitmq_stomp 3.11.5

rabbitmq_stream 3.11.5

rabbitmq_stream_management 3.11.5

rabbitmq_top 3.11.5

rabbitmq_tracing 3.11.5

rabbitmq_trust_store 3.11.5

e\* rabbitmq_web_dispatch 3.11.5

rabbitmq_web_mqtt 3.11.5

rabbitmq_web_mqtt_examples 3.11.5

rabbitmq_web_stomp 3.11.5

rabbitmq_web_stomp_examples 3.11.5

root@Services \~# ss -antpul | grep :15672

tcp LISTEN 0 128 0.0.0.0:15672 0.0.0.0:* users:(("beam.smp",pid=13298,fd=37))

root@Services \~#

#访问RabbitMQ管理页面: http://192.168.88.50:15672/

RabbitMQ服务应用
  • 用户管理

#RabbitMQ创建用户

root@Services \~#rabbitmqctl list_users #列出RabbitMQ已有用户

Listing users ...

user tags

guest administrator

root@Services \~# rabbitmqctl add_user admin #添加admin用户

Adding user "admin" ...

Password:

hisadmin #密码必须设置为hisadmin,为后续项目使用

root@Services \~# rabbitmqctl list_users #列出RabbitMQ已有用户

Listing users ...

user tags

admin \[\]

guest administrator

root@Services \~#

  • 用户标签管理

#RabbitMQ用户标签解析

#超级管理员(administrator)

#可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

#监控者(monitoring)

#可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

#策略制定者(policymaker)

#可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

#普通管理者(management)

#仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

#其他(guest)

#无法登陆管理控制台,通常就是普通的生产者和消费者

#给admin用户添加administrator标签

root@Services \~# rabbitmqctl set_user_tags admin administrator

Setting tags for user "admin" to administrator ...

root@Services \~# rabbitmqctl list_users

Listing users ...

user tags

admin administrator

guest administrator

root@Services \~#

  • 虚拟主机管理

#创建/his虚拟主机

root@Services \~# rabbitmqctl list_vhosts #列出已有虚拟主机

Listing vhosts ...

name

/

root@Services \~#rabbitmqctl add_vhost /his #创建/his虚拟主机,后续项目使用

Adding vhost "/his" ...

root@Services \~# rabbitmqctl list_vhosts #列出已有虚拟主机

Listing vhosts ...

name

/his

/

root@Services \~#

  • 设置用户访问虚拟主机权限

#设置admin用户对/his虚拟主机有所有权限

root@Services \~# rabbitmqctl list_user_permissions admin #查看admin用户权限

Listing permissions for user "admin" ...

#设置权限

root@Services \~# rabbitmqctl set_permissions -p /his admin ".*" ".*" ".*"

Setting permissions for user "admin" in vhost "/his" ...

root@Services \~# rabbitmqctl list_user_permissions admin #查看admin用户权限

Listing permissions for user "admin" ...

vhost configure write read

/his .* .* .*

数据库服务部署 *

MySQL部署

#安装MySQL服务

root@Services \~#yum -y install mysql mysql-server mysql-devel

#启动MySQL服务,并设置开机自启动

root@Services \~# systemctl enable mysqld --now #设置MySQL服务开机自启动

root@Services \~#ss -antpul | grep mysql #确认3306端口被监听

tcp LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=6875,fd=22))

tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=6875,fd=25))

#初始化MySQL服务,创建HIS项目数据库,创建数据库账户并授权

root@Services \~# mysql

mysql> CREATE DATABASE his;

mysql> CREATE USER 'his'@'192.168.88.60' IDENTIFIED BY 'hisadmin';

mysql> GRANT ALL ON his.* TO 'his'@'192.168.88.60';

mysql> SHOW GRANTS FOR 'his'@'192.168.88.60';

+----------------------------------------------------------+

| Grants for his@192.168.88.60 |

+----------------------------------------------------------+

| GRANT USAGE ON *.* TO `his`@`192.168.88.60` |

| GRANT ALL PRIVILEGES ON `his`.* TO `his`@`192.168.88.60` |

+----------------------------------------------------------+

mysql> exit

#解压项目资料

root@Services \~# unzip PROJECT02/Case/HIS/HIS.zip

root@Service \~# ls HIS/HIS-SQL/

his.sql

#导入HIS项目SQL,验证

root@Services \~# mysql his < HIS/HIS-SQL/his.sql

root@Services \~# mysql -e "show tables from his;"

+----------------------------------+

| Tables_in_his |

+----------------------------------+

| bms_bills_record |

| bms_invoice_exp |

| bms_invoice_record |

| bms_operator_settle_record |

| bms_settlement_cat |

| dms_case_history |

| dms_case_model |

| dms_case_model_catalog |

| dms_dise |

| dms_dise_catalog |

| dms_dosage |

| dms_drug |

| dms_drug_model |

| dms_drug_refund_item_record |

| dms_herbal_item_record |

| dms_herbal_model_item |

| dms_herbal_prescription_record |

| dms_medicine_item_record |

| dms_medicine_model_item |

| dms_medicine_prescription_record |

| dms_non_drug |

| dms_non_drug_item_record |

| dms_non_drug_model |

| dms_registration |

| pms_patient |

| sms_dept |

| sms_description |

| sms_frequent_used |

| sms_login_log |

| sms_permission |

| sms_registration_rank |

| sms_role |

| sms_role_permission_relation |

| sms_skd |

| sms_skd_rule |

| sms_skd_rule_item |

| sms_staff |

| sms_workload_record |

+----------------------------------+

Redis部署

#安装Redis服务

root@Services \~# yum -y install redis

#配置Redis服务

root@Services \~#vim /etc/redis.conf

bind 0.0.0.0 #69行,监听本地所有网络

protected-mode no #88行,关闭保护模式(允许其他主机访问本机数据库)

daemonize yes #136行,以守护进程方式运行

requirepass hisadmin #507行,设置redis访问密码

#启动Redis服务,并设置开机自启动

root@Services \~# systemctl enable redis --now

root@Services \~# ss -antpul | grep redis #确认6379端口被监听

tcp LISTEN 0 128 0.0.0.0:6379 0.0.0.0:* users:(("redis-server",pid=7839,fd=6))

root@Services \~#

#测试Redis服务

root@Services \~# redis-cli -h localhost -p 6379 -a hisadmin info

Jenkins全局工具配置

配置JDK环境
配置Git工具
配置Maven工具

#Jenkins主机安装Maven(-C指定解压路径)

root@Jenkins \~# tar -xf PROJECT02/Jenkins/apache-maven-3.6.3-bin.tar.gz \

-C /usr/local/

root@Jenkins \~# ls /usr/local/apache-maven-3.6.3/

#部署Maven本地仓库

root@Jenkins \~# ls PROJECT02/Case/HIS/HIS.zip node-v16.13.0-linux-x64.tar.gz repository.tar.gz

root@Jenkins \~# tar -xpPf PROJECT02/Case/HIS/repository.tar.gz -C /

root@Jenkins \~# ls /var/lib/jenkins/.m2/

repository

root@Jenkins \~# ls /var/lib/jenkins/.m2/repository/

aopalliance classworlds commons-beanutils commons-io de joda-time net

backport-util-concurrent cn commons-codec commons-lang io junit org

ch com commons-collections commons-logging javax mysql

root@Jenkins \~#

Jenkins后端工程构建

Jenkins中创建HIS-BACKEND工程

#Maven打包参数:Maven执行打包操作时需要调用pom.xml文件,所以需要指定pom.xml文件位置

clean package -Dmaven.test.skip=true #清理旧文件、跳过测试直接打包

测试HIS-BACKEND工程构建

#Jenkins主机确认HIS-BACKEND构建情况

root@Jenkins \~# ls /var/lib/jenkins/workspace/ #确认拉取HIS-BACKEND代码

HIS-BACKEND HIS-FONTEND

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api HIS-common HIS-demo HIS-mbg HIS-service pom.xml

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/mvnw mvnw.cmd pom.xml src target

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/ #确认打包

classes generated-sources HIS-api-1.0-SNAPSHOT.jar HIS-api-1.0-SNAPSHOT.jar.original maven-archiver maven-status

root@Jenkins \~#

#清理HIS-BACKEND本次构建

root@Jenkins \~# rm -rf /var/lib/jenkins/workspace/HIS-BACKEND/

root@Jenkins \~#

Jenkins后端自动发布

Backend主机部署
  • 部署OpenJDK环境

#安装OpenJDK-1.8

root@Backend \~# yum -y install java-1.8.0-openjdk-devel

  • 部署jar包运行配置文件

#HIS项目采用外置配置文件方式

root@Backend \~# mkdir /opt/his/

root@Backend \~# yum -y install unzip

root@Backend \~# unzip PROJECT02.zip

root@Backend \~# unzip PROJECT02/Case/HIS/HIS.zip

root@Backend \~# ls HIS/HIS-CONFIG/

application-prod.yml application.yml

root@Backend \~# scp HIS/HIS-CONFIG/*.yml /opt/his/

root@Backend \~# ls /opt/his/

application-prod.yml application.yml

添加SSH服务器
HIS-BACKEND工程配置自动发布

上图中Exec command代码如下:

#!/bin/bash

jps | awk '/jar/{print $1}' | xargs kill

cd /opt/his/

nohup java -jar HIS-api-1.0-SNAPSHOT.jar > ./his.log 2>&1 &

HIS-BACKEND工程自动发布测试

#Jenkins主机确认HIS-BACKEND打包成功

root@Jenkins \~# ls /var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/HIS-api-1.0-SNAPSHOT.jar

/var/lib/jenkins/workspace/HIS-BACKEND/HIS-api/target/HIS-api-1.0-SNAPSHOT.jar

root@Jenkins \~#

#Backend主机确认jar包发布情况

root@Backend \~# ls /opt/his/

application-prod.yml application.yml HIS-api-1.0-SNAPSHOT.jar

root@Backend \~# ss -antpu | grep :8888 #确认8888端口被监听

tcp LISTEN 0 100 *:8888 *:* users:(("java",pid=9629,fd=63))

root@Backend \~# ss -antpu | grep java

#测试服务状态

root@Backend \~# curl http://localhost:8888/actuator/health?pretty

{"status":"UP","details":{"rabbit":{"status":"UP","details":{"version":"3.11.5"}},"diskSpace":{"status":"UP","details":{"total":10725883904,"free":8431407104,"threshold":10485760}},"db":{"status":"UP","details":{"database":"MySQL","hello":1}},"elasticsearch":{"status":"UP","details":{"clusterName":"elasticsearch","numberOfNodes":1,"numberOfDataNodes":1,"activePrimaryShards":22,"activeShards":22,"relocatingShards":0,"initializingShards":0,"unassignedShards":20}},"elasticsearchRest":{"status":"UP","details":{"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":22,"active_shards":22,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":20,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":52.38095238095239}},"redis":{"status":"UP","details":{"version":"5.0.3"}}}}

HIS项目展示

配置Nginx前后端交互

#修改nginx配置文件,实现前后端分离

root@Fontend \~# vim /etc/nginx/nginx.conf

#在49行,手动添加如下3行内容

location /prod-api/ {

proxy_pass http://192.168.88.60:8888/;

}

root@Fontend \~# systemctl restart nginx #重启nginx服务

root@Fontend \~# ss -antpul | grep nginx

tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=952,fd=6),("nginx",pid=951,fd=6),("nginx",pid=950,fd=6))

root@Fontend \~#

HIS效果展示

#浏览器访问HIS前端页面:http://192.168.88.70/

CI/CD全流程测试
  • 常用的CI/CD工具集及其作用
    • Git:客户端代码用于版本控制的分布式版本控制工具
    • GitLab:企业内部代码托管平台
    • Jenkins:最流行的CI工具,操作简单,插件丰富
    • Ansible:自动化运维工具,配合Jenkins可完成批量部署
  • 前端全流程测试

#查看现有首页内容,注意title内容为"东软云"

root@Fontend \~# vim /opt/his/web/index.html

root@Fontend \~#

#Programer主机更新前端代码,title更新为"达内云"

root@Programer HIS-FONTEND# vim index.html #修改title内容

root@Programer HIS-FONTEND#

root@Programer HIS-FONTEND# git add ./ #添加修改到暂存区

root@Programer HIS-FONTEND#git commit -m "modify index.html" #生成新版本

master 33da040 modify index.html

1 file changed, 1 insertion(+), 1 deletion(-)

root@Programer HIS-FONTEND# git tag v2 #打v2标签

root@Programer HIS-FONTEND#git push #推送分支到服务器

枚举对象中: 5, 完成.

对象计数中: 100% (5/5), 完成.

使用 2 个线程进行压缩

压缩对象中: 100% (3/3), 完成.

写入对象中: 100% (3/3), 345 字节 | 345.00 KiB/s, 完成.

总共 3(差异 1),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/HIS-FONTEND.git

2c9f9bb..33da040 master -> master

root@Programer HIS-FONTEND#git push --tags #推送标签到服务器

总共 0(差异 0),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/HIS-FONTEND.git

* new tag v2 -> v2

root@Programer HIS-FONTEND#

#Fontend主机验证构建结果

root@Fontend \~# ls /opt/his/web/ #确认fontend.tar.gz清理情况

favicon.ico index.html static

root@Fontend \~# vim /opt/his/web/index.html #查看页面内title内容是否为"达内云"

root@Fontend \~#

#Jenkins主机确认自动清理工作目录

root@Jenkins \~# ls /var/lib/jenkins/workspace/

root@Jenkins \~#

  • 后端全流程测试

#此时HIS后端jar包应为之前的手工启动前台进程

root@Fontend \~# curl http://192.168.88.60:8888/

<!DOCTYPE html>

<html lang="cn">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<h1>HIS</h1> #页面展示为HIS

</body>

</html>root@Fontend \~#

#Programer主机更新HIS-BACKEND代码

root@Programer \~# cd HIS/HIS-BACKEND/

root@Programer HIS-BACKEND# vim HIS-api/src/main/resources/static/index.html

<!DOCTYPE html>

<html lang="cn">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<h1>医疗信息系统</h1> #修改后端首页内容

</body>

</html>

root@Programer HIS-BACKEND# git add . #添加修改到暂存区

root@Programer HIS-BACKEND# git commit -m "modify index.html"#生成版本库

master 8343263 modify index.html

1 file changed, 2 insertions(+), 2 deletions(-)

root@Programer HIS-BACKEND# git tag v2 #打v2标签

root@Programer HIS-BACKEND# git push --all #推送所有分支到服务器

枚举对象中: 15, 完成.

对象计数中: 100% (15/15), 完成.

使用 2 个线程进行压缩

压缩对象中: 100% (6/6), 完成.

写入对象中: 100% (8/8), 607 字节 | 607.00 KiB/s, 完成.

总共 8(差异 4),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/HIS-BACKEND.git

f582569..8343263 master -> master

root@Programer HIS-BACKEND# git push --tags #推送所有标签到服务器

总共 0(差异 0),复用 0(差异 0),包复用 0

To http://192.168.88.20/devops/HIS-BACKEND.git

* new tag v2 -> v2

root@Programer HIS-BACKEND#

#确认jar包后台运行

root@Backend his# ss -antpu | grep :8888

tcp LISTEN 0 100 *:8888 *:* users:(("java",pid=9934,fd=63))

root@Backend his#

#测试访问后台首页

root@Backend his# curl http://localhost:8888/

<!DOCTYPE html>

<html lang="cn">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<h1>医疗信息系统</h1>

</body>

</html>

root@Backend his#

相关推荐
皆圥忈5 分钟前
Linux文件系统与缓冲区深度解析
linux
Dream_ksw10 分钟前
借助AI再次理解三次握手和四次挥手
服务器·网络·tcp/ip
壹号用户21 分钟前
初识linux
linux·运维·服务器
衫水26 分钟前
Windows Server Nginx 代理企业内网 API 偶发超时处理与保活 SOP(20260608))
运维·windows·nginx
Java 码思客31 分钟前
【Redis分布式缓存实战】第20章 Redis监控运维与自动化体系
运维·redis·缓存
梦想的颜色32 分钟前
硬核|Docker从入门到精通:镜像构建、仓库推送、Compose编排、生产部署全攻略
运维·服务器·docker·容器·部署·环境·镜像
团象科技33 分钟前
中小出海企业站点运维实践 关于WP建站海外主机的行业观察
运维·人工智能
凡人叶枫41 分钟前
Effective C++ 条款02:宁可以编译器替换预处理器
java·linux·c语言·开发语言·c++
m0_738120721 小时前
渗透测试基础——PHP 序列化数据结构与反序列化机制详解
android·服务器·网络·数据结构·安全·php
爱看老照片1 小时前
linux上查看磁盘空间占用情况,清理大文件
linux·清理·大文件·磁盘空间