> For the complete documentation index, see [llms.txt](https://hezhiqiang.gitbook.io/about-the-author/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hezhiqiang.gitbook.io/about-the-author/yun-wei-huan-jing-da-jian/untitled.md).

# CI & CD 持续集成部署

#### 博客作者：联系请[点击](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)，搬运不易，希望请作者喝咖啡，可以点击联系[博客作者](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)

### CI / CD 的优点是什么？

* **集成：** GitLab CI / CD是GitLab的一部分，支持从计划到部署（甚至更多）的单个对话
* **开源：** CI / CD是开源GitLab社区版和专有GitLab企业版的一部分
* **易于学习：** 请参阅GitLab的 [快速入门](https://docs.gitlab.com/ee/ci/quick_start/) 指南
* **无缝：** 是单个GitLab应用程序的一部分，具有出色的用户体验
* **可扩展：** 测试可以在单独的计算机上分布式运行，您可以根据需要添加任意数量的计算机
* **更快的结果：** 每个构建可以拆分为多个作业，这些作业可以在多台计算机上并行运行
* **针对交付进行了优化：** 多个阶段，手动部署门， [环境](https://docs.gitlab.com/ee/ci/environments.html) 和 [变量](https://docs.gitlab.com/ee/ci/variables/)

![](/files/-LxvJQ4elpVJz5d0OEGP)

### 特征

* **多平台：** 您可以在Unix，Windows，macOS和任何其他支持Go的平台上执行构建。
* **多语言：** 构建脚本是命令行驱动的，并且可以与Java，PHP，Ruby，C和任何其他语言一起使用。
* **稳定：** 您的构建在与GitLab不同的机器上运行。
* **并行构建：** GitLab CI / CD在多台机器上拆分构建，以实现快速执行。
* **实时日志记录：** 合并请求中的链接将您带到动态更新的当前构建日志。
* **灵活的管道：** 您可以在每个阶段定义多个并行作业，并且可以 [触发其他构建](https://docs.gitlab.com/ee/ci/triggers/)。
* **版本管道：** 一个 [.gitlab-ci.yml文件](https://docs.gitlab.com/ee/ci/yaml/) 包含您的测试，整个过程的步骤，使每个人都能贡献更改，并确保每个分支获得所需的管道。
* **自动缩放：** 您可以 [自动旋转虚拟机](https://about.gitlab.com/blog/2016/03/29/gitlab-runner-1-1-released/) ，以确保立即处理您的构建并将成本降至最低。
* **构建工件：** 您可以将二进制文件和其他[构建工件](https://docs.gitlab.com/ee/ci/build_artifacts/)上载到 GitLab并浏览和下载它们。
* **本地测试** 有 [多个执行程序](https://docs.gitlab.com/runner/executors/) ，您可以 [在本地复制测试](https://gitlab.com/gitlab-org/gitlab-runner/issues/312)。
* **Docker支持：** 您可以使用自定义Docker映像， 作为测试的一部分启动 [服务](https://docs.gitlab.com/ee/ci/services/)， [构建新的Docker映像](https://docs.gitlab.com/ee/ci/docker/using_docker_build.html)，甚至可以在Kubernetes上运行。
* **容器注册表：** [内置的容器注册表，](https://docs.gitlab.com/ee/user/project/container_registry.html) 用于存储，共享和使用容器映像。
* **受保护的变量：** 在部署期间使用[受](https://docs.gitlab.com/ee/ci/variables/README.html#protected-variables)每个环境保护的[变量](https://docs.gitlab.com/ee/ci/variables/README.html#protected-variables)安全地存储和使用机密信息
* **环境：** 定义多个环境，包括临时 [Review Apps](https://about.gitlab.com/features/review-apps/) ，请参阅每个环境的部署历史记录。

## 一、Jenkins简介

{% embed url="<https://jenkins.io/zh/>" %}

[Jenkins](https://zh.wikipedia.org/wiki/Jenkins_\(%E8%BD%AF%E4%BB%B6\))是一款开源 CI\&CD 软件，用于自动化各种任务，包括构建、测试和部署软件。

Jenkins 支持各种运行方式，可通过系统包、Docker 或者通过一个独立的 Java 程序。<br>

## 二、GitLab简介

{% embed url="<https://about.gitlab.com>" %}

[GitLab](https://zh.wikipedia.org/wiki/GitLab)是一个完整的DevOps平台，作为单个应用程序提供，从根本上改变了开发，安全和运营团队的协作方式。GitLab帮助团队将软件交付时间从数周缩短至数分钟，降低开发成本，并降低应用程序漏洞的风险，同时提高开发人员的生产率。

### **主机配置**

![](/files/-LxQXtYv_iuc50fDQA6B)

## **三、GitLab环境部署**

### **安装依赖包。**

```
sudo yum install -y curl policycoreutils-python openssh-server
```

![](/files/-LxQXtYwXWL0CamKKDAv)

### **设置SSH开机自启动并启动SSH服务。**

```
sudo systemctl enable --now sshd
```

### **安装Postfix来发送通知邮件。**

```
sudo yum install postfix
```

### **设置Postfix开机自启动。**

```
sudo systemctl enable postfix
```

### **启动Postfix服务**。

输入命令vim /etc/postfix/main.cf打开main.cf文件并找到下图内容：

```
vim /etc/postfix/main.cf
```

![](/files/-LxQXtYxljQOzEevFxv4)

将这行代码改为inet\_interfaces = all，然后按Esc键，然后输入:wq并回车以保存并关闭main.cf文件。

输入命令sudo systemctl start postfix启动Postfix服务。

```
sudo systemctl start postfix
```

## **四、添加GitLab软件包仓库。**

```
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
```

### **安装GitLab。**

```
sudo EXTERNAL_URL="GitLab服务器的公网IP地址" yum install -y gitlab-ce
```

![](/files/-LxQXtYydE21ozygXlkU)

这个是我gitlab公网ip

![](/files/-LxQXtYz8mH_0lb9nbuk)

安装完成会出现如下图片：

![](/files/-LxQXtZ-voal8s56S8d_)

说明已经自动启动getlab服务，如没有出现以上情况则说明硬件配置太低或输入systemctl restart gitlab-runsvdir.service 重启gitlab服务

```
systemctl restart gitlab-runsvdir.service 
```

其他操作命令：

```
sudo gitlab-ctl status      #查看服务的状态
sudo gitlab-ctl start       #启动
sudo gitlab-ctl stop        #关闭
sudo gitlab-ctl restart     #重启
```

```
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb     #gitlab配置文件
```

![](/files/-LxQXtZ0ZkvonutWBduS)

如果修改了配置文件，需要执行 gitlab-ctl reconfigure 进行更新配置（只要修改了该文件，必须执行该命令才能生效）

```
gitlab-ctl reconfigure
```

执行 gitlab-ctl restart 重启服务，我这里不做修改

```
gitlab-ctl restart
```

服务启动成功后即可通过公网IP去访问，如果修改了端口，IP后面就要加上端口去访问

**使用浏览器访问GitLab服务器的公网IP地址，显示如下页面，说明环境搭建成功**。

![](/files/-LxQXtZ1xW_v2tU-2HAO)

管理员默认为root用户，初始密码不能低于8位

![](/files/-LxQXtZ2vgWM9iRjcRrU)

![](/files/-LxQXtZ3NP7o97pb66uU)

![](/files/-LxQXtZ4bb7AeNZyKnGQ)

![](/files/-LxQXtZ5QUvbcuaU56fE)

![](/files/-LxQXtZ6a-ilkTIX815s)

把要克隆或要上传代码这台服务器的公钥cat /root/.ssh/id\_rsa.pub打开公钥文件复制到gitlab服务器指定位置上

```
cat /root/.ssh/id_rsa.pub
```

![](/files/-LxQXtZ7SuuopnJZXJH6)

### 添加公钥

![](/files/-LxQXtZ8F1A1u1SePFTd)

\#克隆代码仓库，然后测试是否能够上传代码到gitlab

![](/files/-LxQXtZ9aA2ElrLSawBo)

![](/files/-LxQXtZAqEC4CQ9-K6J3)

```
yum -y install git                         #安装git
git clone git@139.9.91.82:root/test.git    #克隆远程仓库
cd test/
echo 11111 > 1.txt
git add .
git commit -m "add 1.txt"
git push
```

![](/files/-LxQXtZBWYxQ8NcLcKKI)

## **五、Jenkins环境部署**

### **系统要求**

#### **最低推荐配置:**

256MB可用内存

1GB可用磁盘空间(作为一个[Docker](https://jenkins.io/zh/doc/book/installing/%22%20/l%20%22docker)容器运行jenkins的话推荐10GB)为小团队推荐的**硬件配置:**

1GB+可用内存

50 GB+ 可用磁盘空间

### **软件配置:**

Java 8—​无论是Java运行时环境（JRE）还是Java开发工具包（JDK）都可以。

### **安装JDK**

```
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
```

### **安装tomcat**

```
[root@jenkins ~]# tar -xf apache-tomcat-9.0.6.tar.gz
[root@jenkins ~]# mv apache-tomcat-9.0.6 /usr/local/tomcat
```

![](/files/-LxQXtZCn1l9dMeylTt0)

访问jenkins官网 [下载Jenkins](https://jenkins.io/zh/)

{% embed url="<https://jenkins.io/zh/>" %}

![](/files/-LxQXtZDve9gpVxhl-dr)

## **六、下载Jenkins**

![](/files/-LxQXtZEhMGyXt1zRQfb)

```
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
```

![](/files/-LxQXtZF7313mPaLB5EZ)

两种方式使用其中一种就可以下载了

![](/files/-LxQXtZGlOle4YmTspMG)

```
[root@jenkins ~]# ls
apache-tomcat-9.0.6.tar.gz baidu.html index.html jenkins.war
[root@jenkins ~]# cd /usr/local/tomcat/         #切换到tomcat目录
[root@jenkins tomcat]# pwd
/usr/local/tomcat
[root@jenkins tomcat]# rm -rf webapps/*         #删除tomcat根目录下其他默认文件
[root@jenkins tomcat]# ls webapps/
[root@jenkins tomcat]# mv /root/jenkins.war /usr/local/tomcat/webapps/ #移动下载好的jenkins.war包到tomcat网页根目录下
[root@jenkins tomcat]# ls
bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
[root@jenkins tomcat]# ./bin/startup.sh         #启动tomcat服务
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@jenkins tomcat]# ls webapps/              #tomcat服务启动会自动解jenkins.war包
jenkins jenkins.war
```

**然后访问**<http://139.159.189.191:8080/jenkins> **见到如下图片就说明安装成功：**

![](/files/-LxQXtZHxaxx63D1hflr)

![](/files/-LxQXtZImoWxsvr1DYUU)

### **插件安装：**

![](/files/-LxQXtZJp6ZMjBbYSJkm)

{% hint style="danger" %}

#### **注意：**

#### &#x20; **打×的插件是由于网络传输导致的安装失败，后面再重新安装即可。**

#### &#x20; 插件安装可以自定义，可以用社区推荐安装，工作需要的插件一定要安装上

{% endhint %}

### **安装完成出现如下页面：**

![](/files/-LxQXtZK0DYAG7dxs3CN)

![](/files/-LxQXtZLU4VnZTY45P8t)

![](/files/-LxQXtZM7VDxdO53eN5n)

![](/files/-LxQXtZNdZ-7ZFJ3o7ga)

![](/files/-LxQXtZOXsp4ACi7EysI)

如果插件没安装完会出现如下页面，点纠正安装相关插件就好了：

![](/files/-LxQXtZPl9IdcIp9nkPP)

**必须需要添加的6个插件：**&#x47;itlab Hook、Build Authorization Token Root、Publish Over SSH、Gitlab Authentication、Gitlab、Git Parameter

![](/files/-LxQXtZQTTtPBPMrheHX)

![](/files/-LxQXtZR5jN_Kns6Gpf9)

![](/files/-LxQXtZSwhw6JRNFWXmQ)

![](/files/-LxQXtZT30TRvoqlu4-v)

## **七、配置Jenkins**

![](/files/-LxQXtZUTs0ks1jJgeg3)

### **进来系统设置如下图，然后鼠标往下滑：**

![](/files/-LxQXtZVOUb10Z7OPSSE)

### **部署密钥：**

**#添加主机：系统管理 - 系统设置 找到Publish over SSH**

![](/files/-LxQXtZWjKs2FCLdCWRo)

开始添加要部署代码的主机，注意一定是要能够ssh登陆的用户。

![](/files/-LxQXtZX9zR-KU2xl0Lv)

![](/files/-LxQXtZYbUZdgzArZguM)

**这里要注意的是要先把jenkins服务器的公钥传送给要部署代码的那台机然后再点测试**

![](/files/-LxQXtZZMhtbIudgcFpV)

**#添加完主机之后，新建一个项目，开始配置构建操作**

![](/files/-LxQXtZ_k6XCbwk8Q-_C)

![](/files/-LxQXtZa3TtjS9-kLLg4)

![](/files/-LxQXtZbvTW7LbPQIrVR)

![](/files/-LxQXtZchSjr3DdM0ZwA)

![](/files/-LxQXtZdrreNklhUsq_u)

![](/files/-LxQXtZeP5FtGJCdH-A0)

![](/files/-LxQXtZf1Np5XzPmNoZX)

![](/files/-LxQXtZgZhQbAKzP2hhL)

添加完后，选择root或git用户进行认证没有任何提示表示成功

### **构建触发器**

![](/files/-LxQXtZharnay3cZESBF)

这里一定要勾上

![](/files/-LxQXtZiM5PSnxbuLYPR)

![](/files/-LxQXtZjsER01Px7hxLI)

## **八、配置Gitlab，当有代码提交时，触发Jenkins的部署操作**

![](/files/-LxQXtZkQ9YO660NaYl3)

![](/files/-LxQXtZl6o7EDsLZ7PEN)

![](/files/-LxQXtZm0rTArPEl4bKO)

![](/files/-LxQXtZnh5yrwWbJNHub)

![](/files/-LxQXtZomGuvjzqqGi0h)

### **测试提交代码是否会部署到远程主机**

\#再次克隆仓库

```
git clone git@139.9.91.82:root/test.git
cd test/
echo '测试Jenkins' > index.html
git add .
git commit -m 'add index.html'
git push
```

![](/files/-LxQXtZpwcioLMAoX1cE)

\#提交之后去Jenkins页面看看

![](/files/-LxQXtZqJPQAp9nc92aQ)

![](/files/-LxQXtZrECbfnVKu-FeG)

![](/files/-LxQXtZsjY2bKi3yUUHC)

## 九、查看部署好的web服务器

![](/files/-LxQXtZt5pxMXxMHAWu_)

### 访问web测试页面

![](/files/-LxQXtZukkvh7JHrLTlk)

访问成功

## 十、总结

### 小坑：

#### 错误提示：

\#很多朋友使用最新版本的gitlab做自动部署时，在增加web钩子那一步，

\#点击test push events时会报错：Url is blocked: Requests to the local network are not allowed

![](/files/-LxQXtZvx3t-Od2qJBkU)

### **解决方法：**

\#这是因为新版的gitlab为了安全默认禁止了本地局域网地址调用web hook

\#我们在设置里允许就行，具体步骤如下：

![](/files/-LxQXtZwGj0wbX2rj94H)

![](/files/-LxQXtZxmT-rjfmO60UC)
