如何搭建 Jenkins 环境

环境说明
特别说明:在正式开始配置 Jenkins 之前,最好是将插件列表中的相关插件都安装上。这一步比较坑,我在配置的过程中因为缺少插件走了不少弯路。
硬件要求
| 硬件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核 |
| 内存 | 4G | 8G |
| 硬盘 | 20G | 50G |
软件要求
| 软件 | 版本 |
|---|---|
| JDK | Open JDK 1.8 最新版 |
| Maven | 3.8.1 |
| Docker | 23.0.1 |
| Git | 最新版 |
| Jenkins | 2.346.1(几乎是最后一个支持 Java8 的版本) |
安装前准备
修改 YUM 源
移除当前的 yum 源
1
rm -rfv /etc/yum.repos.d/*拉取阿里云的 yum 源
1
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo更新软件列表和系统内核
1
yum -y update安装 yum 工具包及其他必备工具
1
yum install -y yum-utils wget net-tools git配置 Docker 的 yum 源
1
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
操作系统配置
关闭 SELinux
1
2
3
4
5
6# 临时禁用SELinux(不管是永久关闭还是临时关闭,此命令都最好执行一下)
setenforce 0
# 永久关闭SELinux(重启后将不会再开启)
sed -i "s/SELINUX=permissive/SELINUX=disabled/" /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config关闭防火墙
1
2
3
4
5# 临时禁用防火墙
systemctl stop firewalld
# 永久禁用防火墙
systemctl disable firewalld
安装和配置 JDK
安装 JDK
注意:这里又个巨坑,安装 JDK,注意只有带 *-devel 的才是完整的 JDK。否则安装的只是 JRE
1
yum install -y java-1.8.0-openjdk-devel配置环境变量
1
vi /etc/profile在配置文件的最下方添加如下配置
1
2
3
4
5# SET JDK ENVIRONMENT
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH重载配置
1
source /etc/profile查看是否生效
1
javac这里使用 javac 的目的是只有安装 JDK 才能使用
javac命令,只安装 JRE 是不能使用这个命令的。以此检验系统是否安装好了 JDK。
安装和配置 Docker
使用 Docker 是因为,我们通常需要将项目打包成 Docker 镜像,所以需要先安装 Docker。本次安装的 Docker 是社区版。
安装 Docker
安装 Docker
1
yum install -y docker-ce-23.0.1-1.el7 docker-ce-cli-23.0.1-1.el7 containerd.io-6.18-3.1.el7修改 Docker 配置
Docker 默认是通过 cgroup 来管理容器的,默认驱动为 cgroupfs,而 Kubernetes 使用的是 systemd ,因此我们需要将驱动改为 systemd。并且使用国内加速源来下载镜像。
1
vi /etc/docker/daemon.json输入以下内容,其中包含驱动的修改及镜像源的配置
1
2
3{
"registry-mirrors":["https://registry.docker-cn.com"]
}启动 Docker 服务
1
2
3
4
5
6
7
8
9# 启动 Docker
systemctl start docker
# 设置 Docker 开机自启动
systemctl enable docker
# 如果之前已经启动过 docker,那么修改配置之后,可以执行下面两个命令。
systemctl daemon-reload
systemctl restart docker查看 Docker 状态和版本
1
2
3
4
5
6# 通过 systemctl status 命令查看是否运行成功
# 如果返回有:Active: active (running) since 五 2020-12-04 02:36:23 CST; 16s ago信息说明启动成功。
systemctl status docker
# 我们也可以通过 docker version 命令来查看版本信息,看看是否存在问题。
docker version
开启 2376 端口
Docker 开启 2376 端口的目的是为了让 Jenkins 能使用 Docker 进行打包。
注意:老版本使用的是 2375 端口,而新版本使用的是 2376。
编辑 docker.service 配置
1
vi /usr/lib/systemd/system/docker.service找到
[Service]节点下的ExecStart配置,修改成下面这个样子。1
2[Service]
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock实际上我们只是在原有的配置上增加了
-H tcp://0.0.0.0:2376。重启 Docker
1
2
3
4
5# 重新加载配置
systemctl daemon-reload
# 重新启动
systemctl restart docker查看端口是否开放成功
1
2# 使用此命令需要安装 net-tools,前面的章节我们已经安装过了。
netstat -tuln | grep 2375命令执行结果如下:
1
2-- console log --
tcp6 0 0 :::2375 :::* LISTEN如果打印了这条日志信息,说明开启成功。
安装 Jenkins
安装前准备
导入 Jenkins 的 GPG 密钥
1
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key添加 Jenkins 的软件库
1
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo更新 yum 缓存
1
yum update
开始安装 Jenkins
安装 Jenkins
这一步的下载过程有点慢,请耐心等待。
1
yum install -y jenkins-2.346.1修改 Jenkins 默认配置
1
vi /etc/sysconfig/jenkins主要修改下面两部分内容
1
2JENKINS_USER="admin"
JENKINS_PORT="8080"JENKINS_USER:配置 Jenkins 的登录用户名。JENKINS_PORT:配置 Jenkins 的访问端口号。
启动 Jenkins 服务
1
2
3
4
5# 启动 Jenkins
systemctl start jenkins
# 设置 Jenkins 开机自启动
systemctl enable jenkins获取 Jenkins 的初始化密码
1
cat /var/lib/jenkins/secrets/initialAdminPassword访问测试
打开浏览器输入:http://
:8080,会打开一个页面,页面中也会提示去哪里获取初始化密码,输入初始化密码之后点击解锁。解锁成功后,会提示一个插件安装的页面。这里选择 选择插件,然后进入另一个页面选无,也就是不安装插件。后面我们配置好国内镜像源之后,再安装所需要的插件。后面的步骤根据提示一步步操作直到完成。
Jenkins 基本配置
配置插件的更新站点
进入到Dashboard/Manage Jenkins,找到Manage Plugin点击进入。选择Advanced选项卡,滑动到最下面有一个Update Site。把它改成下面的这个地址:
1 | |
修改完成后,记得要点击submit按钮提交。提交后重启 jenkins。如果不想到服务器去重启,也可以通过浏览器的 URL 重启。比如:在浏览器 URL 地址的端口号后面改为/restart(如:http://<IP 地址>:8080/restart)
注意:上面提供的地址中,细看会发现有一个版本号,这个版本号实际上是和 Jenkins 的版本号保持一致的。这样做的目的是防止某些插件更新后误装导致 Jenkins 无法工作。
安装和配置 Maven
因为我们打包时需要使⽤ Maven 来构建和编译代码,因此我们需要安装 Maven。
注意:Maven 版本的选择最好跟开发环境一致,也就是开发团队统一使用是哪个版本的 Maven,就最好安装哪个版本。否则可能会出现各种意想不到的问题。
本次我使用的是 Maven3.8.1,如果你安装的是最新版,则直接去官方网站下载即可。如果是历史版本,可以在这里去找。
安装 Maven
本次我们将 Maven 安装在
/opt目录下。
下载 Maven 二进制包
1
2
3
4
5# 进入 opt 目录
cd /opt
# 下载软件包
wget https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压包
1
tar zxvf apache-maven-3.8.1-bin.tar.gz解压后会在目录下多一个
apache-maven-3.8.1目录。这里就是我们解压好的 Maven 软件。配置环境变量
1
vi /etc/profile前面我们已经配置过 JDK 的环境变量了,在它的下方我们继续添加 Maven 的环境变量。
1
2
3
4# SET MAVEN ENVIRONMENT
MAVEN_HOME=/opt/apache-maven-3.8.1
export MAVEN_HOME
export PATH=$PATH:$MAVEN_HOME/bin配置完成后,重载配置。
1
source /etc/profile检查 Maven 是否配置成功
1
mvn --version命令执行结果如下:
1
2
3
4
5
6-- console log --
Apache Maven 3.8.1 (9b58d2bad23a66be161c4664ef21ce219c2c8584)
Maven home: /opt/apache-maven-3.8.1
Java version: 1.8.0_362, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"至此 Maven 环境就安装成功了,下一章节开始配置 Maven 的
settings.xml。
配置 Maven
新建一个目录作为 Maven 本地仓库
1
2
3
4
5
6# 新建目录
mkdir -p /opt/maven_repository && cd /opt && ls
# 给目录授权,这一步一定要做,否则无法下载依赖。
chmod -R o+r+w maven_repository
chmod o+x+w maven_repository修改
settings.xml配置1
2
3
4
5# 进入配置目录
cd /opt/apache-maven-3.8.1/conf
# 打开配置文件
vi settings.xml这里我们主要修改这几个配置
- localRepository:本地仓库路径(就是我们第一步创建的那个目录的全路径)
- mirrors:在这里配置阿里云的 Maven 镜像仓库。因为官方仓库下载资源比较慢。需要注意的是阿里云的镜像仓库地址一定要用 http,不要使用 https 否则会有证书的问题,倒是无法访问。
我这里去除掉一些无用的注释之后,完整的配置如下:
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
34
35
36
37
38
39
40
41
42<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- localRepository -->
<localRepository>/opt/maven_repository</localRepository>
<!-- pluginGroups -->
<pluginGroups>
</pluginGroups>
<!-- proxies -->
<proxies>
</proxies>
<!-- servers -->
<servers>
</servers>
<!-- mirrors -->
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>*</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/repository/public</url>
</mirror>
<!-- <mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror> -->
</mirrors>
<!-- profiles -->
<profiles>
</profiles>
<!-- activeProfiles -->
</settings>注意:默认配置中包含了一个官方仓库的镜像,可以将其删除或注释掉。
如果直接在服务器上操作觉得麻烦,可以先将配置文件备份一份。然后将文件下载到自己的电脑上编辑完之后,再上传到服务器覆盖掉之前的文件。
Jenkins 全局配置
配置全局环境变量
进入Dashboard/系统管理/系统配置。找到全局属性配置项,勾选环境变量,在这里添加三个环境变量。
| 键 | 值 |
|---|---|
| JAVA_HOME | /usr/lib/jvm/java-1.8.0-openjdk |
| MAVEN_HOME | /opt/apache-maven-3.8.1 |
| PATH+EXTRA | $MAVEN_HOME/bin |
配置这三个环境变量的⽤途,和在系统中配置环境变量的⽤途类似,系统中配置环境变量是为了让系统识别到相关软件, Jenkins 中配置这三个环境变量,是为了让 Jenkins 识别到 JDK 和 Maven。
配置全局工具
这里主要配置的是 JDK、Git、Maven 三个工具。因为 Jenkins 打包需要用到这些软件中的某些工具。这有点儿类似我们在 IDEA 中配置这些工具一样。
其中 Git 再安装完插件之后,会自动产生一个面板,JDK、Maven 需要点一下新增按钮。
JDK 配置
配置项 值 说明 JDK 别名 java-1.8.0-openjdk 只是一个配置的别名,可以随便定义。 JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk 这里配置我们前面安装的 JDK 路径。 自动安装 取消勾选 这里提供了一个自动安装 JDK 的方法。建议自己装,不要使用自动。 Git 配置
配置项 值 说明 Name Git 只是一个配置的别名,可以随便定义。 Path to Git executable /usr/bin/git Git 应用程序路径,Linux 可以使用 whereis git命令查看。自动安装 取消勾选 建议自己装,不要使用自动。 Maven 配置
配置项 值 说明 Name apache-maven-3.8.1 只是一个配置的别名,可以随便定义。 MAVEN_HOME /opt/apache-maven-3.8.1 这里配置我们前面安装的 Maven 路径。 自动安装 取消勾选 建议自己装,不要使用自动。
配置 Docker 宿主机
这里需要先安装
docker 和 CloudBees Docker Build and Publish插件。
进入Dashboard/系统管理/节点管理/Configure Clouds(有的显示配置集群)。如果找不到可以使用 URL 进入,比如:http://127.0.0.1:8080/configureClouds/。
界面中有一个Add a new cloud的下拉框,点开之后选择Docker。这时会出现一个配置面板,给配置起一个名字,然后点击Docker Cloud Details...按钮。此时会发现增加了很多配置项,我们主要配置的是下面几项。
| 配置项 | 值 | 说明 |
|---|---|---|
| Docker Host URI | tcp://<Docker 宿主机 IP 地址>:2376 | 配置用于打包的 Docker 服务器。 |
| Enabled | 勾选 | 开启云打包 |
| Server credentials | 无 | Docker 服务器登录凭证,没有可以不填。 |
另外,面板中还有一个Test Connection按钮,可以通过此按钮查看 Jenkins 是否可以连接到 Docker 宿主机。
插件安装
这里给出一些我在实际使用过程中用到的一些插件。安装过程可能会因为网络的原因导致安装失败。
建议:插件的安装最好是去官方仓库手动下载,然后上传到 Jenkins 中。
官方仓库地址:https://plugins.jenkins.io/
安装方法也很简单,和上一步一样,找到 Manage Plugin,这次选择的是Available,然后在搜索框中搜索自己想要安装的插件,勾选中之后,点击Install without restart。如果安装过简体中文语言包就比较简单了。可以根据中文提示安装。
| 插件名称 | 版本号 | 说明 |
|---|---|---|
| Localization: Chinese (Simplified) | 1.0.24 | Jenkins 的简体中文语言包 |
| Maven Integration | 3.21 | Maven 支持插件 |
| Pipeline: SCM Step | 400.xxxxx | 流水线版本控制器 |
| Git | 4.12.1 | Git 支持插件,安装前需要先安装 Pipeline: SCM Step |
| Git Parameter | 0.9.18 | Git 构建参数支持,此插件可以在构建过程动态选择分支。 |
| Docker | 1.3.0 | Docker 支持插件 |
| CloudBees Docker Build and Publish | 1.4.0 | 自动化构建和推送 Docker 镜像,支持各种不同的 Dockerfile 定义方式,在 Jenkins 中直接预览构建日志,可以对镜像进行验证和扫描,并将镜像推送到 Docker Hub 或另一个私有 Registry 中。 |
| Docker Pipeline | 563.xxxxxxx | 支持 Jenkins Pipeline 执行所有 Docker 操作 |
使用 Jenkins 打包
我这里使用的是自建的 Harbor 仓库。如果你使用的是阿里云仓库,也和这类似。只是配置的账号不同而已。
创建凭证
这里只需要创建一次,以后打包直接使用即可。
进入Dashboard/系统管理/Manage Credentials,在Stores scoped to Jenkins面板中点击域列下的全局,此时会进入到一个凭据的配置页面。点击添加凭据,会显示一个新凭据的面板。
凭据支持的类型很多,最长用的是Username with password,即用户名和密码的凭据。
我们依次添加 Harbor 仓库账户和 Git 仓库账户。注意填写描述,否则将来无法区分是哪个账户。
新建打包任务
进入Dashboard/新建任务,输入任务名称,这个名称可以自定义只要便于区分即可。我的习惯是以工程名来命名后面跟着发布环境的后缀。比如:mall-manage-service-test,即商城系统的管理服务,环境是测试环境。输入完名称后,选择构建一个maven项目,点击确定按钮。
接下来会进入到具体的配置界面,这里我们分面板来介绍配置细节。
基础配置(General)
丢弃旧的构建:此处配置的是构建记录的保留策略。
参数项 参数值 说明 保持构建的天数 3 无 保持构建的最大个数 3 无 参数化构建过程:这里主要配置构建过程所需要的参数。本次我们添加一个 Git 参数。使用 Git 参数需要提前安装好插件。
参数项 参数值 说明 名称 BRANCH 参数的名称 描述 Git 分支 参数的说明 参数类型 分支 参数的类型 默认值 origin/master Git 仓库的默认分支
除了上面几个需要配置的以外,其他的选项都取消勾选。
源码管理
Git
Repositories:仓库配置参数项 参数值 说明 Repository URL http://[IP 或域名]/项目组/项目名.git 代码在 Git 仓库的地址。 Credentials 选择前面配置好的 Git 凭据。 Git 仓库的登录凭证。 Branches to build:分支构建参数参数项 参数值 说明 指定分支(为空时代表 any) $BRANCH 分支参数,使用上一步配置的分支参数,格式:$参数名称。
构建触发器
取消Build whenever a SNAPSHOT dependency is built勾选。
构建环境
无需配置
Pre Steps
无需配置(这里主要配置 Maven 打包之前的操作)
Build
此处配置的是 Maven 构建配置
| 参数项 | 参数值 | 说明 |
|---|---|---|
| Root POM | pom.xml | 指定 POM 文件所在的路径。 |
| Goals and options | clean package | 全局操作,这里配置的是 Maven 的打包命令。无需使用 mvn。 |
Post Steps
这里主要配置 Maven 打包之后的操作。
选择Run only if build succeeds,即:只有在构建成功后才执行此步骤。点击下方的Add post-build step下拉框,
选择Build / Publish Docker Image,添加一个构建 Docker 镜像的面板。
| 参数项 | 参数值 | 说明 |
|---|---|---|
| Directory for Dockerfile | 无 | Dockerfile 文件路径,不写则从根目录找。 |
| Cloud | 选择前面配置好的 Docker 宿主机 | 用于云打包的 Docker 宿主机。 |
| image | 镜像仓库地址/镜像名:${POM_VERSION} | 镜像全名,${POM_VERSION}是读取 POM 的版本号。 |
| Build Args | 无 | 构建参数 |
| Push image | 勾选 | 启用推送镜像配置 |
| Registry Credentials | 选择前面配置好的镜像仓库凭证 | Docker 镜像仓库的登录凭证。 |
| Clean local images | 勾选 | 打包完成后清除本地镜像。 |
| Attempt to remove images when jenkins deletes the run | 勾选 | 打包完成后尽可能清除已运行的 Docker 镜像。 |
其他选项无需勾选。至此,所有配置结束。点击保存按钮完成打包配置。
开始打包
- 找到我们配置好的打包配置,点击进入。
- 点击
Build with Parameters,进入参数化构建面板。 - 选择分支,即我们基于哪一个分支进行打包。
- 点击
开始构建,等待 1 ~ 2 秒会在左侧的构建历史中看到正在打包的进度,点击进度条可以进入到打包日志页面。注意观察每一步输出的打包日志,没有报错,直到最后镜像成功推送到镜像仓库。这样就完成了整个的打包过程。
总结
整个 Jenkins 安装配置过程,有这么几个地方是容易出问题的。
- 各个必须的组件,如 Maven、JDK 的版本兼容问题。
- 插件的安装和插件支持的版本问题。
- Maven 的 settings.xml 配置问题。
- 宿主机端口开启,及宿主机配置问题。
- Jenkins 集成打包环境问题,如:Maven、JDK、Git。
注意:上面提到的这些,任何一个环节配置不好都有可能导致最后无法成功打包。因此整个 Jenkins 的安装、配置过程最好是仔细阅读文档。避免细节问题没注意,导致无法成功打包。