首页 > 解决方案 > 如何将 shell 脚本回显到 Jenkinsfile 等 groovy 界面中的文件

问题描述

我有下面的 shell 脚本,我需要回显到文件让我们说 script.sh 从像 Jenkinsfile 这样的 groovy 界面,但不断收到编译错误。

#!/bin/bash
commit_hash=$(git rev-parse HEAD)
parent_hashes=`git rev-list --parents -n 1 $commit_hash`
parent_count=`wc -w <<< $parent_hashes`
if [[ $parent_count -gt 2 ]]
then
  p=`git name-rev $parent_hashes | xargs -0 | grep -e '^\S\+ master$'`
  if [[ ! -z $p ]]
  then
    echo "merged branch is master"
    exit 0
  else
    echo "merged branch is anything but master"
    exit 2
  fi
else
  echo "no branch merged"
  exit 1
fi

我尝试了以下方法:-

sh '''echo '#!/bin/bash
               commit_hash=$(git rev-parse HEAD)
               parent_hashes=`git rev-list --parents -n 1 $commit_hash`
               parent_count=`wc -w <<< $parent_hashes`
               if [[ $parent_count -gt 2 ]]
                 then
               p=`git name-rev $parent_hashes | xargs -0 | grep -e '^\S\+ master$'`
               if [[ ! -z $p ]]
                  then
               echo "merged branch is master"
               exit 0
               else
              echo "merged branch is anything but master"
               exit 2
                fi
               else
              echo "no branch merged"
               exit 1
                fi' > script.sh'''
我看到 shell 脚本在一行中有单引号加上几个反斜杠,所以不知道为什么 groovy 不允许在这里进行正常的 shell 插值。如何使用 groovy 将此 shell 脚本的内容回显到文件中。我正在脚本化的 Jenkinsfile 中尝试这个。

标签: shelljenkinsgroovyjenkins-pipeline

解决方案


您可以尝试使用 writeFile 选项将内容写入文件,但在您的情况下,您必须在脚本中单独转义反斜杠。下面应该工作。

pipeline {
    agent any
    stages {
        stage ("Test") {
            steps{
                writeFile file:'test.txt', text: '''#!/bin/bash
commit_hash=$(git rev-parse HEAD)
parent_hashes=`git rev-list --parents -n 1 $commit_hash`
parent_count=`wc -w <<< $parent_hashes`
if [[ $parent_count -gt 2 ]]
then
  p=`git name-rev $parent_hashes | xargs -0 | grep -e '^\\S\\+ master$'`
  if [[ ! -z $p ]]
  then
    echo "merged branch is master"
    exit 0
  else
    echo "merged branch is anything but master"
    exit 2
  fi
else
  echo "no branch merged"
  exit 1
fi'''
            }
        }
    }
}

推荐阅读