手摸手教你玩 Jenkins,一次搞懂 CI/CD!(第三章:发布之nodeAgent)

简介: 本文为Jenkins系列教程第三篇,详解如何通过SSH代理节点实现远程部署:涵盖节点添加、凭据配置、Java环境安装及Jenkinsfile编写,对比sshPublisher方案,突出其简化脚本、无需额外插件的优势,强调实操性与可落地性。(239字)

Jenkins 相关的教程,我已经出了两期了。

第一章,我讲到了通过 docker 快速部署 Jenkins 以及安装 Jenkins 的必要插件。

第二章,我讲到了通过 sshPublisher 去目标服务器上发布项目。

今天,我来讲讲如何通过代理节点去目标服务器上发布项目。其实这里实现的效果和第二章中实现的效果是一样的,都是去目标服务器上执行发布项目的脚本,进行项目的编译和发布。

个人觉得,二选一,掌握一种方式就好了。

下面,我默认你已经看过了上面我写的两篇文章,因此,一些相同的部分,我就不再赘述。

添加节点

  1. 来到系统管理页面,点击「节点和云管理」

节点和云管理

默认已经有了一个节点,我们点击「New Node」添加新的节点

添加新的节点

  1. 填写节点名称

添加节点

  1. 填写节点的详细信息

填写参数

是不是看到这里的 Credentials 有一种莫名的亲切感?是的,这就是在第二章节中,在凭据管理页面死活找不到的添加凭据的地方。

继续填写参数

添加新的凭据

添加凭据

这里需要添加的是目标服务器上,用于 ssh 登录的用户 jenkinsjob 的账号和密码

添加账号和密码

选择刚刚新添加的凭据

选中凭据

填写完了之后就直接点击保存。

查看节点

回到节点列表,我们可以看到刚刚我们添加的节点已经添加成功了。

新添加的节点

我们点击刚刚新添加的节点,进入节点详情,然后点击右上角的「上线节点」,看节点是否能够上线成功

上线节点

上线节点

一般情况下而言,可能多半就会报如下类似的错误:

bash: line 1: java: command not found
Agent JVM has terminated. Exit code=127

原因是:Jenkins Agent 必须要能运行 Java,但你的服务器上没有 java 命令。

当 Jenkins 通过 SSH 连接 Agent 时,它会自动执行:

java -jar remoting.jar

也就是让 Agent 使用 Java 运行 Jenkins 的 remoting 进程。如果服务器上没有 Java,Agent 永远无法上线。

那么,如何解决这个问题呢?

直接在目标服务器上安装 java 环境就好了。

这里假设目标服务器为 ubuntu 系统:

安装 java 环境

sudo apt update
sudo apt install -y openjdk-17-jdk

验证安装

java -version

# 类似以下输出即可
#openjdk version "17.0.16" 2025-07-15
#OpenJDK Runtime Environment (build 17.0.16+8-Ubuntu-0ubuntu124.04.1)
#OpenJDK 64-Bit Server VM (build 17.0.16+8-Ubuntu-0ubuntu124.04.1, mixed mode, sharing)

javac -version
# 类似以下输出即可
#javac 17.0.16

然后我们重新上线节点,可以发现节点能够正常上线了。

并且我们在目标服务器上通过 jenkinsjob 账号登录之后,我们可以看到当时设置的远程目录下会存在

远程目录下会存在这两个

编写 jenkinsfile

这里还是老规矩,直接贴上我写好的 jenkinsfile 文件内容供各位看官老爷们参考

#!/usr/bin/env groovy Jenkinsfile

pipeline {
   
    agent {
    label 'node_ssh_jenkinsjob' }

    options {
   
        ansiColor('xterm')
    }

    parameters {
   
        booleanParam(
            name: 'Select_demo_project',
            description: '可以自己填写一下备注,需要注意 name 字段中,最好不要出现横杠 -'
        )

        gitParameter(
            name: 'Git_Branch_demo_project',
            branch: '',
            branchFilter: 'demo_project/(.*)',
            defaultValue: 'master',
            quickFilterEnabled: true,
            selectedValue: 'NONE',
            sortMode: 'NONE',
            tagFilter: '*',
            type: 'PT_BRANCH_TAG',
            useRepository: 'demo-project',
            description: '需要注意 gitParameter.name 字段中,最好不要出现横杠 -'
        )
    }

    stages {
   

        stage('Step1:初始化,确认参数') {
   
            steps {
   
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
   
                    checkout([
                        $class: 'GitSCM',
                        branches: [[name: '*/master']],
                        extensions: [],
                        userRemoteConfigs: [[
                            credentialsId: '86b1ba1c-db25-47b2-b50e-e58516641574',
                            name: 'demo-project',
                            url: 'http://127.0.0.1:8099/demo/demo-project.git'
                        ]]
                    ])
                }
            }
        }

        stage('Step2:发布服务') {
   
            steps {
   
                script {
   
                    if (Select_demo_project == 'true') {
   
                        echo "----------------构建参数--------------------"
                        echo "git分支:${Git_Branch_demo_project} ---> Select_demo_project:${Select_demo_project}"
                        sh 'cd /home/jenkinsjob/deploy_sample && sudo ./deploy.sh'
                    }
                }
            }
        }

    }


}

我们可以观察一下,第三章中的 jenkinsfile 和第二章中的 jenkinsfile 的差异性

差别最大的莫过于两点。

第一点

agent 发生了改变,这里由 agent any 改成了 agent { label 'node_ssh_jenkinsjob' }

需要注意的是,label 后面填写的是上面添加的节点的名称。

第二点

执行脚本的时候,这里直接在 sh '……………………' 中间就写了命令。相对来说简化了不少。


我们已经写好了 jenkinsfile 那么,添加任务流就和第二章节中是一样的了。赶紧来试试看吧。

控制台输出

并且当我们执行工作流时,我们发现这个位置确实就是在我们设置的节点上运行的。

执行成功

总结

如果采用第二章中 sshPublisher 的方式去访问目标服务器,那么就一定得安装 Publish Over SSH 插件。并且在 Jenkins 上写执行命令时会稍微复杂一点点。

如果采用本章中添加代理节点的方式去访问目标服务器,那么在目标服务器上就必须得安装 Java 运行环境。

两种方式都可以实现访问目标服务器,并直接在目标服务器上执行部署项目的脚本命令。

其他

Q:我们怎么可以查看到一个工作流的 jenkinsfile 内容呢?
A:可以直接在 /var/jenkins_home/jobs 目录下找到对应的工作名称,然后查看 config.xml 文件

Q:如何查看到代理节点数据?
A:直接查看 /var/jenkins_home/nodes 目录

好了,以上就是 Jenkins 教程中的全部内容了。这 3 篇教程中,完全不会讲解枯燥无味的概念性东西,所有的内容都是可以直接上手去用的。希望对你有所帮助。

创作不易,希望可以帮忙点赞并关注支持一下,谢谢。

相关文章
|
21天前
|
人工智能 Java API
2026年阿里云千问大模型全解:Qwen3.7模型矩阵、计费与全链路实操指南
2026年阿里云通义千问(代号Qwen)作为全栈自研国产大模型体系,依托百炼大模型服务平台统一对外提供推理、微调、智能体搭建、私有知识库、应用部署等一站式MaaS能力。整套产品不再是单一对话模型,而是覆盖纯文本、代码、图像、音频、视频、行业垂直领域的完整模型矩阵,2026主力迭代版本为Qwen3.7系列,在超长上下文、自主长周期智能体、多模态统一推理三大维度完成全面升级,深度适配国内中文业务场景,同时兼容国际通用API协议,可无缝对接各类IDE插件、开源智能体框架、企业自研业务系统。本文从模型定位、分层产品能力、四大计费体系、多端实操接入、分场景选型、成本优化、常见故障排查七个维度完整拆解,覆
581 0
|
21天前
|
SQL 存储 分布式计算
阿里云MaxCompute海量数据离线分析完全指南:从架构原理到性能调优
本文系统性地剖析了阿里云MaxCompute作为企业级EB级数据仓库解决方案在海量数据离线分析场景中的完整技术体系。文章从MaxCompute的Serverless架构与存算分离设计理念切入,深入解析了Pangu分布式文件系统、AliORC列式存储、伏羲调度框架等核心组件的工作原理。在开发实践层面,详细讲解了DDL/DML/DQL操作、分区表设计、MapReduce编程、UDF自定义函数开发以及PyODPS数据科学计算等关键技术。针对数据同步场景,阐述了DataWorks数据集成中离线同步的策略选择与分区优化方案。在性能调优方面,重点介绍了小表广播、动态分区裁剪、Hash Clustering
|
21天前
|
消息中间件 缓存 小程序
私域直播小程序/APP开发:直播商城一体化架构与核心模块解析
私域直播商城需摒弃“重前端轻后台”思维,强调直播、商品、订单、会员、消息等模块的统一架构设计。通过服务拆分、WebSocket实时通信、Redis预扣减+消息队列异步处理、分布式锁与幂等校验等手段,保障高并发下的稳定性与可扩展性。
|
21天前
|
SQL 关系型数据库 MySQL
阿里云RDS-MariaDB从零到实战:完整对接流程与SQL语法深度解析
本文提供了一份完整的阿里云RDS-MariaDB从入门到实战的技术指南。文章从RDS-MariaDB的核心优势与选型考量入手,详细讲解了实例创建、计费方式选择、地域与VPC网络规划、白名单安全配置、数据库与账号管理的完整对接流程。深入剖析了通过DMS、命令行、第三方客户端以及Python/Java应用程序连接RDS-MariaDB的多种方式,并提供了完整的代码示例。在SQL语法层面,系统梳理了MariaDB的DDL、DML、DQL核心语法体系,重点对比了MariaDB与MySQL的关键差异,包括存储引擎、字符集默认值、GTID复制机制、序列对象以及EXCEPT/INTERSECT集合操作等。文
|
21天前
|
分布式计算 DataWorks BI
阿里云智能决策平台对接使用完全指南:从架构解析到生产级集成实战
本文系统性地阐述了阿里云智能决策平台的完整对接与使用流程。首先剖析了平台的总体架构与核心决策引擎,指出该平台并非单一产品,而是整合了DataWorks、Quick BI、PAI、决策引擎、百炼大模型等多个核心产品的全链路决策智能体系。随后分模块详解了DataWorks数据开发治理平台的工作空间创建、数据源配置与数据集成JSON脚本示例;Quick BI智能数据分析与可视化工具的报表嵌入与OpenAPI自动化管理;PAI人工智能平台的模型训练、部署与EAS在线服务调用;决策引擎风险决策平台的事件接入、策略配置与API调用;以及百炼大模型平台的数据源对接、模型训练与智能体应用开发。文章提供了完整的
|
21天前
|
SQL 数据采集 缓存
Room 数据库迁移:让本地数据升级更稳
Room数据库迁移是Android本地数据升级的关键机制。通过定义Migration,安全处理表结构变更(如加字段、改名、拆表等),避免崩溃与数据丢失。需为非空字段设默认值,慎用破坏性迁移,并务必测试跨版本升级。迁移本质是守护用户历史数据的契约。
87 0
|
21天前
|
数据采集 人工智能 运维
比利时最高法院钓鱼赔付新规下银行风控与民事责任边界研究
2026年比利时最高法院就KBC银行钓鱼案作出里程碑判决,明确“点击仿冒链接”“忽略预警短信”等行为不构成法定“重大过失”,银行须全额赔付,并承担举证责任。本文以此为切入点,融合PSD2法规、司法标准与Python工程代码,构建“短信拦截—页面识别—交易风控”三层反钓鱼技术体系,推动银行从“追责客户”转向“强化技防”。
62 0
|
21天前
|
弹性计算 关系型数据库 MySQL
阿里云Linux云服务器部署MySQL数据库:从零搭建到生产级运维全攻略
本文系统性地讲解在阿里云ECS Linux实例上部署MySQL数据库的完整流程,涵盖环境准备、YUM/DNF安装、安全初始化、用户权限管理、远程访问配置、性能参数调优、日常备份恢复策略以及高频故障排查。文章基于Alibaba Cloud Linux 3、CentOS 7/8等主流发行版,提供了可直接复用的命令脚本和配置文件示例,帮助读者从零开始搭建一个安全、稳定、高效的自建MySQL生产环境。
|
21天前
|
人工智能 文字识别 搜索推荐
GEO优化实战深度指南:从文章到多模态,让AI搜索引擎优先引用你
一份可直接照做的操作手册。读完你应能回答三个问题:AI 引擎凭什么引用你的内容?纯文章该怎么改?图片、视频、音频又该怎么补上?
159 0
|
21天前
|
弹性计算 应用服务中间件 网络安全
阿里云ECS云服务器HTTPS证书配置完全指南:从申请到部署全流程解析
本文提供了一份完整的阿里云ECS云服务器HTTPS证书配置指南。文章从SSL/TLS证书的基础概念入手,详细介绍了阿里云免费证书与付费证书的区别、个人测试证书的申请流程(含自动DNS验证与手动DNS验证两种方式)、证书下载与上传方法,以及通过手动部署方式将证书配置到Nginx、Apache等主流Web服务器上的完整操作步骤。文章还涵盖了Nginx配置中的证书路径设置、强制HTTP跳转HTTPS、HTTP/2协议启用、SSL加密套件优化等进阶内容,并提供了Let's Encrypt免费证书的Certbot自动化申请与续期方案。最后总结了443端口安全组配置、证书链不完整、配置文件语法错误等常见问