首页 文章 精选 留言 我的

精选列表

搜索[ci],共5728篇文章
优秀的个人博客,低调大师

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

Jenkins 相关的教程,我已经出了两期了。 第一章,我讲到了通过 docker 快速部署 Jenkins 以及安装 Jenkins 的必要插件。 第二章,我讲到了通过 sshPublisher 去目标服务器上发布项目。 今天,我来讲讲如何通过代理节点去目标服务器上发布项目。其实这里实现的效果和第二章中实现的效果是一样的,都是去目标服务器上执行发布项目的脚本,进行项目的编译和发布。 个人觉得,二选一,掌握一种方式就好了。 下面,我默认你已经看过了上面我写的两篇文章,因此,一些相同的部分,我就不再赘述。 ## 添加节点 1. 来到**系统管理**页面,点击「节点和云管理」 ![节点和云管理](https://developer.qcloudimg.com/http-save/yehe-11152621/f4de9f2ad75c09427911a2542918f3ee.webp) 默认已经有了一个节点,我们点击「New Node」添加新的节点 ![添加新的节点](https://developer.qcloudimg.com/http-save/yehe-11152621/e26d66fb425426066efb0458c506d031.webp) 2. 填写节点名称 ![添加节点](https://developer.qcloudimg.com/http-save/yehe-11152621/c0c851b732adcd91f1da185f3747a9b8.webp) 3. 填写节点的详细信息 ![填写参数](https://developer.qcloudimg.com/http-save/yehe-11152621/34f3664a7796416bbbdc23cb38ff47c1.webp) 是不是看到这里的 `Credentials` 有一种莫名的亲切感?是的,这就是在第二章节中,在凭据管理页面死活找不到的添加凭据的地方。 ![继续填写参数](https://developer.qcloudimg.com/http-save/yehe-11152621/344dfe7a860283d15ad3094670d0281e.webp) 添加新的凭据 ![添加凭据](https://developer.qcloudimg.com/http-save/yehe-11152621/6ac62e740ce6d93713e89c3ca0a96edf.webp) 这里需要添加的是目标服务器上,用于 ssh 登录的用户 jenkinsjob 的账号和密码 ![添加账号和密码](https://developer.qcloudimg.com/http-save/yehe-11152621/eb43fd07b58deb552451115b0e19ecbc.webp) 选择刚刚新添加的凭据 ![选中凭据](https://developer.qcloudimg.com/http-save/yehe-11152621/3a01539f3ba0c0477c8064350fda18bc.webp) 填写完了之后就直接点击保存。 ## 查看节点 回到节点列表,我们可以看到刚刚我们添加的节点已经添加成功了。 ![新添加的节点](https://developer.qcloudimg.com/http-save/yehe-11152621/ec9254a2a50b02eeb65ab88b84765aa2.webp) 我们点击刚刚新添加的节点,进入节点详情,然后点击右上角的「上线节点」,看节点是否能够上线成功 ![上线节点](https://developer.qcloudimg.com/http-save/yehe-11152621/842fa17413dff02af03f743f1287a006.webp) ## 上线节点 一般情况下而言,可能多半就会报如下类似的错误: ```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 账号登录之后,我们可以看到当时设置的远程目录下会存在 ![远程目录下会存在这两个](https://developer.qcloudimg.com/http-save/yehe-11152621/01983af8ed838df69fbb0195e8948307.webp) ## 编写 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 那么,添加任务流就和第二章节中是一样的了。赶紧来试试看吧。 ![控制台输出](https://developer.qcloudimg.com/http-save/yehe-11152621/1050928c04b16b526dbf7829b03f556a.webp) 并且当我们执行工作流时,我们发现这个位置确实就是在我们设置的节点上运行的。 ![执行成功](https://developer.qcloudimg.com/http-save/yehe-11152621/fd55c96a7b289837ed5db5f859f4bb6f.webp) ## 总结 如果采用第二章中 sshPublisher 的方式去访问目标服务器,那么就一定得安装 `Publish Over SSH` 插件。并且在 Jenkins 上写执行命令时会稍微复杂一点点。 如果采用本章中添加代理节点的方式去访问目标服务器,那么在目标服务器上就必须得安装 Java 运行环境。 两种方式都可以实现访问目标服务器,并直接在目标服务器上执行部署项目的脚本命令。 ## 其他 Q:我们怎么可以查看到一个工作流的 jenkinsfile 内容呢? A:可以直接在 `/var/jenkins_home/jobs` 目录下找到对应的工作名称,然后查看 `config.xml` 文件 Q:如何查看到代理节点数据? A:直接查看 `/var/jenkins_home/nodes` 目录 好了,以上就是 Jenkins 教程中的全部内容了。这 3 篇教程中,完全不会讲解枯燥无味的概念性东西,所有的内容都是可以直接上手去用的。希望对你有所帮助。 创作不易,希望可以帮忙点赞并关注支持一下,谢谢。

优秀的个人博客,低调大师

【CI/CD技术专题】「Jenkins实战系列」(2)Jenkins实现自动化部署+自动化合并分支

## 技术资源推荐 [jenkins官方文档(中文版)](https://www.jenkins.io/zh/doc/ "jenkins官方文档(中文版)") [jenkins官方网站](https://plugins.jenkins.io/git/#GitPlugin-AdvancedFeatures "jenkins官方网站") ## 自动定时构建 ### 定时构建语法: ```` * * * * * ```` - 第一个 * 表示分钟,取值0~59,若其他值不做设定,则表示每个设定的分钟都会构建 - 第二个 * 表示小时,取值0~23, 若其他值不做设定,则表示每个设定小时的每分钟都会构建 - 第三个 * 表示一个月的第几天,取值1~31,若其他值不做设定,则表示每个月的那一天每分钟都会构建一次 - 第四个 * 表示第几月,取值1~12,若其他值不做设定,则表示每年的那个月每分钟都会构建一次 - 第五个 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日,若其他值不做设定,则表示每周的那一天几每分钟都会构建一次 ### 常用定时构建举例: - **由于项目的代码一般存在放SVN/GIT中,而一个SVN/GIT往往是有多个项目组在提交代码,而每个项目组又有多人组成,其中每个人也都在对自己的那块代码不停地在进行维护**。 - **所以说对于一个公司而言,SVN/GIT的提交记录往往是很频繁的,正因为如此,Jenkins在执行自动化构建时往往是以天为单位来执行的,下面举的例子就是在一天中常用的定时构建示例**。 #### 每隔5分钟构建一次 > H/5 * * * * #### 每两小时构建一次 > H H/2 * * * #### 每天中午下班前定时构建一次 > 0 12 * * * #### 每天下午下班前定时构建一次 > 0 18 * * * ### 定时构建位置 > **在“配置”->“构建触发器”中,如下图所示**: ![](https://oscimg.oschina.net/oscnet/up-37467665b5c5d96dd26638ff6f84fdfb100.png) > **Build after other projects are built:在其他项目触发的时候触发,里面有分为三种情况,也就是其他项目构建成功、失败、或者不稳定的时候触发项目;** #### **Poll SCM和Build periodically来进行定时自动构建项目**; - **Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。如下图配置**: 在 构建触发器 中选择“Poll SCM” ![](https://oscimg.oschina.net/oscnet/up-a9f7b379807473ba2a28d81d9e028cacb3f.png) ##### Build periodically ![](https://oscimg.oschina.net/oscnet/up-322c7f17e83fe3a808dc57aaa65925a84e5.png) ##### Poll SCM ![](https://oscimg.oschina.net/oscnet/up-81d020d00027c1ed175bb6a636fa22f7c37.png) > **输入框为 分,时,日,月,星期,* 号代表不限制,我设置的是每天早8点自动部署**。 ![](https://oscimg.oschina.net/oscnet/up-444f81f11292bde498170578e7c792d078b.png) > * / 5 * * * * (**每5分钟检查一次源码变化**) - **Build periodically:周期进行项目构建(它不关心源码是否发生变化),如下图配置**: > H 2 * * * (每天2:00 必须build一次源码) #### 在 Schedule 中填写 > 0 * * * * - **第一个参数代表的是分钟 minute,取值 0~59;** - **第二个参数代表的是小时 hour,取值 0~23;** - **第三个参数代表的是天 day,取值 1~31;** - **第四个参数代表的是月 month,取值 1~12;** - **最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。** > **所以 0 * * * * 表示的就是每个小时的第 0 分钟执行构建。** ### 最后补充几个案例 - 在每个小时的前半个小时内的每10分钟 > H(0-29)/10 * * * * - **每两小时45分钟,从上午9:45开始,每天下午3:45结束** > 45 9-16/2 * * 1-5 - 每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38) > H H(9-16)/2 * * 1-5 - **每月(除了12月)从1号到15号这段时间内某刻**。 > H H 1,15 1-11 * - **每周四,19点30分** > 30 19 * * 4 - **每天早晨8点** > 0 8 * * * - **每周六日的8点12点18点构建** > H 8,12,18 * * 6,7 - **每周1到周5,8点到23点,每小时构建一次** > H 8-23 * * 1-5 - **每周1到周5,8点到23点,每两小时构建一次** > H 8-23/2 * * 1-5 - **每周1到周5,8点到23点,每30分钟构建一次** > H/30 8-23 * * 1-5 ## Jenkins自动合并分支 通过jenkins发布项目时,可能需要合并分支,如:发布测试环境的时候需要把dev分支合并到test分支,此时就可以用jenkins自动实现。 ![](https://oscimg.oschina.net/oscnet/up-0b7182d811a6c454ba931c02e0b0bf85224.png) ![](https://oscimg.oschina.net/oscnet/up-d62244e8784d081ff3ac708fa813f67795b.png) ![](https://oscimg.oschina.net/oscnet/up-28ceac1db06c275d985ad410d725056b0db.png) ## 配置构建的参数 ![](https://oscimg.oschina.net/oscnet/up-5a5f7dfac4fcbbf4c72a67b95a2b758931d.png) - Source files 项目构建后的目录 - Remove prefix 去前缀 - Remote directoty 发布的目录 - Exec command 发布完执行的命令,我这边写的是发布完会重启tomcat ```` #! /bin/bash tomcat_home=/usr/local/tomcat-8 SHUTDOWN=$tomcat_home/bin/shutdown.sh STARTTOMCAT=$tomcat_home/bin/startup.sh echo "关闭$tomcat_home" $SHUTDOWN #杀死tomcat进程 ps -ef | grep $path | grep java | awk '{print $2}' | xargs kill -9 #删除日志文件,如果你不先删除可以不要下面一行 rm $tomcat_home/logs/* -rf #删除tomcat的临时目录 rm $tomcat_home/work/* -rf sleep 5 echo "启动$tomcat_home" $STARTTOMCAT #看启动日志 #tail -f $tomcat_home/logs/catalina.out ````

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册