如何搭建 Jenkins 环境

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
    2
    JENKINS_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
https://mirrors4.tuna.tsinghua.edu.cn/jenkins/updates/dynamic-stable-2.346.1/update-center.json

修改完成后,记得要点击submit按钮提交。提交后重启 jenkins。如果不想到服务器去重启,也可以通过浏览器的 URL 重启。比如:在浏览器 URL 地址的端口号后面改为/restart(如:http://<IP 地址>:8080/restart)

注意:上面提供的地址中,细看会发现有一个版本号,这个版本号实际上是和 Jenkins 的版本号保持一致的。这样做的目的是防止某些插件更新后误装导致 Jenkins 无法工作。

安装和配置 Maven

因为我们打包时需要使⽤ Maven 来构建和编译代码,因此我们需要安装 Maven。

注意:Maven 版本的选择最好跟开发环境一致,也就是开发团队统一使用是哪个版本的 Maven,就最好安装哪个版本。否则可能会出现各种意想不到的问题。

本次我使用的是 Maven3.8.1,如果你安装的是最新版,则直接去官方网站下载即可。如果是历史版本,可以在这里去找。

https://archive.apache.org/dist/maven/maven-3/

安装 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 的安装、配置过程最好是仔细阅读文档。避免细节问题没注意,导致无法成功打包。


如何搭建 Jenkins 环境
https://kael.52dev.fun/2023/04/20/搭建Jenkins环境/
作者
Kael
发布于
2023年4月20日
许可协议
BY (KAEL)