【问题标题】:Run bash command on jenkins pipeline在詹金斯管道上运行 bash 命令
【发布时间】:2017-06-02 13:27:59
【问题描述】:

在 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 更复杂。

【问题讨论】:

  • 您的问题是什么?请清楚地表述您的问题,并提供您面临的问题的详细信息。
  • 我认为我们有同样的问题。即使使用第二个示例,它仍然使用 sh 而不是 bash 执行。这是你看到的吗?
  • 是的! A 创建一个解决方案,在我的 git 存储库中添加一个 .bash 文件,所以我与 Jenkins 在我的项目内的特定路径上运行它。
  • 请在 * 帖子中查看我的回答:*.com/a/57381691/10398126
  • 在这里查看我对类似问题的回答:*.com/a/57381691/10398126

标签: linux bash shell jenkins groovy


【解决方案1】:

您提供的 Groovy 脚本将生成脚本中的第一行格式化为空行。告诉脚本使用 /bin/bash 而不是 /bin/sh 运行的 shebang 需要位于文件的第一行,否则将被忽略。

因此,您应该像这样格式化 Groovy:

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

它将使用 /bin/bash 执行。

【讨论】:

  • 你测试了吗?我使用一种设置为在我的 git 存储库中运行文件的方式制作,这样我确信代码将作为 bash 代码执行,而不是 shell 代码。
  • 是的,它成功地为我工作。我有一个使用 bash 特定语法的脚本,在我格式化它之前它一直失败,所以第一行不是空白的。
  • 并非所有 Jenkins 版本都支持bash 步骤。不过sh '''#!/bin/bash ... 也应该可以工作。
  • java.lang.NoSuchMethodError: No such DSL method 'bash' found among steps
  • 对于多行脚本或多次运行的脚本,我会创建一个新的 bash 脚本文件(从 #!/bin/bash 开始),然后简单地运行它: chmod +x './ script.sh' && sh './script.sh'
【解决方案2】:

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

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

【讨论】:

  • 标识为“+” WorkflowScript 返回错误:9:美元符号后的字符串主体字符非法;解决方案:要么转义文字美元符号 "\$5",要么将值表达式 "${5}" @ line 9, column 68. 2c-437a-b8a2-db013fe42f62\"" + 括起来
  • 能否请您发布脚本?从您粘贴的内容来看,+ 之前似乎有两个引号,这是错误的。
  • 谢谢@Jacob 我遇到了同样的问题,您的评论帮助我解决了这些问题!
  • 不要用“\n”和“+”,只用三引号做多行字符串。
【解决方案3】:

对于多行 shell 脚本或多次运行的脚本,我将创建一个新的 bash 脚本文件(从 #!/bin/bash 开始),然后使用 Jenkinsfile 中的 sh 简单地运行它:

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

【讨论】:

    【解决方案4】:

    我确信上述答案完美无缺。但是,我很难将双引号添加为接近 100 的 bash 行。因此,以下方式对我有所帮助。 (简而言之,shell的每一行都没有双引号)

    此外,当我在步骤中使用“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"
                    '''
                }
            }
        }
    }
    

    上面执行的结果是

    【讨论】:

      【解决方案5】:

      如果您想将 Jenkins 上的所有项目的默认 shell 更改为 bash,您可以通过门户网站在 Jenkins 配置中执行此操作:

      管理 Jenkins > 配置系统(如果需要,只需转到 https://{YOUR_JENKINS_URL}/configure 即可跳过此点击。)

      用值/bin/bash 填写标记为“Shell 可执行文件”的字段,然后单击“保存”。

      【讨论】:

        最近更新 更多