项目环境准备
环境准备说明:
本阶段共使用虚拟机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 \
>
> 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%5Bsource_branch%5D=feature
>
> remote:
>
> remote: To create a merge request for hotfix, visit:
>
> remote: http://gitlab.example.com/devops/myproject/merge_requests/new?merge_request%5Bsource_branch%5D=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://192.168.88.20/devops/myproject "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" : "\
}
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/** > \ > > \ > > \
> > \ > > \