私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建

  • 1 GitLab(私有仓库)的部署
    • 1.1 GitLab的简介
    • 1.2 Gitlab的安装
    • 1.3 登录gitlab
    • 1.4 Gitlab的使用
  • 2 jenkins的部署
    • 2.1 Jenkins的安装
    • 2.2 Jenkins的使用
      • 2.2.1 Jenkins的登陆和更新插件
      • 2.2.2 创建测试工程
    • 2.3 Jenkins构建的两种方式
      • 2.3.1 Jenkins以轮询的方式触发构建
      • 2.3.2 GitLab 自动触发 Jenkins 构建
  • 2 jenkins的部署
    • 2.1 Jenkins的安装
    • 2.2 Jenkins的使用
      • 2.2.1 Jenkins的登陆和更新插件
      • 2.2.2 创建测试工程
    • 2.3 Jenkins构建的两种方式
      • 2.3.1 Jenkins以轮询的方式触发构建
      • 2.3.2 GitLab 自动触发 Jenkins 构建

项目本地开发完成后,需要将代码部署到线上服务器。随之微服务、集群等的流行,单靠传统的部署显然是无法满足当下的需求;我们可以通过Gitlab和Jenkins这两个常用的开源项目,便可搭建自己公司的代码管理工具和自动化部署平台

GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

Jenkins 是一个开源的持续集成系统,方便开发者利用图形化界面进行项目部署发布等固定操作,通常也会和 Gitlab 配合起来,在 git push 完成后触发设定好的操作,例如将代码部署到某个开发环境中

1 GitLab(私有仓库)的部署

1.1 GitLab的简介

GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找

1.2 Gitlab的安装

官网:https://about.gitlab.com/install/

(1) 安装:yum install -y gitlab-ce-13.2.2-ce.0.el7.x86_64.rpm

(2)访问gitlab的地址:vim /etc/gitlab/gitlab.rb
在这里插入图片描述(3)重载服务: gitlab-ctl reconfigure

(4) 常用命令

命令 功能
gitlab-ctl start 启动所有 gitlab 组件
gitlab-ctl stop 停止所有 gitlab 组件
gitlab-ctl restart 重启所有 gitlab 组件
gitlab-ctl status 查看服务状态
gitlab-ctl reconfigure 重载服务
gitlab-ctl tail 查看日志

1.3 登录gitlab

在浏览器端登陆:http://172.25.12.1,用户root 第一次登录需要强制修改密码
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第1张图片

  • 登录gitlab

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第2张图片

  • 将界面设置为中文模式

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第3张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第4张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第5张图片

1.4 Gitlab的使用

(1)新建项目
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第6张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第7张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第8张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第9张图片(2)添加ssh密钥
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第10张图片

  • 查看私钥
[root@server1 ~]#  cd .ssh/
[root@server1 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@server1 .ssh]# cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2/6raP/kBbUqAhPQBtNDNO5Lgsu9hU+92yQTkRIgy8fKPYay
TxDTfb0QDEviw2cN94RmVbwSih2B1X/vFG/vilUsEYa/wflhB3/MuAYZBv5tjUSq
B/9zdY6v2UkbmG75AfE0wcNl7E5K3DIPuPNUl230QKTwxhqLrBvuFCHOCS2mUz4p
prERJ0P8P+Ha91MwhBqjRq+hU7RjR9v/VdE/2999CXPf3boYoF71w9KnhQT1UaMA
o/UnbwPRmjznoF9TQ8OvFARN4hsu6g1lVbmb5q0wlpxLmiIld6ntxPjIPa9+0Dr5
wGV2dpxeErKunKHRuhP3zEffPWZ+Ov4njoyJ8QIDAQABAoIBAGJEXZinRNlv1PXc
l72UvJ52GvCvxVY5CltKwBq6+D9OXP4inp9GqtGtk++KLh6Od+SqFXQScE2VZJtT
bB266krmRKsHf7xLgpXw9ib1QlSnbZP+qdystIw8UjxCtbrfRwchESnD+FEXn8S/
79nzh0Ok78e4ZXx3+w/D4hLIDtp136MGYh83NO6gmi615hvEyaz+K5JZyhEwkaHO
04d/X8/QRL3LqZ6+oyO/7ne6j3Z4qR+Uuq0GfXTQmCCUtcbW6KHqzYV7+2edrzsB
6DWFt2YQ9w2PRurZB9UU7fVKCL0q8NXUG9nHxnRc4bda/oYZKIEr7dh+isRRMl4c
zZyLIGECgYEA70ak9aFDZVGxzkuVeI9MdpXQJMTQ/UYkLB2Vj1ADWFCxv6nfpZwb
3yGoLuBqitQUF3yCzl4Jbz467bqtPPBkjJcvsiDaTfXGRLw4sBXr9IjWJX/gh0Fo
o6gwdXzz251c4vY7irrLbBqsnDgBntzDoadOlv0ENQ6g8pKVx5hJLyUCgYEA618H
PWG+/4HruIhv86VEpT3+cWuX1oU00s3+itT27KPtHBAwUBAMo7U4f21tnGk7KtIw
UeErKzFhAl2NIKkwAKVgjh0b9wqzwVWBbYcuLC/bF1g6945U6qThPvcGAinQU4qe
yYQFq+Caeca2QdBGuEO0OqkQHGbhMO0ZD3qjS90CgYBe8cRBJ1VL3efU+Q79gLcR
kw69mE9pQKzXyIFxFYnOQG7Xo7t3xoMUvhEzUJ9WKSMz0pdA9fV+a84MSPe255iu
ZMtrPjgBmVWsLpe732b6aFW5GY3pfZ3c2r8nz4YgDcgu0w/7U3WmlssJTfvuoqEK
Aw5fQVSrDPv2ZQ4D3jyj9QKBgG+RTuQ4pgmFMw/4lGCAcWaGWUq3/nQwFhbqkAKM
6jLHjUglIFGDGgqrhwlX/IIMm4Azu7XELus9b8doQtI9gER+H6Odhrj2OLim6D/b
uPY3BPou11yq+fNzjlWDUDTMTzSaW6QX0XxkbbTVjWTq7erAJPk9VCayWYIQkTV2
I1t9AoGBALBRJ7cVfhXnmPlXLXya1oxyqxDGwanoDt3g2OUI+xyqCzft6CRpPh0U
ofnbCjl3PbUEJVvtOaumeb9l+QIwPHHUAjmjOujDJ4Ho4ILP8EQeG5K6/HIed166
kqNFU5TsHHzpjxj4r+WGsIX8OQ0bu+rC0QtCSd5gSqrlmNmcs6me
-----END RSA PRIVATE KEY-----

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第11张图片

  • ssh密钥添加成功

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第12张图片(3)克隆gitlab的项目到本地
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第13张图片

git clone [email protected]:root/test.git

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第14张图片

2 jenkins的部署

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成

2.1 Jenkins的安装

(1)软件下载:https://jenkins.io/zh/download/

(2)软件安装(java环境):

yum install jdk-8u171-linux-x64.rpm jenkins-2.279-1.1.noarch.rpm -y

(3)启动服务:systemctl start jenkins

  • 安装apache服务:yum install -y httpd
  • 安装git工具:yum install git -y

(4)更新插件源(解决安装出错问题)

1 编辑文件:cd /var/lib/jenkins/updates

在这里插入图片描述

  • jenkins在下载插件之前会先检查网络连接,其会读取这个文件中的网址。将默认访问谷歌的路径改为www.baidu.com,以及将更新jenkins的源改为清华源
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
sed -i.bak 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
  • 将更新的文件放到apache的发布目录:cp default.json /var/www/html/

2 编辑文件:

vim  /var/lib/jenkins/hudson.model.UpdateCenter.xml 
  • 该文件为jenkins下载插件的源地址,改地址默认jenkins默认为:https://updates.jenkins.io/update-center.json,就是因为https的问题,此处将其改为修改后的存放default.json的apache服务的路径,之后重启jenkins服务即可
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://172.25.12.2/default.json</url>
  </site>
</sites>
  • 重启 jenkins服务:systemctl start jenkins

  • 查看服务监听的端口号为8080:netstat -antlp

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第15张图片

2.2 Jenkins的使用

2.2.1 Jenkins的登陆和更新插件

(1)在浏览器端登陆:http://172.25.12.2:8080/

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第16张图片

(2)查看Jenkins初始密码文件

[root@server2 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
4194fe7032684e8481eca112d84e8da8

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第17张图片(3)安装插件
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第18张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第19张图片
(4)使用admin账户登陆
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第20张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第21张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第22张图片

2.2.2 创建测试工程

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第23张图片

  • 在输入框中输入工程名,选择 构建一个自由风格的软件项目,然后点击左下角的 确定按钮,进入工程配置页面

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第24张图片私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第25张图片

  • 查看仓库的URL

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第26张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第27张图片

  • 如果是SSH形式的 URL,选择jenkins凭据的类型

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第28张图片

  • 查看部署GitLab服务虚拟机的私钥

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第29张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第30张图片

  • 选择Credentials用户为root

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第31张图片

2.3 Jenkins构建的两种方式

2.3.1 Jenkins以轮询的方式触发构建

  • 构建触发器为轮询SCM模式,每分钟轮询一次,有更新时触发jinkens构建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第32张图片

  • 构建时执行shell命令:ls -l,保存配置

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第33张图片

  • Git提交代码到gitlab,jinkens轮询检测到代码仓库的变更,触发构建

查看控制台的输出

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第34张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第35张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第36张图片

2.3.2 GitLab 自动触发 Jenkins 构建

(1)安装GitLab插件
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第37张图片私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第38张图片(2)配置Demo项目

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第39张图片

  • 构建触发器时选择:Build when a change is pushed to GitLab. GitLab webhook URL: http://172.25.12.2:8080/project/Demo

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第40张图片

  • 点击高级

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第41张图片

  • 生成Secret token

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第42张图片

  • 在GitLab的:管理——>设置——>网络——>外发请求中,打开外法请求

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第43张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第44张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第45张图片

  • 添加WebHook:WebHook就是一个接收HTTP POST(或GET,PUT,DELETE)的URL。一个实现了WebHook的API提供商就是在当事件发生的时候会向这个配置好的URL发送一条信息。与请求-响应式不同,使用WebHooks,可以实时接受到变化

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第46张图片

  • 勾选的Rrigger的条目触发构建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第47张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第48张图片

  • WebHook添加成功

在这里插入图片描述

  • 构建时执行shell命令:ls -l

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第49张图片测试:有push事件时触发jinkens构建
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第50张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第51张图片

  • jinkens自动检测到代码仓库的变更,触发构建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第52张图片

  • 查看控制台的输出,成功实现在向 GitLab push 代码时,自动 trigger Jenkins 工程执行构建动作

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第53张图片私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第54张图片

jenkins使用

Jenkins自动构建docker镜像,并上传至harbor仓库

server1:构建Dockerfile

[root@server1 test]# cat Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
[root@server1 test]# echo www.baidu.com >> index.html
[root@server1 test]# git add *
[root@server1 test]# git commit -m "update dockfile v1"
[master 727b84c] update dockfile v1
 1 file changed, 3 insertions(+), 1 deletion(-)
[root@server1 test]# git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:root/test.git
   56c5de5..727b84c  master -> master

修改docker.sock权限,不然jenkins无法直接执行docker命令:
chmod 777 /var/run/docker.sock

docker tag nginx:latest localhost:5000/nginx:latest
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
netstat -antlp

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第55张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第56张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第57张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第58张图片

在这里插入图片描述

[root@server1 test]# cat Dockerfile 
FROM nginx
COPY index.html /usr/share/nginx/html
EXPOSE  80
[root@server1 test]# git commit -a -m "update dockfile v2"
[master 1d3cceb] update dockfile v2
 1 file changed, 1 insertion(+)
[root@server1 test]# git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 368 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:root/test.git
   727b84c..1d3cceb  master -> master
[root@server10 harbor]# cd /etc/docker/
[root@server10 docker]# ls
ca.pem  certs.d  daemon.json  key.json  server-key.pem  server.pem
[root@server10 docker]# scp -r certs.d/   server2:/etc/docker/

在这里插入图片描述

Jenkins使用tls方式连接docker构建主机
生成key和ca证书

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

生成server-key和csr文件(server3为dcker主机名)

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=server3" -sha256 -new -key server-key.pem -out server.csr

可以使用ip地址方式进行tls连接

echo subjectAltName = DNS:server3,IP:172.25.12.3,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem   -CAcreateserial -out server-cert.pem -extfile extfile.cnf

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210319214617252.png)

@[TOC](私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建)


项目本地开发完成后,需要将代码部署到线上服务器。随之微服务、集群等的流行,单靠传统的部署显然是无法满足当下的需求;我们可以通过Gitlab和Jenkins这两个常用的开源项目,便可搭建自己公司的代码管理工具和自动化部署平台


 `GitLab`是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。


 `Jenkins` 是一个开源的持续集成系统,方便开发者利用图形化界面进行项目部署发布等固定操作,通常也会和 Gitlab 配合起来,在 git push 完成后触发设定好的操作,例如将代码部署到某个开发环境中
 
# 1 GitLab(私有仓库)的部署

## 1.1 GitLab的简介

GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找

## 1.2 Gitlab的安装
官网:[https://about.gitlab.com/install/](https://about.gitlab.com/install/)
 
(1) 安装:`yum install -y gitlab-ce-13.2.2-ce.0.el7.x86_64.rpm`

(2)访问gitlab的地址:`vim /etc/gitlab/gitlab.rb`![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312211014196.png)(3)重载服务: `gitlab-ctl  reconfigure`			

(4) 常用命令
|命令|功能  |
|--|--|
|gitlab-ctl start    	|	 启动所有 gitlab 组件|
|gitlab-ctl stop      |  	停止所有 gitlab 组件|
|gitlab-ctl restart       	| 	 重启所有 gitlab 组件|
|gitlab-ctl status    |    		查看服务状态|
|gitlab-ctl reconfigure    | 	 重载服务|
|gitlab-ctl tail        | 查看日志|

## 1.3 登录gitlab
在浏览器端登陆:http://172.25.12.1,用户root 第一次登录需要强制修改密码
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312142831382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)

 - 登录gitlab

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210313220736612.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)
 - 将界面设置为中文模式

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312143106614.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/2021031214314439.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312143254675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)


## 1.4 Gitlab的使用

(1)新建项目
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312143339143.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312143440902.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312143457301.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/2021031214362965.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70)(2)添加ssh密钥
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312143658944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTgyODgz,size_16,color_FFFFFF,t_70) 

 - 查看私钥

```bash
[root@server1 ~]#  cd .ssh/
[root@server1 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@server1 .ssh]# cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2/6raP/kBbUqAhPQBtNDNO5Lgsu9hU+92yQTkRIgy8fKPYay
TxDTfb0QDEviw2cN94RmVbwSih2B1X/vFG/vilUsEYa/wflhB3/MuAYZBv5tjUSq
B/9zdY6v2UkbmG75AfE0wcNl7E5K3DIPuPNUl230QKTwxhqLrBvuFCHOCS2mUz4p
prERJ0P8P+Ha91MwhBqjRq+hU7RjR9v/VdE/2999CXPf3boYoF71w9KnhQT1UaMA
o/UnbwPRmjznoF9TQ8OvFARN4hsu6g1lVbmb5q0wlpxLmiIld6ntxPjIPa9+0Dr5
wGV2dpxeErKunKHRuhP3zEffPWZ+Ov4njoyJ8QIDAQABAoIBAGJEXZinRNlv1PXc
l72UvJ52GvCvxVY5CltKwBq6+D9OXP4inp9GqtGtk++KLh6Od+SqFXQScE2VZJtT
bB266krmRKsHf7xLgpXw9ib1QlSnbZP+qdystIw8UjxCtbrfRwchESnD+FEXn8S/
79nzh0Ok78e4ZXx3+w/D4hLIDtp136MGYh83NO6gmi615hvEyaz+K5JZyhEwkaHO
04d/X8/QRL3LqZ6+oyO/7ne6j3Z4qR+Uuq0GfXTQmCCUtcbW6KHqzYV7+2edrzsB
6DWFt2YQ9w2PRurZB9UU7fVKCL0q8NXUG9nHxnRc4bda/oYZKIEr7dh+isRRMl4c
zZyLIGECgYEA70ak9aFDZVGxzkuVeI9MdpXQJMTQ/UYkLB2Vj1ADWFCxv6nfpZwb
3yGoLuBqitQUF3yCzl4Jbz467bqtPPBkjJcvsiDaTfXGRLw4sBXr9IjWJX/gh0Fo
o6gwdXzz251c4vY7irrLbBqsnDgBntzDoadOlv0ENQ6g8pKVx5hJLyUCgYEA618H
PWG+/4HruIhv86VEpT3+cWuX1oU00s3+itT27KPtHBAwUBAMo7U4f21tnGk7KtIw
UeErKzFhAl2NIKkwAKVgjh0b9wqzwVWBbYcuLC/bF1g6945U6qThPvcGAinQU4qe
yYQFq+Caeca2QdBGuEO0OqkQHGbhMO0ZD3qjS90CgYBe8cRBJ1VL3efU+Q79gLcR
kw69mE9pQKzXyIFxFYnOQG7Xo7t3xoMUvhEzUJ9WKSMz0pdA9fV+a84MSPe255iu
ZMtrPjgBmVWsLpe732b6aFW5GY3pfZ3c2r8nz4YgDcgu0w/7U3WmlssJTfvuoqEK
Aw5fQVSrDPv2ZQ4D3jyj9QKBgG+RTuQ4pgmFMw/4lGCAcWaGWUq3/nQwFhbqkAKM
6jLHjUglIFGDGgqrhwlX/IIMm4Azu7XELus9b8doQtI9gER+H6Odhrj2OLim6D/b
uPY3BPou11yq+fNzjlWDUDTMTzSaW6QX0XxkbbTVjWTq7erAJPk9VCayWYIQkTV2
I1t9AoGBALBRJ7cVfhXnmPlXLXya1oxyqxDGwanoDt3g2OUI+xyqCzft6CRpPh0U
ofnbCjl3PbUEJVvtOaumeb9l+QIwPHHUAjmjOujDJ4Ho4ILP8EQeG5K6/HIed166
kqNFU5TsHHzpjxj4r+WGsIX8OQ0bu+rC0QtCSd5gSqrlmNmcs6me
-----END RSA PRIVATE KEY-----

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第59张图片

  • ssh密钥添加成功

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第60张图片(3)克隆gitlab的项目到本地
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第61张图片

git clone [email protected]:root/test.git

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第62张图片

2 jenkins的部署

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成

2.1 Jenkins的安装

(1)软件下载:https://jenkins.io/zh/download/

(2)软件安装(java环境):

yum install jdk-8u171-linux-x64.rpm jenkins-2.279-1.1.noarch.rpm -y

(3)启动服务:systemctl start jenkins

  • 安装apache服务:yum install -y httpd
  • 安装git工具:yum install git -y

(4)更新插件源(解决安装出错问题)

1 编辑文件:cd /var/lib/jenkins/updates

在这里插入图片描述

  • jenkins在下载插件之前会先检查网络连接,其会读取这个文件中的网址。将默认访问谷歌的路径改为www.baidu.com,以及将更新jenkins的源改为清华源
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
sed -i.bak 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
  • 将更新的文件放到apache的发布目录:cp default.json /var/www/html/

2 编辑文件:

vim  /var/lib/jenkins/hudson.model.UpdateCenter.xml 
  • 该文件为jenkins下载插件的源地址,改地址默认jenkins默认为:https://updates.jenkins.io/update-center.json,就是因为https的问题,此处将其改为修改后的存放default.json的apache服务的路径,之后重启jenkins服务即可
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://172.25.12.2/default.json</url>
  </site>
</sites>
  • 重启 jenkins服务:systemctl start jenkins

  • 查看服务监听的端口号为8080:netstat -antlp

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第63张图片

2.2 Jenkins的使用

2.2.1 Jenkins的登陆和更新插件

(1)在浏览器端登陆:http://172.25.12.2:8080/

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第64张图片

(2)查看Jenkins初始密码文件

[root@server2 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
4194fe7032684e8481eca112d84e8da8

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第65张图片(3)安装插件
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第66张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第67张图片
(4)使用admin账户登陆
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第68张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第69张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第70张图片

2.2.2 创建测试工程

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第71张图片

  • 在输入框中输入工程名,选择 构建一个自由风格的软件项目,然后点击左下角的 确定按钮,进入工程配置页面

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第72张图片私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第73张图片

  • 查看仓库的URL

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第74张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第75张图片

  • 如果是SSH形式的 URL,选择jenkins凭据的类型

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第76张图片

  • 查看部署GitLab服务虚拟机的私钥

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第77张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第78张图片

  • 选择Credentials用户为root

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第79张图片

2.3 Jenkins构建的两种方式

2.3.1 Jenkins以轮询的方式触发构建

  • 构建触发器为轮询SCM模式,每分钟轮询一次,有更新时触发jinkens构建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第80张图片

  • 构建时执行shell命令:ls -l,保存配置

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第81张图片

  • Git提交代码到gitlab,jinkens轮询检测到代码仓库的变更,触发构建

查看控制台的输出

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第82张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第83张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第84张图片

2.3.2 GitLab 自动触发 Jenkins 构建

(1)安装GitLab插件
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第85张图片私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第86张图片(2)配置Demo项目

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第87张图片

  • 构建触发器时选择:Build when a change is pushed to GitLab. GitLab webhook URL: http://172.25.12.2:8080/project/Demo

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第88张图片

  • 点击高级

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第89张图片

  • 生成Secret token

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第90张图片

  • 在GitLab的:管理——>设置——>网络——>外发请求中,打开外法请求

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第91张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第92张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第93张图片

  • 添加WebHook:WebHook就是一个接收HTTP POST(或GET,PUT,DELETE)的URL。一个实现了WebHook的API提供商就是在当事件发生的时候会向这个配置好的URL发送一条信息。与请求-响应式不同,使用WebHooks,可以实时接受到变化

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第94张图片

  • 勾选的Rrigger的条目触发构建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第95张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第96张图片

  • WebHook添加成功

在这里插入图片描述

  • 构建时执行shell命令:ls -l

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第97张图片测试:有push事件时触发jinkens构建
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第98张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第99张图片

  • jinkens自动检测到代码仓库的变更,触发构建

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第100张图片

  • 查看控制台的输出,成功实现在向 GitLab push 代码时,自动 trigger Jenkins 工程执行构建动作

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第101张图片私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第102张图片

jenkins使用

Jenkins自动构建docker镜像,并上传至harbor仓库

server1:构建Dockerfile

[root@server1 test]# cat Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
[root@server1 test]# echo www.baidu.com >> index.html
[root@server1 test]# git add *
[root@server1 test]# git commit -m "update dockfile v1"
[master 727b84c] update dockfile v1
 1 file changed, 3 insertions(+), 1 deletion(-)
[root@server1 test]# git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:root/test.git
   56c5de5..727b84c  master -> master

修改docker.sock权限,不然jenkins无法直接执行docker命令:
chmod 777 /var/run/docker.sock

docker tag nginx:latest localhost:5000/nginx:latest
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
netstat -antlp

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第103张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第104张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第105张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第106张图片

在这里插入图片描述

[root@server1 test]# cat Dockerfile 
FROM nginx
COPY index.html /usr/share/nginx/html
EXPOSE  80
[root@server1 test]# git commit -a -m "update dockfile v2"
[master 1d3cceb] update dockfile v2
 1 file changed, 1 insertion(+)
[root@server1 test]# git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 368 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:root/test.git
   727b84c..1d3cceb  master -> master

server2和server3

[root@server10 harbor]# cd /etc/docker/
[root@server10 docker]# ls
ca.pem  certs.d  daemon.json  key.json  server-key.pem  server.pem
[root@server10 docker]# scp -r certs.d/   server2:/etc/docker/

/etc/hosts

在这里插入图片描述

在这里插入图片描述

Jenkins使用tls方式连接docker构建主机
生成key和ca证书

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

生成server-key和csr文件(server3为dcker主机名)

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=server3" -sha256 -new -key server-key.pem -out server.csr

可以使用ip地址方式进行tls连接

echo subjectAltName = DNS:server3,IP:172.25.12.3,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem   -CAcreateserial -out server-cert.pem -extfile extfile.cnf


Jenkins使用tls方式连接docker构建主机

安装docker证书:
cp ca.pem server-cert.pem server-key.pem /etc/docker/
cp /usr/lib/systemd/system/docker.service /etc/systemd/system
vim /etc/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376

在这里插入图片描述

systemctl daemon-reload
systemctl restart docker.service
netstat -antlp|grep 2376

Jenkins使用tls方式连接docker构建主机

生成客户端key和证书

openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem   -CAcreateserial -out cert.pem -extfile extfile.cnf

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第107张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第108张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第109张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第110张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第111张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第112张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第113张图片
构建

在这里插入图片描述

添加docker交付任务

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第114张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第115张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第116张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第117张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第118张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第119张图片

docker ps -a | grep webserver && docker rm -f webserver
docker run -d --name webserver -p 80:80 reg.westos.org/library/nginx:latest

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第120张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第121张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第122张图片

[root@server1 test]# echo hello world! > index.html 
[root@server1 test]# git commit -a -m "update dockfile v3"
[master 1234205] update dockfile v3
 1 file changed, 1 insertion(+), 3 deletions(-)
[root@server1 test]# git push

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第123张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第124张图片

在这里插入图片描述

再次触发

[root@server1 test]# echo www.baidu.com > index.html 
[root@server1 test]# git commit -a -m "update dockfile v4"
[master 06a2dab] update dockfile v4
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@server1 test]# git push

在这里插入图片描述

添加ansible交付任务:
Jenkins服务器提前部署好到目标主机的ssh免密,并安装ansible软件包。

由于是以jenkins用户调用ansible命令,所以需要设置jenkins用户到目标主机的免密。

新建playbook代码仓库
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第125张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第126张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第127张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第128张图片

[root@server2 ~]# cd /var/lib/jenkins/workspace/
[root@server2 workspace]# ls
Demo  Demo@tmp  Docker  playbook  playbook@tmp  Test1
[root@server2 workspace]# cd playbook
[root@server2 playbook]# ls
README.md

usermod -s /bin/bash jenkins

在这里插入图片描述

-bash-4.2$ ssh-copy-id server4
-bash-4.2$ ssh-copy-id server4
-bash-4.2$ id jenkins
uid=998(jenkins) gid=996(jenkins) groups=996(jenkins)

server4和server5

groupadd -g 996 jenkins
useradd -u 998 -g 996 jenkins
echo westos | passwd --stdin jenkins

visudo
在这里插入图片描述

[root@server1 playbook]# cat ansible.cfg
[defaults]
command_warnings=False
remote_user=jenkins

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

在这里插入图片描述
在这里插入图片描述

[root@server1 playbook]# cat playbook.yml
---
- hosts: all
  tasks: 
    - name: install httpd
      yum:
        name: httpd
        state: present
    - name: start httpd
      service:
        name: httpd
        state: started

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第129张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第130张图片

cd $WORKSPACE
ansible-playbook -i inventory/$deploy   playbook.yml
cd $WORKSPACE
ansible-playbook -i inventory/$deploy   playbook.yml

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第131张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第132张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第133张图片

在这里插入图片描述

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第134张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第135张图片
在这里插入图片描述

export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl run webserver --image=nginx:latest

在这里插入图片描述

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第136张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第137张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第138张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第139张图片

vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第140张图片
私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第141张图片
在这里插入图片描述

[root@server3 ~]# cd /etc/kubernetes/
[root@server3 kubernetes]# ls
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf
[root@server3 kubernetes]# scp admin.conf server2:/var/lib/jenkins/.kube/config
[root@server2 ~]# cd /var/lib/jenkins/.kube/
[root@server2 .kube]# ls
config
[root@server2 .kube]# chown jenkins config 

在这里插入图片描述

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第142张图片

私有代码管理平台(Gitlab)和自动化部署平台(Jenkins)的搭建_第143张图片
在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(企业部分)