[英]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
是一个更好的解决方案。 按照您的脚本,您可以执行一些更改以使用存储在libraryResource
的bash
脚本:
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
块中定义的变量。 例如,在script
或steps
块内,在管道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”都在存储库的根目录中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.