繁体   English   中英

如何在 Jenkins 管道中加载 bash 脚本?

[英]How to load bash script in Jenkins pipeline?

我们有一些复杂的 bash 脚本,现在位于 Jenkins 的托管文件部分。 我们尝试将作业迁移到管道,但我们不知道将 bash 脚本转换为 groovy,因此我们希望将其保留在 bash 中。 我们在 Git 中有一个 jenkins-shared-library,我们在其中存储我们的管道模板。 在作业中,我们添加了正确的环境变量。

我们希望将 bash 脚本保存在 git 中而不是托管文件中。 在管道中加载此脚本并执行它的正确方法是什么? 我们尝试了libraryResource一些东西,但我们没有设法让它工作。 我们必须将test.sh脚本放在 git 中的什么位置,我们如何调用它? (或者在这里运行shell脚本是完全错误的)

def call(body) {
    // evaluate the body block, and collect configuration into the object
    def pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()

    pipeline {
        agent any

        options {
            buildDiscarder(logRotator(numToKeepStr: '3'))
        }

        stages {

            stage ('ExecuteTestScript') {
                steps {
                    def script = libraryResource 'loadtestscript?'

                    script {
                        sh './test.sh'
                    }
                }
            }

        }

        post {
            always {
                cleanWs()
            }

        }

    }
}

在我的公司,我们的 CI 中也有复杂的 bash 脚本,而libraryResource是一个更好的解决方案。 按照您的脚本,您可以执行一些更改以使用存储在libraryResourcebash脚本:

stages {
    stage ('ExecuteTestScript') {
        steps {
            // Load script from library with package path
            def script_bash = libraryResource 'com/example/loadtestscript'

            // create a file with script_bash content
            writeFile file: './test.sh', text: script_bash

            // Run it!
            sh 'bash ./test.sh'
        }
    }
}

我想详细说明@Barizon 的答案,这为我指明了正确的方向。

我的需要是使用 ssh 在远程服务上执行脚本。

我在共享库项目的/var文件夹中创建了一个 groovy 脚本,我们称之为my_script.groovy

在脚本中我定义了函数:

def my_function(String serverIp, String scriptArgument) {
    def script_content = libraryResource 'my_scripts/test.sh'
    // create a file with script_bash content
    writeFile file: './test.sh', text: script_content
    echo "Execute remote script test.sh..."
    def sshCommand = "ssh username@${serverIp} \'bash -xs\' < ./test.sh ${scriptArgument}"
    echo "Ssh command is: ${sshCommand}"
    sh(sshCommand)
}

从管道中,我可以像这样调用它:

@Library('MySharedLibrary')_
pipeline {
  agent any
  stages {
    stage('MyStage') {
        steps {
            script {
                my_script.my_function("192.168.1.1", "scriptArgumentValue")
            }
        }
    }
  }
}

您可以直接从自定义步骤调用脚本,而不是将脚本复制到您的工作区。 例如,在库的 vars 目录中创建一个名为doSomething.groovy

#!/usr/bin/env groovy

def call(args) {
    def scriptDir = WORKSPACE + '@libs/my-shared-library'
    sh "$scriptDir/do-something.sh $args"
}

这是有效的,因为共享库被检出到以作业的工作空间命名的目录中,后缀为@libs。 如果您愿意,可以将do-something.sh移动到库的资源目录或其他目录。

我不知道这对于 OP 是否不可能,但我发现将我的实用程序脚本保存在与 Jenkinsfile 相同的 git 存储库中要简单得多,我从来libraryResource使用libraryResource 然后你可以直接用sh指令调用它们,你甚至可以传递environment块中定义的变量。 例如,在scriptsteps块内,在管道stage

sh "./build.sh $param1"

你也可以把一堆 bash 函数放在它自己的文件中,比如“ scripts/myfuncs.sh ”。 你甚至可以有一个调用这些脚本的 groovy 函数,本质上是一个包装器,见下文:

def call_func() {
  sh"""
    #!/bin/bash

    . ./scripts/myfuncs.sh
    my_util_func "$param1"
  """
}

需要注意的几点:

尽管在我的终端上我可以使用source scripts/myfuncs.sh ,但在 Jenkins 上我需要使用. source简写(如上所示)否则它会抱怨它找不到source

在将其推送到存储库之前,您必须使./scripts/myfuncs.sh可执行,例如chmod 755 ./scripts/myfuncs.sh

完整管道示例:

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        sh '''
          ./build.sh
        '''
      }
    }
  }
  post {
    always {
      sh '''
        ./scripts/clean.sh
      '''
    }
    success {
      script {
        if (env.BRANCH_NAME == 'master') {
          sh "./scripts/master.sh"
        } else if (env.BRANCH_NAME.startsWith('PR')) {
          sh "./scripts/mypr.sh"
        } else {
          // this is some other branch
        }
      }
    }
  }
}

在上面的示例中,“Jenkinsfile”和“build.sh”都在存储库的根目录中。

您可以从 bitbucket 或 git 使用。 在 bitbucket 或 git 中创建一个存储库,并在 jenkins 作业中进行配置。并在管道的脚本块中写入 sh 的主体

在此处输入图片说明

然后你可以配置 jenkins 文件并使用 test.sh

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM