手摸手教你玩 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 篇教程中,完全不会讲解枯燥无味的概念性东西,所有的内容都是可以直接上手去用的。希望对你有所帮助。

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

相关文章
|
安全 jenkins 网络安全
Jenkins中node节点添加之SSH方式2
Jenkins中node节点添加之SSH方式2
1578 1
|
4月前
|
jenkins 持续交付 开发工具
手摸手教你玩 Jenkins,一次搞懂 CI/CD!(第一章:部署)
Jenkins 是开源CI/CD自动化工具,支持代码拉取、构建、测试、部署全流程。本文详解Docker一键部署(含国内镜像加速)、初始配置及必备插件(Git Parameter、Publish Over SSH),助开发者告别手动运维,实现高效持续集成与交付。(239字)
403 1
手摸手教你玩 Jenkins,一次搞懂 CI/CD!(第一章:部署)
|
开发工具 git
【git 实用指南】git 修复错误提交,版本回退
【git 实用指南】git 修复错误提交,版本回退
792 1
|
API 数据安全/隐私保护
Argo CD接入LDAP认证或者gitea认证的方法
argocd默认是通过修改argocd-cm来添加账户的,添加完账户后,还需要使用argocd客户端命令去给账户设置密码,这肯定是比较麻烦的,为了方便使用,我们可以接入ldap认证或者gitea的oauth2认证。 这里我们主要写ldap认证,因为gitea没有提供组信息给dex,而ldap能返回组信息 ,gitea的接入会在文章的末尾进行简单介绍 关键词:argocd ldap dex
2859 1
Argo CD接入LDAP认证或者gitea认证的方法
|
4月前
|
弹性计算 关系型数据库 MySQL
阿里云Linux云服务器部署MySQL数据库:从零搭建到生产级运维全攻略
本文系统性地讲解在阿里云ECS Linux实例上部署MySQL数据库的完整流程,涵盖环境准备、YUM/DNF安装、安全初始化、用户权限管理、远程访问配置、性能参数调优、日常备份恢复策略以及高频故障排查。文章基于Alibaba Cloud Linux 3、CentOS 7/8等主流发行版,提供了可直接复用的命令脚本和配置文件示例,帮助读者从零开始搭建一个安全、稳定、高效的自建MySQL生产环境。
|
4月前
|
人工智能 文字识别 搜索推荐
GEO优化实战深度指南:从文章到多模态,让AI搜索引擎优先引用你
一份可直接照做的操作手册。读完你应能回答三个问题:AI 引擎凭什么引用你的内容?纯文章该怎么改?图片、视频、音频又该怎么补上?
670 0
|
4月前
|
SQL 存储 分布式计算
阿里云MaxCompute海量数据离线分析完全指南:从架构原理到性能调优
本文系统性地剖析了阿里云MaxCompute作为企业级EB级数据仓库解决方案在海量数据离线分析场景中的完整技术体系。文章从MaxCompute的Serverless架构与存算分离设计理念切入,深入解析了Pangu分布式文件系统、AliORC列式存储、伏羲调度框架等核心组件的工作原理。在开发实践层面,详细讲解了DDL/DML/DQL操作、分区表设计、MapReduce编程、UDF自定义函数开发以及PyODPS数据科学计算等关键技术。针对数据同步场景,阐述了DataWorks数据集成中离线同步的策略选择与分区优化方案。在性能调优方面,重点介绍了小表广播、动态分区裁剪、Hash Clustering
|
4月前
|
消息中间件 缓存 小程序
私域直播小程序/APP开发:直播商城一体化架构与核心模块解析
私域直播商城需摒弃“重前端轻后台”思维,强调直播、商品、订单、会员、消息等模块的统一架构设计。通过服务拆分、WebSocket实时通信、Redis预扣减+消息队列异步处理、分布式锁与幂等校验等手段,保障高并发下的稳定性与可扩展性。
|
4月前
|
监控 安全 前端开发
多资产加密平台仿冒钓鱼攻击全链路技术与闭环防护研究 —— 以 Bitget 反诈预警事件为样本
本文剖析Bitget披露的2026年多资产复合型钓鱼攻击,揭示“Unicode域名混淆+前端钱包劫持+终端木马+链上洗钱”全链路。提出五位一体闭环防御架构,含可复现代码与工程化方案,填补Web3高级钓鱼系统性研究空白。(240字)
263 1
|
4月前
|
人工智能 搜索推荐 BI
搭建教育培训平台源码必备功能清单:课程、直播、考试、会员一个不少
随着在线教育市场快速发展,越来越多企业开始搭建教育培训平台。本文从软件开发角度,详细介绍教育培训平台源码中的核心功能,包括课程管理、在线直播、考试答题、会员体系、后台管理等模块,帮助企业了解搭建在线教育系统需要具备哪些能力,为选择教育培训系统源码和开发方案提供参考。

热门文章

最新文章