# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hezhiqiang.gitbook.io/about-the-author/yun-wei-huan-jing-da-jian/untitled.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
