持续集成工具之 Jenkins
持续集成及 Jenkins 介绍
软件开发生命周期
软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试 和部署过程的集合。如下图所示 :
- 需求分析
这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部 或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。 还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
- 设计
第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目 计划。计划可以使用图表,布局设计或者文者的方式呈现。
- 实现
第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进 行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
- 测试
测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
- 进化
最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修 改,bug 修复,功能增加等。
软件开发瀑布模型
瀑布模型是最著名和最常使用的软件开发模型。瀑布模型就是一系列的软件开发过程。它是由制造业繁 衍出来的。一个高度化的结构流程在一个方向上流动,有点像生产线一样。在瀑布模型创建之初,没有 其它开发的模型,有很多东西全靠开发人员去猜测,去开发。这样的模型仅适用于那些简单的软件开发,但是已经不适合现在的开发了。
下图对软件开发模型的一个阐述。
优势 | 劣势 |
---|---|
简单易用和理解 | 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。 |
当前一阶段完成后,您只需要去关注后续阶段。 | 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。 |
为项目提供了按阶段划分的检查节点 | 瀑布模型的突出缺点是不适应用户需求的变化。 |
软件的敏捷开发
什么是敏捷开发?
敏捷开发(Agile Development)的核心是迭代开发(Iterative Development)与 增量开发(Incremental Development)。
- 何为迭代开发?
对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次“大开发”;迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次“大开发”变成多次“小开发”,每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。
- 何为增量开发?
软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。
敏捷开发如何迭代?
虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。
敏捷开发有什么好处?
- 早期交付
敏捷开发的第一个好处,就是早期交付,从而大大降低成本。
- 降低风险
敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。
什么是持续集成?
持续集成(Continuous integration,简称 CI)指的是,频繁地(一天多次)将代码集成到主干。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
通过持续集成,团队可以快速的从一个功能到另一个功能,简而言之,敏捷软件开发很大一部分都要归功于持续集成。
持续集成的流程
根据持续集成的设计,代码从提交到生产,整个过程有以下几步。
- 提交
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
- 测试(第一轮)
代码仓库对 commit 操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
- 构建
通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS 脚本、图片)等等。
- 测试(第二轮)
构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。
- 部署
过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。
- 回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指 向上一个版本的目录。
持续集成的组成要素
- 一个自动构建过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预。
- 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用 SVN 或 Git。
- 一个持续集成服务器, Jenkins 就是一个配置简单和使用方便的持续集成服务器。
持续集成的好处
- 降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少;
- 对系统健康持续检查,减少发布风险带来的问题;
- 减少重复性工作;
- 持续部署,提供可部署单元包;
- 持续交付可供使用的版本;
- 增强团队信心;
Jenkins 介绍
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动 化构建、测试和部署等功能。官网:Jenkins。
Jenkins 的特征:
- 开源的 Java 语言开发持续集成工具,支持持续集成,持续部署。
- 易于安装部署配置:可通过 yum 安装,或下载 war 包以及通过 docker 容器等快速实现安装部署,可方便 web 界面配置管理。
- 消息通知及测试报告:集成 RSS/E-mail 通过 RSS 发布构建结果或当构建完成时通过 e-mail 通知,生成 JUnit/TestNG 测试报告。
- 分布式构建:支持 Jenkins 能够让多台计算机一起构建/测试。
- 文件识别:Jenkins 能够跟踪哪次构建生成哪些 jar,哪次构建使用哪个版本的 jar 等。
- 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如 git,svn,maven,docker 等。
Jenkins 安装与配置
安装 Jenkins
Docker 安装 Jenkins(推荐)
Docker 安装与配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34BASH
# 1、卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、需要的安装包
yum install -y yum-utils
# 3、设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的,十分慢!
# 建议使用阿里云的镜像地址
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast
# 4、安装docker相关的 docker-ce 社区版 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 5、启动docker
systemctl start docker
# 6、使用docker version查看是否安装成功使用 Docker 安装 Jenkins
1
2
3
4
5
6
7
8
9AWK
# 使用命令直接安装
docker run -d --name jenkins --restart always \
--user root -p 8180:8080 -p 51000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /opt/maven/apache-maven-3.6.3:/opt/maven/apache-maven-3.6.3 \
-v /usr/local/java/jdk1.8.0_251:/usr/local/java/jdk1.8.0_251 \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
War 安装 Jenkins
- 获取 Jenkins 安装包
下载页面:https://jenkins.io/zh/download/
安装文件:jenkins.war
1 | ARDUINO |
解锁 Jenkins
获取并输入 admin 账户密码(我这里是 docker 安装的,目录是映射到指定位置的,密码实际存放路径以提示为主)
1 | cat /var/jenkins_home/secrets/initialAdminPassword |
跳过插件安装
因为 Jenkins 插件需要连接默认官网下载,速度非常慢,而且容易安装失败,所以我们暂时先跳过插件安装。
添加一个管理员账户,并进入 Jenkins 后台
保存并完成
开始使用 Jenkins
Jenkins 插件管理
Jenkins 本身不提供很多功能,我们可以通过使用插件来满足我们的使用。例如从 Gitlab 拉取代码,使用 Maven 构建项目等功能需要依靠插件完成。接下来演示如何下载插件。
修改 Jenkins 插件下载地址
Jenkins 国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址:
1 | Jenkins -> Manage Jenkins -> Manage Plugins,点击Available |
这样做是为了把 Jenkins 官方的插件列表下载到本地,接着修改地址文件,替换为国内插件地址:
1 | JBOSS-CLI |
最后,Manage Plugins 点击 Advanced,把 Update Site 改为国内插件下载地址
Sumbit 后,在浏览器输入: http://120.78.204.65:8180/restart ,重启 Jenkins。
下载中文汉化插件
1 | Jenkins -> Manage Jenkins -> Manage Plugins,点击Available,搜索"Chinese" |
完成后如下图所示:
重启 Jenkins 之后,就看到 Jenkins 汉化了!(PS:某些菜单可能会汉化失败)
Jenkins 用户权限管理
我们可以利用Role-based Authorization Strategy
插件来管理 Jenkins 用户权限
安装 Role-based Authorization Strategy 插件
开启权限全局安全配置
授权策略切换为”Role-Based Strategy”,保存
创建角色
在系统管理页面进入 Manage and Assign Roles
点击”Manage Roles”
Global roles(全局角色)
:管理员等高级用户可以创建基于全局的角色
Item roles(项目角色)
: 针对某个或者某些项目的角色
Node roles(节点角色)
:节点相关的权限
我们添加以下三个角色:
- baseRole:该角色为全局角色。这个角色需要绑定 Overall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:
用户名 is missing the Overall/Read permission
- role1:该角色为项目角色。使用正则表达式绑定”vx-chx.*“,意思是只能操作 vx-chx 开头的项目。
- role2:该角色为项目角色。使用正则表达式绑定”vx-phm.*“,意思是只能操作 vx-phm 开头的项目。
保存
创建用户
在系统管理页面进入 Manage Users
分别创建两个用户:vxchx 和 vxphm
给用户分配角色
系统管理页面进入 Manage and Assign Roles,点击 Assign Roles
绑定规则如下:
vxchx 用户分别绑定 baseRole 和 role1 角色
vxphm 用户分别绑定 baseRole 和 role2 角色
保存
创建项目测试权限
以 admin 管理员账户创建两个项目,分别为 vx-chx-test 和 vx-phm-test
结果为: vxchx 用户登录,只能看到 vx-chx-test 项目 vxphm 用户登录,只能看到 vx-phm-test 项目
Jenkins 凭证管理
凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 Jenkins 可以和这些第三方的应用进行交互。
安装 Credentials Binding 插件
要在 Jenkins 使用凭证管理功能,需要安装Credentials Binding
插件
注:新版本已经默认安装了此插件,这里无需另外再安装了
系统管理中选择 Manage Credentials
可以添加的凭证有 5 种:
- Username with password:用户名和密码
- SSH Username with private key: 使用 SSH 用户和密钥
- Secret file:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径 设置到一个变量中,等构建结束后,所复制的 Secret file 就会被删除。
- GitHub App:GitHub 的 API 令牌
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token
- Certificate:通过上传证书文件的方式
常用的凭证类型有:Username with password(用户密码)和 SSH Username with private key(SSH 密钥)
接下来以使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 的如何管理 Gitlab 的凭证。
安装 Git 插件和 Git 工具
为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在服务器上安装 Git 工具。
Git 插件安装:
服务器上安装 Git 工具(以 CentOS7 为例):
1 | BASH |
用户密码类型
1)创建凭据
1 | Jenkins -> 凭证 -> 系统 -> 全局凭据 -> 添加凭据 |
选择”Username with password”,输入 Gitlab 的用户名和密码,点击”确定”。
SSH 密钥类型
SSH 免密登录示意图
1)使用 root 用户生成公钥和私钥
1 | ssh-keygen -t rsa |
在/root/.ssh/目录保存了公钥和使用
id_rsa:私钥文件
id_rsa.pub:公钥文件
2)把生成的公钥放在 Gitlab 中
1 | 登录gitlab -> 点击头像 -> Settings -> SSH Keys |
复制刚才 id_rsa.pub 文件的内容到这里,点击”Add Key”
3)在 Jenkins 中添加凭证,配置私钥
在 Jenkins 添加一个新的凭证,类型为”SSH Username with private key”,把刚才生成私有文件内容复制过来
Jenkins 关联 JDK 和 Maven
关联 JDK
1 | Jenkins -> 系统管理 -> 全局工具配置 -> JDK -> 新增JDK,配置如下: |
关联 Maven
1 | Jenkins -> 系统管理 -> 全局工具配置 -> Maven -> 新增Maven,配置如下: |
添加 Jenkins 全局变量
1 | Jenkins -> 系统管理 -> 全局属性 -> 添加三个环境变量,配置如下: |
Jenkins 关闭跨站请求伪造保护
- Docker 容器运行
1 | APPLESCRIPT |
Jenkins 构建 Maven 项目
构建方式均采用 Jar 包方式,War 方式参考WAR 部署方案 · JeecgBoot 开发文档
Jenkins 项目构建类型
Jenkins 中自动构建项目的类型有很多,常用的有以下三种:
- 自由风格软件项目(FreeStyle Project)
- Maven 项目(Maven Project)
- 流水线项目(Pipeline Project)
每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在实际开发中可以根据自己的需求和习惯来选择。(PS:个人推荐使用流水线类型,因为灵活度非常高)
自由风格项目构建
下面演示创建一个自由风格项目来完成项目的集成过程:
1 | 拉取代码 -> 编译 -> 打包 -> 部署 |
拉取代码
1)创建项目
2)源码管理,从 Gitlab 拉取代码
编译打包
1 | 构建 -> 添加构建步骤 -> 执行shell |
部署
把项目部署到远程的服务器上,并启动
1)安装Publish Over SSH
插件
Jenkins 本身无法实现远程部署到服务器上的功能,需要安装Publish Over SSH
插件实现
2)配置Publish over SSH
,添加 SSH 服务器
1 | 打开系统管理 -> 系统配置 -> 拉到底部,选择Publish over SSH区域选择新增 |
点击高级 -> 填写服务器密码
(也可选择 ssh 验证,在 Jenkins 中配置本机私钥,将公钥发送到目标机器,即可完成无密码登录)
1 | 发送命令:ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.xxx.xxx |
- Passphrase: 密码(目标机器的密码)
- Path to key:key 文件(私钥)的路径
- SSH Server Name: 标识的名字(随便你取什么)
- Hostname: 需要连接 ssh 的主机名或 ip 地址,此处填写应用服务器 IP(建议 ip)
- Username: 用户名
- Remote Directory: 远程目录(要发布的目录,比如/usr/local/tomcat/webapps/)
3)添加构建步骤
1 | APACHE |
4)点击”立即构建”,开始构建过程
5)构建成功,并自动化部署,访问测试!
Maven 项目构建
1)安装 Maven Integration Plugin(高版本的 Jenkins 已预装了此插件)
2)创建 Maven 项目
3)配置项目
拉取代码和远程部署的过程和自由风格项目一样,只是”构建”部分不同
Pipeline 流水线项目构建(*)
Pipeline 简介
1)概念
Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
2)使用 Pipeline 有以下好处(来自翻译自官方文档):
代码:Pipeline 以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流 程。持久:无论是计划内的还是计划外的服务器重启。Pipeline 都是可恢复的。可停止:Pipeline 可接 收交互式输入,以确定是否继续执行 Pipeline。多功能:Pipeline 支持现实世界中复杂的持续交付要求。它支持 fork/join、循环执行,并行执行任务的功能。可扩展:Pipeline 插件支持其 DSL 的自定义扩展,以及与其他插件集成的多个选项。
3)如何创建 Jenkins Pipeline 呢?
- Pipeline 脚本是由Groovy语言实现的,但是我们没必要单独去学习 Groovy
- Pipeline 支持两种语法:Declarative(声明式)和Scripted Pipeline(脚本式)语法
- Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一个 Jenkinsfile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制(SCM)中直接载入 Jenkinsfile Pipeline 这种方法)。
Pipeline 语法快速入门
1)Declarative 声明式-Pipeline
创建一个流水线项目
1 | 流水线 -> 选择HelloWorld模板 |
生成的内容如下:
1 | GROOVY |
- stages:代表整个流水线的所有执行阶段。通常 stages 只有 1 个,里面包含多个 stage
- stage:代表流水线中的某个阶段,可能出现 n 个。一般分为拉取代码,编译构建,部署等阶段。
- steps:代表一个阶段内需要执行的逻辑。steps 里面是 shell 脚本,git 拉取代码,ssh 远程发布等任意内容。
编写一个简单声明式的 Pipeline:
1 | GROOVY |
点击构建,进入Blue Ocean
可以看到整个构建过程
2)Scripted Pipeline 脚本式-Pipeline
创建项目
选择 Scripted Pipeline"
1 | GROOVY |
- Node:节点,一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行环境,后续讲到 Jenkins 的 Master-Slave 架构的时候用到。
- Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如: Build、Test、Deploy,Stage 是一个逻辑分组的概念。
- Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像, 由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令 一样。
编写一个简单的脚本式 Pipeline
1 | JAVASCRIPT |
构建结果和声明式一样!
Pipeline Script from SCM
刚才我们都是直接在 Jenkins 的 UI 界面编写 Pipeline 代码,这样不方便脚本维护,建议把 Pipeline 脚本放在项目中(一起进行版本控制)
1)在项目根目录建立 Jenkinsfile 文件,把内容复制到该文件中
把 Jenkinsfile 上传到 Gitlab
2)在项目中引用该文件
Jenkinsfile
Jenkinsfile 环境变量
环境变量 | 说明 |
---|---|
BRANCH_NAME | 在 multibranch 项目中,BRANCH_NAME 用于标明构建分支的名称。 |
CHANGE_ID | 在 multibranch 的项目中,相较于特定的变更请求,用于标明变更 ID,比如 Pull Request |
CHANGE_URL | 在 multibranch 的项目中,相较于特定的变更请求,用于标明变更的 URL |
CHANGE_TITLE | 在 multibranch 的项目中,相较于特定的变更请求,用于标明变更的标题 |
CHANGE_AUTHOR | 在 multibranch 的项目中,相较于特定的变更请求,用于标明提交变更的人员的名称 |
CHANGE_AUTHOR_DISPLAY_NAME | 在 multibranch 的项目中,相较于特定的变更请求,用于标明提交变更的人员的显示名称 |
CHANGE_AUTHOR_EMAIL | 在 multibranch 的项目中,相较于特定的变更请求,用于标明提交变更的人员的邮件地址 |
CHANGE_TARGET | 在 multibranch 的项目中,相较于特定的变更请求,用于合并后的分支信息等 |
BUILD_NUMBER | 当前的构建编号 |
BUILD_ID | 在 1.597 版本后引进,表示当前构建 ID |
BUILD_DISPLAY_NAME | 当前构建的显示信息 |
JOB_NAME | 构建 Job 的全称,包含项目信息 |
JOB_BASE_NAME | 除去项目信息的 Job 名称 |
BUILD_TAG | 构建标签 |
EXECUTOR_NUMBER | 执行器编号,用于标识构建器的不同编号 |
NODE_NAME | 构建节点的名称 |
NODE_LABELS | 节点标签 |
WORKSPACE | 构建时使用的工作空间的绝对路径 |
JENKINS_HOME | JENKINS 根目录的绝对路径 |
JENKINS_URL | Jenkins 的 URL 信息 |
BUILD_URL | 构建的 URL 信息 |
JOB_URL | 构建 Job 的 URL 信息 |
GIT_COMMIT | git 提交的 hash 码 |
GIT_PREVIOUS_COMMIT | 当前分支上次提交的 hash 码 |
GIT_PREVIOUS_SUCCESSFUL_COMMIT | 当前分支上次成功构建时提交的 hash 码 |
GIT_BRANCH | 远程分支名称 |
GIT_LOCAL_BRANCH | 本地分支名称 |
GIT_URL | 远程 URL 地址 |
GIT_COMMITTER_NAME | Git 提交者的名称 |
GIT_AUTHOR_NAME | Git Author 的名称 |
GIT_COMMITTER_EMAIL | Git 提交者的 email 地址 |
GIT_AUTHOR_EMAIL | Git Author 的 email 地址 |
MERCURIAL_REVISION | Mercurial 的版本 ID 信息 |
MERCURIAL_REVISION_SHORT | Mercurial 的版本 ID 缩写 |
MERCURIAL_REVISION_NUMBER | Mercurial 的版本号信息 |
MERCURIAL_REVISION_BRANCH | 分支版本信息 |
MERCURIAL_REPOSITORY_URL | 仓库 URL 信息 |
SVN_REVISION | Subversion 的当前版本信息 |
SVN_URL | 当前工作空间中被 checkout 的 Subversion 工程的 URL 地址信息 |
常用的构建触发器
Jenkins 内置 4 种构建触发器:
- 触发远程构建
- 其他工程构建后触发(Build after other projects are build)
- 定时构建(Build periodically)
- 轮询 SCM(Poll SCM)
- GitHub 钩子触发的 GIT SCM 轮询(GitHub hook trigger for GITScm polling)
触发远程构建
触发构建 url:http://192.168.88.86:8180/job/vx-phm/build?token=abcabc
其他工程构建后触发
1)创建 pre_job 流水线工程
2)配置需要触发的工程
定时构建
定时字符串从左往右分别为: 分 时 日 月 周
一些定时表达式的例子:
1 | MARKDOWN |
轮询 SCM
轮询 SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。
注意:此构建触发器,Jenkins 会定时扫描本地整个项目的代码,增大系统的开销,不建议使用。
Git Hook 自动触发构建(*)
刚才我们看到在 Jenkins 的内置构建触发器中,轮询 SCM 可以实现 Gitlab 代码更新,项目自动构建,但是该方案的性能不佳。那有没有更好的方案呢?有的。就是利用 Gitlab 的 webhook 实现代码 push 到仓库,立即触发项目自动构建。
安装 Gitlab Hook 插件
需要安装两个插件:
Gitlab Hook 和 Gitlab
Jenkins 设置自动构建
等会需要把生成的 webhook URL 配置到 Gitlab 中。
Gitlab 配置 webhook
1)开启 webhook 功能
1 | 使用root账户登录到后台,点击Admin Area -> Settings -> Network |
2)在项目中添加 webhook
1 | 点击项目 -> Settings -> Webhooks |
注意:以下设置必须完成,否则会报错!
1 | 系统管理 -> 系统配置 |