三、【Pipeline流水线】多阶段、构建代理、options、sh、Groovy沙盒、批准脚本 小杨_老师 2025年05月13日 预计阅读 10 分钟 原文 ### Pipeline流水线 什么是Jenkins Pipeline - Pipeline 项目:使用 Pipeline DSL 编写的 Pipeline 脚本更加结构化和可读性更高,便于理解和维护。 - Pipeline 项目:提供了更强大的灵活性和可扩展性,可以定义多个阶段(如构建、测试、部署等),并且支持并行执行 - Pipeline 项目:Pipeline 脚本可以存储在版本控制系统中,便于团队协作和版本控制。 jenkins自由式项目和pipeline项目区别 - Pipeline 项目更适合现代的持续集成和持续交付实践,提供了更强大的灵活性、可读性和可维护性。然而,自由式项目仍然适用于一些简单的构建需求或不需要复杂 Pipeline 的场景。 创建流水线 - 新建任务->输入任务名称->流水线 流水线要展示**阶段视图**的话,需要安装插件:**Pipeline: Stage View** 单阶段与多阶段流水线 ```groovy pipeline { agent any stages { stage('Stage 1'){ steps { echo 'Helloworld!' } } } } pipeline { agent any stages { stage('Stage 1'){ steps { echo 'Helloworld!' } } stage('Stage 2'){ steps { echo 'Helloworld!' } } } } ``` 编写一个自由风格的任务构建: - 命名:style-demo ,选择 - 丢弃旧的构建: - 保持构建的天数:7,指保留最近7天的数据; - 保持构建的最大个数:15, 指最多保留最新的15个构建的数据 - Delete workspace before build starts:构建开始时会删除工作空间的文件 - 在构建日志中添加时间戳前缀 ### 构建代理 构建代理介绍 - 在 Jenkins Pipeline 中,agent 块用于指定构建的代理(Agent),也就是指定在哪个节点上执行 Pipeline 脚本。 - 通过使用 agent 块,你可以控制 Pipeline 脚本内容在哪个节点上执行 - agent 块是可选的。如果没有提供 agent 块,Jenkins 将默认使用 any 代理,这意味着脚本将在任何可用的节点上执行。 构建代理使用 - 示例:agent { node { label 'labelName' } } - 注意:agent { node { label 'labelName' } }行为与相同agent { label 'labelName' },但node允许其他选项(例如customWorkspace) - ```groovy pipeline { agent {node { label 'labelName'}} stages { stage('Stage 1'){ steps { echo 'Helloworld!' } } } } ``` 构建代理-any和none使用 - 当你在 Jenkins Pipeline 中使用 agent any 时,它表示构建可以在任何可用的代理节点上执行。 - 具体来说,Jenkins会根据配置的代理节点的可用性和负载情况选择一个可用的节点来执行构建。 - none不使用任何代理,局部需配置代理 - ```groovy pipeline { agent any stages { stage('Stage 1'){ steps { echo 'Helloworld!' } } } } ``` 定义构建代理 - 通过agent配置代理 - ```groovy pipeline { agent { node { label 'slave' // 定义node节点的标签名 customWorkspace '/some/other/path' // 自定义构建的工作空间 } } stages { stage('Stage 1'){ steps { echo 'Helloworld!' } } } } ``` 全局代理和局部代理 - 全局代理和局部代理共同配置的情况下,局部代理优先生效 - ```groovy pipeline { agent { label 'global-agent' //全局代理的标签名 } stages { stage('Local Agent Stage'){ agent { label 'local-agent' // 这里定义了局部代理,将会覆盖全局代理 } steps { // 在局部代理上执行的步骤 } } stage('Aother Local Agent Stage'){ //这里没有定义局部代理默认使用全局代理 steps { // 在另一个局部代理上执行的步骤 } } } } ``` Jenkins新增节点: - 系统管理 -> 节点和云管理 -> 节点列表 -> New Node - 创建一个slave_01,选中固定节点 - 标签:slave,启动方式:通过Java Web启动代理 - 找一台服务器将里面的Run from agent command line命令在服务器执行 举例: ```groovy pipeline { agent none stages { stage('Example Build') { agent { docker { label 'slave' 'maven:3.9.3-eclipse-temurin-17' // 如果需要加参数 // args '-v /path/to/mount:/tmp' } } steps { echo 'Hello, Maven' sh 'mvn --version' } } stage('Example Test') { agent { docker 'openjdk:17-jre' } steps { echo 'Hello, JDK' sh 'java -version' } } } } ``` ### options - 在Jenkins中,options是用于配置构建流水线的一种方式。它允许您定义一些全局选项,以自定义构建流程的行为,比如:这个构建保留多少日志、多少天,整个流水线的执行时间是多少.... ```groovy pipeline { agent any options { disableConcurrentBuilds() } stages { ... } } ``` 各种场景 - 失败时,重试整个管道指定的次数retry(3) - 整个管理的执行超时,其他单位MINUTES,SECONDStimeout(time: 1, unit: 'HOURS') - 控制台日志添加时间戳,全局配置在系统配置中配置timestamps() - 并行执行步骤的时候,有一个失败则注水线马上退出parallelsAlwaysFailFast() - 终止旧构建只保留最新的构建disableConcurrentBuilds(abortPrevious: true) - 只保存最近十个构建buildDiscarder(logRotator(numToKeepStr: '10')) - 跳过自动检出代码。默认自动检出代码,禁止后需要手动 checkout scmskipDefaultCheckout() ```groovy // 全局配置 options { retry(3) timeout(time: 1, unit: 'HOURS') //MINUTES, SECONDS timestamps() parallelsAlwaysFailFast() disableConcurrentBuilds(abortPrevious: true) buildDiscarder(logRotator(numToKeepStr: '10')) skipDefaultCheckout() } ``` - 非在options全局配置,只针对某个步骤生效 - ```groovy // 局部配置 pipeline { agent any stages { stage('Stage 1') { steps { timeout(time: 3, unit: 'SECONDS'){ sh 'sleep 4' } } } stage('Stage 2') { steps { retry(2){ sh 'echo hello' } } } } } ``` ### sh - sh '':表示Shell命令将以字面上的方式进行解析 - sh "":表示Shell命令将进行变量替换和转义字符解释。 - h ''' '''和sh """ """:可以进行变量替换和转义字符解释。并且不需要使用转义字符来表示多行Shell命令 ```shell steps { sh 'echo "Hello,\nworld!"' } steps { sh "echo \"Hello,\nworld!\"" } ``` ### Groovy沙盒 - Jenkins的Groovy沙盒是一种安全机制,用于限制Jenkins Pipeline中Groovy脚本的权限,它提供了一种沙盒环境,其中Groovy脚本只能访问受限的API和功能。 - 当未勾选使用Groovy沙盒时,则可看到需要批准脚本(审核),此脚本才允许被执行 ### 批准脚本 - 系统管理->ScriptApproval 点击Approve,把这个脚本审核后才可以构建,当每次修改脚本后都要再次批准才可以构建。
评论区