在Jenkins pipeline中执行groovy脚本

本文介绍了如何在Jenkins Pipeline中使用Groovy脚本进行自动化任务,包括创建Jenkins job,配置Pipeline从Git获取脚本,执行不同阶段的构建任务,处理shell命令,定义和使用参数,以及安全地使用Credentials。通过实例展示了Groovy脚本在持续集成流程中的应用。

最近又get到一个技能,通过在Jenkins pipeline中使用groovy脚本来完成一些功能。

ps: 换到了正常的team后逐渐回归正轨,和勾心斗角说声再也不见,每天都有进步,这不就是程序猿该有的样子嘛。

创建Jenkins job:

1. New Item -> 选择 'Pipeline' 填写item name,创建新的Jenkins job;

2. 进入刚才创建好的job,打开Configure,在Pipeline下填写以下内容:

Definition:Pipeline scripts from SCM

SCM: Git

Repositores:

  • git url --> groovy脚本所在的git
  • credentials --> 有git权限的账号和密码
  • branches to build: groovy脚本所在的branch
  • Repository browser:Auto

Scripts Path: groovy脚本在git中的路径

Groovy脚本:

1. 分步骤执行:

pipeline {
    stages {
        stage('download source') {
            steps {
                echo 'download source'
            }
        }
        stage('build') {
            steps {
                echo 'build'
            }
        }
        stage('deploy') {
            steps {
                echo 'deploy'
            }
        }
    }
}

2. 执行shell脚本:

获取标准输出:def path = sh returnStdout: true, scripts "pwd"

只执行脚本,不需要结果: sh scripts: "pwd"

执行脚本获取状态:def status = sh returnStatus: true, scripts: "pwd"

3. 不在console中打印shell命令,比如shell命令中带了密码等敏感信息时使用:

def scriptString = "xxxxxxx"

def content = sh returnStdout: true, scripts "#!/bin/sh -e\n ${scriptString}"

4. 定义变量

  • 在groovy脚本中定义变量:

properties([

    parameters([ 

        string(name:'TEST', defaultValue:'value1', description:'it's testing parameters.')

    ])

])

  • 在Configure中定义: 

勾选中This project is parameterized, 然后点击Add Parameter添加变量,选择变量类型,填写变量名称,default value,description。

  • 在groovy脚本中使用变量:def param1 = params.TEST

5. 定时启动Jenkins job:

  • 在groovy脚本中定义定时任务:

properties([

   pipelineTriggers([cron('H 1 * * 1-5')])

])

  • 在Configure中定义: 

找到Build Triggers,勾选中Build periodically,在Schedule中填写cron表达式

Credentials:

1. 在Jenkins job中添加credential,打开要使用credentials的folder,在左边菜单栏中找到Credentials点进去(如果看不到Credentials说明没有权限),选择存储Credential的scope,点击Add Credentials创建

Kind:选择credential的类型,比如选择了Username and password,就是要用username+password创建一个Credential

eg:

ID: credential_test1

Username: fooUser

Password: xxxxx

ID: Credential的ID,不能和已有的Credentials一样

2. groovy脚本中使用Credential:

withCredentials([usernamePassword(credentialsId: 'credential_test1', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
    // do something with credentials

    def userName = "${USERNAME}"

    def password = "${PASSWORD}"
}

<think>嗯,用户的问题是关于在Jenkins Pipeline中动态加载来自SCM的Groovy脚本。我需要先理解用户的需求。他们可能是在尝试将Pipeline脚本存储在版本控制系统中,以便于管理和复用,而不是直接写在Jenkins的界面里。这样做的好处是可以版本控制脚本,方便团队协作,以及维护。 根据提供的引用内容,尤其是引用[2],里面提到了两种模式:直接在Jenkins中输入脚本Pipeline script)或者从SCM获取(Pipeline script from SCM)。用户可能已经知道这些基本方法,但现在想动态加载,也就是在Pipeline执行过程中从SCM拉取Groovy脚本执行。这可能涉及到在运行时获取外部脚本,而不是在配置Job时指定。 接下来,我需要回忆Jenkins Pipeline的相关知识。Jenkins Pipeline支持两种语法:Declarative和Scripted。动态加载脚本通常需要用到共享库(Shared Libraries)或者使用`load`步骤从文件系统加载。不过用户提到的是来自SCM,所以可能需要结合这两者。 共享库允许将通用的代码存放在版本库中,然后在Pipeline中导入使用。引用中的例子没有直接提到共享库,但引用[3]中的脚本示例使用了`sh`命令执行shell脚本,可能需要类似的方法来拉取代码。不过更规范的做法应该是使用Jenkins的内置功能。 另外,`checkout`步骤可以用来从SCM检出代码到工作区,然后使用`load`步骤加载Groovy文件。例如,先检出包含脚本的仓库,再加载其中的脚本文件。这种方法需要确保Jenkins有权限访问该仓库,并且路径正确。 可能需要考虑的是如何参数化仓库地址和脚本路径,使得用户可以在构建时动态指定。引用[1]提到可以添加参数,比如字符串参数,这样用户可以在运行时输入仓库URL和脚本路径,然后在Pipeline中使用这些参数进行检出和加载。 另外要注意的是安全性问题,动态加载外部脚本可能存在风险,需要确保来源可信。同时,脚本执行权限和沙箱环境可能需要配置,特别是在启用了Groovy沙箱的情况下。 总结步骤可能是:配置参数接收SCM地址和脚本路径,使用checkout步骤检出代码到工作区,然后使用load步骤加载指定的Groovy脚本。需要给出具体的代码示例,并解释每个步骤的作用。同时,可以提到共享库作为另一种更结构化的方法,适合长期复用。 需要验证这些步骤是否正确,比如`checkout`和`load`的使用是否符合Jenkins的语法,参数传递是否正确。例如,使用`checkout scm: ...`来克隆仓库,然后`load 'path/to/script.groovy'`来加载脚本。还要确保在Pipeline脚本中正确处理工作区路径,可能需要使用`dir`步骤进入子目录后再加载。 可能还需要提到如何处理依赖,比如如果加载的脚本依赖于其他文件或库,是否需要额外步骤。此外,错误处理也很重要,比如如果SCM检出失败或脚本不存在,Pipeline应该能够优雅地处理并报错。 最后,根据用户的问题生成相关的问题,比如如何参数化SCM配置,共享库的使用,或者如何处理脚本间的依赖关系。这些相关问题可以帮助用户进一步探索该主题。</think>在Jenkins Pipeline中动态加载来自SCM的Groovy脚本,可以通过以下步骤实现: --- ### **1. 使用 `checkout` 检出SCM代码** 首先在Pipeline中通过`checkout`步骤将远程仓库的代码拉取到本地工作空间: ```groovy pipeline { agent any parameters { string(name: 'SCRIPT_REPO', description: 'SCM仓库地址') string(name: 'SCRIPT_PATH', description: '脚本路径,如:src/main.groovy') } stages { stage('Load Script') { steps { script { // 检出包含脚本的仓库 checkout([ $class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: params.SCRIPT_REPO]] ]) // 加载指定路径的Groovy脚本 def externalScript = load params.SCRIPT_PATH externalScript.execute() // 调用脚本中的方法 } } } } } ``` 此示例通过参数化输入动态指定仓库地址和脚本路径,适用于临时性需求[^2][^4]。 --- ### **2. 通过共享库(Shared Libraries)实现** 共享库是Jenkins官方推荐的方式,适用于需要复用的场景: 1. **配置共享库**: 在Jenkins全局配置中,添加共享库定义(`Manage Jenkins » Configure System » Global Pipeline Libraries`),填写仓库地址和版本(如分支或标签)[^1]。 2. **在Pipeline中调用**: ```groovy @Library('my-shared-library') _ // 加载名为my-shared-library的共享库 pipeline { agent any stages { stage('Use Shared Script') { steps { script { mySharedMethod() // 调用共享库中的方法 } } } } } ``` 共享库的代码结构需符合规范(如`vars/`目录存放全局方法)[^5]。 --- ### **3. 结合 `fileLoader` 或 `Config File Provider`** 对于复杂场景(如多脚本依赖): - **使用 `fileLoader`**: 如果脚本需要动态解析,可结合工作区路径加载: ```groovy def scriptContent = readFile file: 'path/to/script.groovy' evaluate(scriptContent) // 直接执行脚本内容 ``` - **通过插件管理**: 安装`Config File Provider`插件,将脚本存储为配置文件,再通过ID动态加载。 --- ### **注意事项** - **安全性**:确保SCM来源可信,避免注入攻击。 - **沙箱限制**:若启用Groovy沙箱,需在`Manage Jenkins » In-process Script Approval`中审批敏感操作。 - **错误处理**:添加`try-catch`块处理脚本加载失败的情况。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值