对Jenkins管道运行bash命令

fdbelqdn  于 2022-10-23  发布在  Jenkins
关注(0)|答案(7)|浏览(417)

在groovy脚本中(针对Jenkins管道):如何运行bash命令而不是sh命令?

我尝试了以下几种方式:

sh调用内部调用#!/bin/bash

stage('Setting the variables values') {
    steps {
         sh '''
            #!/bin/bash
            echo "hello world"
         '''
    }
}

sh调用替换为bash调用:

stage('Setting the variables values') {
    steps {
         bash '''
            #!/bin/bash
            echo "hello world"
         '''
    }
}

附加信息:

我的命令比echo hello world更复杂。

5fjcxozz

5fjcxozz1#

您提供的Groovy脚本正在将结果脚本中的第一行格式化为空行。Shebang告诉脚本使用/bin/bash而不是/bin/sh运行,它需要位于文件的第一行,否则将被忽略。
因此,您应该将Groovy设置为如下格式:

stage('Setting the variables values') {
    steps {
         sh '''#!/bin/bash
                 echo "hello world" 
         '''
    }
}

它将使用/bin/bash执行。

nfs0ujit

nfs0ujit2#

根据this document,您应该可以这样做:

node {
    sh "#!/bin/bash \n" + 
       "echo \"Hello from \$SHELL\""
}
gwo2fgha

gwo2fgha3#

对于多行的外壳脚本或那些多次运行的脚本,我会创建一个新的bash脚本文件(从#!/bin/bash开始),然后只需使用Jenkinsfile中的sh运行它:

sh 'chmod +x ./script.sh'
sh './script.sh'
6rvt4ljy

6rvt4ljy4#

我相信以上这些答案都很管用。然而,我很难添加双引号作为我的猛烈抨击行,其中接近100。因此,下面的方法帮助了我。(简而言之,外壳的每一行都没有双引号)
此外,当我在步骤中使用“bash”“#!/bin/bash”时,我得到以下错误java.lang.NoSuchMethodError: No such DSL method '**bash**' found among steps

pipeline {
    agent none

    stages {

        stage ('Hello') {
            agent any

            steps {
                echo 'Hello, '

                sh '''#!/bin/bash

                    echo "Hello from bash"
                    echo "Who I'm $SHELL"
                '''
            }
        }
    }
}

上述执行的结果为

wpcxdonn

wpcxdonn5#

如果要将Jenkins上所有项目的默认外壳更改为bash,可以通过Web门户在Jenkins配置中执行此操作:
管理Jenkins>配置系统(如果您想要跳过此点击,只需转到https://{YOUR_JENKINS_URL}/configure。)
用值/bin/bash填写标记为‘Shell Executable’的字段,然后单击‘保存’。

hmae6n7t

hmae6n7t6#

在我的例子中,我必须通过jenkinsfile在bash中执行一个Shell脚本。以下是对我起作用的方法:
sh 'core_devops/automation/scripts/ecs_initialize.sh'
剧本的第一行写着
#!/bin/bash

u4dcyp6a

u4dcyp6a7#

问题确实是,如果Shebang不是从文件的最开始开始,它就会被忽略。
作为破坏Jenkinsfile阅读器格式的替代方案,我已经开始使用以下内容:

sh label: 'Run fancy bash script',
   script: '''
       #!/usr/bin/env  bash

       echo "Hello ${SHELL}!"
   '''.stripIndent().stripLeading()

请注意,stripIndent()并不是它“工作”所必需的,但Jenkins Logs使用它要好得多。

相关问题