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

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

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

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

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

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

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

添加节点

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

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

  1. 填写节点名称
  1. 填写节点的详细信息

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

添加新的凭据

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

选择刚刚新添加的凭据

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

查看节点

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

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

上线节点

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

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

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

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

bash 复制代码
java -jar remoting.jar

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

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

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

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

安装 java 环境

bash 复制代码
sudo apt update
sudo apt install -y openjdk-17-jdk

验证安装

bash 复制代码
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 文件内容供各位看官老爷们参考

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

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

相关推荐
小强198813 分钟前
告别 "if-else 地狱":PHP 中的策略模式、管道模式与责任链模式实战
后端
面试鸭16 分钟前
Codex 跑进法务部,周活居然暴涨了 108 倍???
后端·面试·求职
Larcher1 小时前
从 SDD 到可交付:我如何用规范驱动 AI 做出一个 Chrome 翻译插件
前端·后端·架构
choumou_M1 小时前
SpringBoot_5:商品秒杀场景的并发实践(初步)
java·spring boot·后端
潘正翔1 小时前
jenkins构建cicd流水线
运维·服务器·ci/cd·容器·自动化·jenkins·cicd
陈明勇2 小时前
Go 1.27 重磅发布:泛型方法落地、分配性能跃升,JSON v2 正式可用
后端
Zane19942 小时前
create_task 和直接 await 到底有什么不一样?asyncio 的 Task、gather 与并发数量控制
后端·python
喜欢吃豆2 小时前
5 分钟,让网页里站着一个会说话的 3D 数字人
后端
Python私教2 小时前
创业团队做管理系统,别先堆页面:我把 14 个问题做成了需求门禁
后端·python·架构
攻城有术2 小时前
专项攻克-SpringBoot启动后 Bean的实例数量问题
java·spring boot·后端