DevOps工程技术价值流:Jenkins驱动的持续集成与交付实践
一、Jenkins系统概述
Jenkins:开源CI/CD引擎的佼佼者
Jenkins,作为一款基于Java的开源持续集成(CI)与持续交付(CD)系统,凭借其强大的插件生态系统,成为DevOps实践中不可或缺的核心引擎。这些插件覆盖了从构建、部署到自动化的全方位需求,使得Jenkins能够灵活适应从小型团队到大型企业级的各类项目。特别是Pipeline插件,为项目流水线的建立提供了无限可能,无论项目使用何种语言或源代码仓库,Jenkins都能轻松实现自动化构建、测试和部署。
二、Jenkins应用场景详解
2.1 持续集成:提升开发效率与质量
-
背景:在缺乏自动化工具的时代,开发人员需要手动运行验证任务,随着代码提交频率的增加,集成错误频发且难以及时发现。
-
Jenkins解决方案:通过自动化构建触发器和与版本控制系统的紧密集成,Jenkins能够在代码提交后自动运行验证任务,迅速发现集成错误并反馈,从而显著提高开发效率和代码质量。
2.2 持续部署:实现高效、稳定的发布
-
背景:传统的手动或通过Shell脚本进行的应用部署过程容易出错,且发布时间不稳定。
-
Jenkins解决方案:Jenkins将部署脚本集成到Pipeline中,实现了部署过程的可视化和参数化。通过复用发布步骤并传递环境参数,Jenkins能够自动化地将应用程序部署到不同环境中,大大降低了人工错误和发布时间的不确定性。
2.3 持续测试:增强测试的透明度和可追溯性
背景:测试人员在本地通过命令行运行测试用例,缺乏统一管理和可视化展示。
Jenkins解决方案:Jenkins允许将测试用例和相关脚本存储到版本控制系统中,并通过自动化运行测试用例和测试插件将测试结果展示到页面上。这不仅提高了测试的透明度和可追溯性,还有助于及时发现和修复问题。
三、Jenkins系统安装与架构解析
3.1 基础必备
3.1.1 Jenkins架构深度剖析
-
分布式架构:Jenkins采用灵活且可扩展的分布式架构,由服务端(Master)节点和代理端(Agent/Slave)节点构成。
-
服务端(Master)节点:负责流水线作业的调度与管理,是Jenkins的中枢神经,需保持高度稳定和可靠。
-
代理端(Agent/Slave)节点:实际执行流水线作业中的任务,可根据需求动态添加或移除,以应对不同的工作负载。
-
-
部署建议:代理端节点通常部署于靠近代码仓库或目标部署环境的位置,以减少网络延迟并提高执行效率。
3.1.2 版本选择策略
-
Jenkins LTS版本:建议选择Jenkins的LTS版本,因这些版本经过更严格的测试和验证,具有更高的稳定性和可靠性。
-
JDK版本:自Jenkins LTS 2.346.x版本起,安装部署时最低版本要求为JDK 11。为确保兼容性和稳定性,建议使用JDK 11或更高版本。
-
避免JDK 8:尽管Jenkins在某些早期版本中支持JDK 8,但随着Jenkins和插件的不断更新,JDK 8可能会引发兼容性问题或性能下降,因此建议避免使用。
3.2 安装Jenkins
Jenkins的安装方式多样,但Docker以其轻量级、可移植性和易于管理的特性,成为现代DevOps实践中安装Jenkins的首选。本文重点介绍通过Docker安装Jenkins的优化步骤,确保安装过程既高效又稳定。
3.2.1 Docker环境准备
-
Docker安装:
-
确保系统已安装Docker,并按照官方文档正确配置启动选项和网络设置。
-
Docker安装链接:Docker官方文档
-
-
Docker Compose(可选):
-
如需管理多个Docker容器或服务,建议使用Docker Compose。
-
Docker Compose安装链接:Docker Compose官方文档
-
也可以参考: https://blog.csdn.net/heijunwei/article/details/128706198
3.2.2 Docker安装Jenkins步骤
1、拉取Jenkins镜像
docker pull jenkins/jenkins:{version}
2、编写docker-compose.yml(可选)
version: "3.1" // 指定 Docker Compose 文件的版本。这里使用的是版本 3.1
services: //是一个顶级键,用于定义多个服务。每个服务都是一个独立的容器。
jenkins: //是服务的名称,表示我们将创建一个名为 jenkins 的服务。
image: jenkins/jenkins:{version} // 指定了要使用的 Docker 镜像。
container_name: jenkins // 指定了容器的名称。这里将容器命名为 jenkins。
ports:
- 8080:8080 // 表示将主机的 8080 端口映射到容器的 8080 端口。Jenkins 的 Web 界面通常运行在这个端口上。
- 50000:50000 // 表示将主机的 50000 端口映射到容器的 50000 端口。这个端口用于 Jenkins 的代理通信。
volumes:
- ./data/:/var/jenkins_home/ //定义数据卷,将主机的目录挂载到容器的目录,Jenkins 的所有配置和构建历史都会存储在这个目录中。
3、设置data目录写权限
chmod -R a+w data/
4、下载地址设置为国内镜像站
# 修改数据卷中的hudson.model.UpdateCenter.xml文件
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
</site>
</sites>
# 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
5、启动jenkins容器
docker-compose up -d
如果不用docker compose 用下面的命令
docker run -d --name jenkins \ -p 8080:8080 -p 50000:50000 \ --restart=always \ -v /var/jenkins_home:/var/jenkins_home \ -e JENKINS_OPTS="--prefix=/jenkins" \ jenkins/jenkins:lts
6、查看密码登录Jenkins,并登录下载插件
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
注:此处安装插件失败概率比较大,没关系直接进入首页创建账户
3.3 Jenkins插件安装
3.3.1 常用插件简介
-
Git Plugin:与Git版本控制系统集成,允许Jenkins自动拉取代码库中的最新代码。
-
Pipeline Plugin:支持用户定义复杂的构建流程,包括分阶段构建、测试和部署等。
-
Docker Plugin:用于管理Docker容器,使应用能够在隔离的环境中运行,提高构建和部署的灵活性和安全性。
-
Blue Ocean:提供一个现代化的用户界面,简化了Jenkins的使用,改善了用户体验。
-
Parameterized Trigger:允许在不同构建任务之间传递参数,实现更灵活的构建触发和参数共享。
-
Git Parameter:基于Git的参数化构建插件,允许用户在构建时选择Git的分支、版本号、标签等参数。
-
Publish Over SSH:通过SSH连接到远程服务器,进行文件传输、执行shell脚本等操作,实现构建结果的远程部署。
-
Gitlab Plugin:基于Gitlab的WebHooks操作,可以触发Jenkins构建任务,实现Gitlab与Jenkins的自动化集成。
-
Chinese:将Jenkins界面汉化为中文,方便中文用户使用。
-
Role-based Authorization Strategy:通过基于角色的权限管理机制,支持创建全局角色、项目角色等,方便成员间的权限控制。
-
Maven Integration Plugin:支持Maven编译,方便Java项目的构建和依赖管理。
3.3.2 插件安装方法
1、设置更新站点
进入Jenkins管理界面(Manage Jenkins),选择“Manage Plugins”->“Advanced”,在最下面的“Update Site”中设置为国内镜像站点,如清华大学的镜像站点https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
,以提高插件更新的速度和稳定性。
2、修改服务器配置(可选)
如果需要进一步优化Jenkins的更新和访问速度,可以通过修改Jenkins配置文件中的默认更新站点和搜索引擎设置。这通常涉及到对Jenkins安装目录下的default.json
文件的编辑,也可以用命令操作。
sed -i 's/updates.jenkins-ci.org/download/mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json sed -i 's/www.google.com/www.baidu.com/g' default.json
3、通过Web界面安装插件
-
安装最新版本:在Jenkins首页左侧选择“Manage Jenkins”->“Manage Plugins”->“Available”,通过右上角的Filter过滤相关插件后选择进行安装。
-
安装指定版本:如果需要安装特定版本的插件,可以访问插件的wiki页面或Jenkins官方插件库,下载所需的插件版本,并通过“Manage Plugins”->“Advanced”->“Upload Plugin”进行上传安装。
4、手动安装插件
将下载好的.hpi
或.jpi
插件文件保存到Jenkins插件目录(如/var/lib/jenkins/plugins
),然后重启Jenkins服务。这种方法通常用于解决插件无法通过Web界面安装或更新的问题。
3.4 jenkins配置
由于Jenkins需要从Git拉取代码、需要本地构建、甚至需要直接发布自定义镜像到Docker仓库,所以Jenkins需要配置大量内容。
3.4.1 Agent节点配置(如果是小型项目,建议用Publish over SSH 方式)
jenkins的代理端主要用于运行Jenkins服务端所调度的流水线作业。它的部署方式与服务端一样是跨平台的。
1 配置节点
配置节点单击左侧“系统管理”进入“管理Jenkins”页面,在页面中可以看到“节点管理”选项
进入节点管理页面,可以看到已经在线的服务端master节点。单击左侧菜单中的“新建节点“
进入新建节点页面后,填写要创建的节点名称和Type(节点类型)。
单击Create按钮创建节点并进入节点的详细配置页
各个配置项的说明如下。
-
名字:填写节点的名称。
-
描述:填写节点的描述信息。
-
Number of executors:执行器的数量,默认每一个Jenkins作业会分配一个执行器。
-
远程工作目录:Agent节点的工作目录。
-
标签:可以对节点进行分组,便于流水线调度。
-
用法:哪些作业可以使用这些节点,选择“只允许运行绑定到这台机器的Job”或者“经常使用该节点”即可运行任意作业。
在Jenkins的生产环境中,常用的启动方式为SSH和JNLP。JNLP对应中文为“通过Java Web启动代理”。
提示:如果遇到“Either WebSocket mode is selected, or the TCP port for inbound agents must be enabled”错误提示,是因为在Jenkins新版本中,默认禁用了TCP端口。我们需要导航到“系统管理>管理Jenkins >安全>全局安全”配置开启TCP端口。
此端口作为后续Agent节点启动时与Server节点通信使用。
2 从节点上启动代理
以“Java Web”方式设置的代理节点,需要下载启动程序。参考下图单击节点进入节点信息页面,获取agent.jar的下载链接。启动节点的步骤如下。
# 创建工作目录(与页面新建节点时填写的一致)
mkdir -p /data/jenkins-agent
cd /data/jenkins-agent/
# 下载 openjdk-11 并解压,解压后的目录名为 jdk-11
wget https://d6.injdk.cn/openjdk/openjdk/11/openjdk-11+28_linux-x64_bin.tar.gz
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz
rm -rf openjdk-11+28_linux-x64_bin.tar.gz
# 通过 Jenkins 页面提供的命令下载 agent.jar
curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar
# 启动 Java Web 代理
# 注意:jdk11没有配置环境变量,所以写全路径
/data/jenkins-agent/jdk-11/bin/java -jar agent.jar -jnlpUrl http://192.168.1.125:8080/manage/computer/worker2/jenkins-agent.jnlp -secret 2007cfd52553e6927c4a41966bd85ecf3acda559beda2a3d5e4ffd106fe01db1 -workDir "/data/jenkins-agent/"
注意:curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar出现问题的概率很高。大部分情况都是网络问题导致的,例如检查Agent节点与Jenkins Server节点的50000端口和8080端口的连通性是否正常。当出现“Connected”关键字时查看节点管理页面,可以看到该Agent已经连接成功。刷新节点页面,如图所示。
3 将 Java Web 代理安装为系统服务
上一步中,我们通过 java -jar
的方式成功启动了agent.jar
,但是这种方式在SSH
连接断开后,应用也会停止,所以我们还需要将java -jar agent.jar ……
安装为系统服务。
一键安装脚本install-jenkins-agent.sh
,只需要修改CMD=''
为Jenkins
页面给出的启动命令后上传到服务器并执行即可
#!/bin/bash
CMD='将启动命令写到这里'
JNLPURL=$(echo $CMD | sed 's/.*jnlpUrl \(.*\)/\1/'| cut -d ' ' -f1 )
WORKDIR=$(echo $CMD | sed 's/.*workDir \(.*\)/\1/'| cut -d ' ' -f1 | sed 's/"//g')
if [[ "$CMD" =~ java && "$CMD" =~ jnlpUrl && "$CMD" =~ secret && "$CMD" =~ workDir ]];then
echo "开始配置jenkins-agent服务"
else
echo "ERROR:请将节点连接jenkins的java启动命令填入脚本CMD=''的引号中"
exit 1
fi
mkdir -p $WORKDIR
wget ${JNLPURL%%manage*}jnlpJars/agent.jar -P ${WORKDIR}
chmod 755 ${WORKDIR}/agent.jar
cat>/usr/lib/systemd/system/jenkins-agent.service<<EOF
[Unit]
Description=The Jenkins Agent Server
[Service]
User=root
ExecStart=/usr/local/bin/jenkins-agent start
ExecReload=/usr/local/bin/jenkins-agent restart
ExecStop=/usr/local/bin/jenkins-agent stop
Restart=always
[Install]
WantedBy=multi-user.target
EOF
cat>/usr/local/bin/jenkins-agent<<EOF
#!/bin/bash
start()
{
${CMD/agent.jar/$WORKDIR/agent.jar}
}
case "\$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "usage: \$0 start|stop|restart"
exit 0;
esac
exit
EOF
chmod 755 /usr/local/bin/jenkins-agent
systemctl daemon-reload
systemctl start jenkins-agent
systemctl enable jenkins-agent
result=$(systemctl is-active jenkins-agent)
if [[ $result == 'active' ]];then
echo "success"
else
nohup ${CMD/agent.jar/$WORKDIR/agent.jar} > /dev/null 2>&1 &
fi
查看jenkins-agent
系统服务状态并查看日志
# 查看服务状态 systemctl status jenkins-agent # 查看服务日志 journalctl -u jenkins-agent -f
3.4.2 从GitLab拉取、编译并通过SSH推送代码
1 构建任务
准备好GitLab仓库中的项目,并且通过Jenkins配置项目的实现当前项目的DevOps基本流程。
-
构建Maven工程发布到GitLab(Gitee、Github均可)
-
Jenkins点击左侧导航新建任务
-
选择自由风格构建任务
2 配置源码拉取地址
Jenkins需要将Git上存放的源码存储到Jenkins服务所在磁盘的本地
-
配置任务源码拉取的地址
-
Jenkins立即构建
3 配置Maven构建代码
代码拉取到Jenkins本地后,需要在Jenkins中对代码进行构建,这里需要Maven的环境,而Maven需要Java的环境,接下来需要在Jenkins中安装JDK和Maven,并且配置到Jenkins服务。
-
准备JDK、Maven压缩包通过数据卷映射到Jenkins容器内部
-
解压压缩包,并配置Maven的settings.xml
<!-- 阿里云镜像地址 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- JDK11编译插件 -->
<profile>
<id>jdk-11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>11</jdk>
</activation>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
</properties>
</profile>
-
Jenkins配置JDK&Maven并保存
-
配置Jenkins任务构建代码
-
立即构建测试,查看target下的jar包
4 配置Publish发布&远程操作
jar包构建好之后,就可以根据情况发布到测试或生产环境,这里需要用到之前下载好的插件Publish Over SSH。
-
配置Publish Over SSH连接测试、生产环境
-
配置任务的构建后操作,发布jar包到目标服务
-
立即构建任务,并去目标服务查看
5 基于Docker服务运行
为了让程序代码可以自动推送到测试环境基于Docker服务运行,需要添加Docker配置和脚本文件让程序可以在集成到主干的同时运行起来。
-
添加Dockerfile文件
-
添加docker-compose.yml文件
-
追加Jenkins构建后操作脚本命令
6 选取指定的发行版本
-
下载Git Parameter插件
-
设置项目参数化构建
-
任务构建时,采用Shell方式构建,拉取指定tag版本代码
-
基于Parameter构建任务,任务发布到目标服务器
四、 jenkins系统设置
4.1用户管理
Jenkins提供了多种用户管理方式,以适应不同规模和复杂度的企业团队需求。在小规模团队中,使用Jenkins本地用户管理是一个简单直接的选择。然而,当团队规模扩大时,本地用户管理可能会带来诸多不便,如维护成本增加、账号密码跨平台同步困难等。因此,对于大规模用户场景,推荐使用LDAP(轻量级目录访问协议)进行用户认证。
4.1.1 Jenkins本地用户管理
-
在Jenkins初始化时,会创建第一个管理员用户。
-
导航至全局安全配置,默认使用“Jenkins专有用户数据库”管理用户。
-
在管理用户页面,可新建用户,需填写用户名、密码、全名等信息。
4.1.2 LDAP认证集成
对于拥有大量用户的企业团队,LDAP认证集成是一个更加高效和安全的解决方案。以下是配置LDAP认证的步骤:
-
获取LDAP组织信息
-
与您的LDAP管理员或IT部门联系,获取LDAP集成所需的参数信息。
-
这些参数通常包括LDAP服务器的地址、用户组织信息(如域名、组织单元等)以及一个具有查询权限的用户账号。
-
插件配置
-
安装LDAP插件
-
启用LDAP认证
在“全局安全配置”页面中,将“Security Realm”设置为“LDAP”。然后,根据之前获取的LDAP参数信息,填写相关的配置字段,如LDAP服务器地址、用户搜索基础DN(Distinguished Name)、用户搜索过滤器等。
-
配置用户组
如果希望根据LDAP用户组来分配Jenkins角色,还需要配置LDAP用户组映射。这通常涉及到在Jenkins中定义一个或多个角色,并将这些角色与LDAP用户组相关联。
4.2权限管理
Jenkins的权限管理是一项至关重要的安全实践,旨在精确控制平台上不同租户对Jenkins项目的访问范围。当企业中有多个项目组共享同一个Jenkins实例进行CI/CD流程时,为每个项目组配置独立的权限显得尤为重要,以减少误操作和风险。
4.2.1安装Role-based插件
安装Role-based Authorization Strategy插件,并重启Jenkins。
4.2.2全局安全配置
在全局安全配置中,启用Role-based策略
4.2.3 创建角色
-
在“Manage Jenkins”页面中点击“Manage Roles”(管理角色)链接。
-
将看到三种角色类型:Global roles(全局角色)、Item roles(项目角色)和Node roles(节点角色)。
-
创建Global roles:
-
点击“Global roles”下的“Add role”(添加角色)按钮。
-
输入角色名,如“devopsdev”。
-
在“Permissions”部分选择开发人员常用的权限,如“Build”(构建)、“Configure”(配置)等。
-
保存角色。
-
-
创建Item roles:
-
点击“Item roles”下的“Add role”(添加角色)按钮。
-
输入角色名,如“devops”。
-
在“Pattern”字段中使用正则表达式设置权限作用范围,如
^devops-.*
以匹配所有以“devops-”开头的项目。 -
在“Permissions”部分选择所需的权限,如“Build”、“Cancel”、“Configure”、“Read”等。
-
保存角色。
-
4.2.4授权角色
完成角色创建后,需要将角色分配给相应的用户或用户组。
-
在“Manage Jenkins”页面中点击“Assign Roles”(分配角色)链接。
-
根据需要选择“Grant roles to users”(将角色授予用户)或“Grant roles to groups”(将角色授予用户组)。
-
在“Roles to assign”(要分配的角色)部分选择之前创建的角色。
-
在“Users/groups”(用户/用户组)部分选择要将角色分配给的用户或用户组。
-
保存分配。
4.2.5测试权限
最后,通过测试账号登录Jenkins来验证权限配置是否成功。
-
使用测试账号(已分配特定角色的用户)登录Jenkins。
-
检查该用户只能看到与其角色相关的项目。
-
尝试进行构建、配置等操作,确保权限正确分配且有效。
4.3凭据管理
在实施DevOps流程中,Jenkins作为核心自动化引擎,经常需要与其他系统(如代码仓库、构建工具、部署环境等)进行集成和交互。这些交互通常要求Jenkins提供目标系统的认证信息,例如用户名和密码、API密钥等。为了确保这些敏感信息的安全存储和便捷使用,Jenkins提供了凭据管理功能。
4.3.1安装凭据插件
4.3.2创建凭据
-
在凭据存储中,点击“添加凭据”。
-
选择凭据类型(如用户名和密码)。
-
填写凭据信息(如GitLab仓库的用户名和密码),并添加描述。
-
创建后,将生成凭据ID,供Pipeline引用。
五、Jenkins Pipeline实战
Jenkins Pipeline使用Groovy脚本语言来定义流水线,这些脚本可以访问Jenkins管理员配置的插件,并与外部系统(如版本控制系统、云平台等工具系统)集成。通过Jenkins Pipeline,用户可以在Jenkins环境中实现CI/CD工作流,并可以通过定义多个阶段和任务来实现自动化流程。具体可以参考https://jenkins.xfoss.com/pipeline.html