为什么要用Agent模式搭建CI/CD流水线
持续集成与持续交付的核心目标是让代码从提交到上线的过程完全自动化,而这个过程涉及编译、测试、打包、部署等多个计算密集型环节。如果把所有构建任务都压在Jenkins主节点上,主节点很快会因为资源耗尽变得卡顿,甚至影响整个管理界面的响应。Agent模式的意义就在于此:主节点只负责任务调度和界面管理,真正的构建工作分散到一台台Agent节点上执行,形成主从架构。

Agent节点的类型主要有两种。一种是静态Agent,也就是预先配置好的固定机器,通过SSH或者JNLP方式接入Jenkins主节点,适合构建任务量稳定、环境依赖固定的团队。另一种是动态Agent,借助Docker或Kubernetes按需创建容器来执行任务,任务结束后容器销毁,资源利用率更高,也避免了环境残留导致的构建污染。对于追求弹性的团队,动态Agent配合GitLab的Webhook触发机制,几乎可以实现提交代码后全自动的构建闭环。
从GitLab这边看,它承担代码仓库和触发源的角色。开发者推送代码到指定分支,GitLab通过Webhook通知Jenkins,Jenkins再根据流水线定义将任务分发到某个Agent上执行。理解这条链路,是后续所有配置工作的基础。
Jenkins与GitLab的集成配置步骤
集成的第一步是安装插件。在Jenkins的插件管理页面中,需要安装GitLab Plugin和GitLab Branch Source Plugin,前者负责与GitLab API通信,后者支持自动为分支和合并请求创建流水线。安装完成后,进入系统配置,找到GitLab相关配置项,填入GitLab的连接地址和一个具有API访问权限的访问令牌。令牌在GitLab的用户设置中生成,建议单独创建一个服务账号专门用于集成,避免使用个人账号带来的权限风险。
连接测试通过后,接下来配置项目的Webhook。在GitLab项目页面的设置菜单中,选择Webhooks,填入Jenkins的回调地址,事件勾选Push Events和Merge Request Events。这里有个常见的坑:如果Jenkins部署在内网,GitLab服务器无法访问该地址,Webhook测试会报连接超时。解决办法是检查防火墙规则,或者通过反向代理将Jenkins暴露给GitLab可达的网络区域。
下面是一个典型的Jenkinsfile片段,演示了拉取代码、构建和通知三个阶段:
pipeline {
agent { label 'docker-agent' }
stages {
stage('拉取代码') {
steps {
checkout scm
}
}
stage('编译构建') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('单元测试') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
}
post {
success {
echo '构建成功,可触发部署流程'
}
failure {
echo '构建失败,请检查日志'
}
}
}需要注意的是,流水线文件放在仓库根目录下,命名为Jenkinsfile,Jenkins任务配置中选择Pipeline script from SCM模式,这样流水线的变更也能像代码一样被版本管理和评审,这是业界推荐的做法。
Agent节点的规划与常见问题排查
Agent节点规划的好坏直接影响流水线的稳定性。首先要给节点打标签,比如按用途分为build、test、deploy三类,流水线中通过label指定在哪种节点执行。这样即使某一类任务激增,也不会挤占部署节点的资源。其次要控制单节点的并发执行器数量,一般按CPU核数来估算,执行器过多会导致构建互相干扰,过少则浪费资源。
如果使用Docker动态Agent,需要在Jenkins中配置Cloud插件,并确保Agent容器内能够访问主节点的JNLP端口。Kubernetes场景下则推荐使用Kubernetes Plugin,它会根据任务队列自动创建Pod,配置中要重点指定镜像、资源限制和挂载的工作空间卷。工作空间如果不做持久化,每次构建都要重新拉取依赖,可以引入Maven或npm的本地缓存仓库来加速。
排查问题时有几个高频报错值得记住。Agent离线通常由JNLP端口不通或令牌失效导致,可以在节点日志中查看握手信息。构建报找不到命令,多半是Agent容器镜像中缺少对应工具,正确做法是定制包含完整工具链的基础镜像,而不是在流水线里临时安装。Webhook触发不生效时,先去GitLab的Webhook页面查看请求历史,根据返回码定位是认证问题还是网络问题。
安全方面也不能忽视。GitLab令牌、服务器密码等敏感信息应统一存放在Jenkins的凭据管理中,通过withCredentials语法在流水线中引用,严禁明文写在Jenkinsfile里。同时建议开启主节点与Agent之间的通信加密,并定期轮换令牌。做好这几点,整套流水线才能长期稳定运行,真正发挥持续交付的效率优势。