首页 > 其他分享 >groovy脚本sh执行注意单双引号问题

groovy脚本sh执行注意单双引号问题

时间:2023-07-14 13:44:20浏览次数:29  
标签:groovy 双引号 appname SONAR sh params result sonar

正常groovy脚本

#!/usr/bin/env groovy

    pipeline {
    //确认使用主机/节点机
    agent  { 
        node { label 'master'} 
    }
    options {
        parallelsAlwaysFailFast()
    }
    //  声明参数 
    parameters{
        //  传包名称
        string(name:'appname', defaultValue: 'search-ng', description: '名称')
        // IP
        string(name:'ip', defaultValue: '10.60.175.63', description: 'IP')
        //git代码路径
        string(name:'repoUrl', defaultValue: 'http://10.70.14.156/issts/search-ng.git', description: 'git代码路径')
        // 编译打包
        string(name:'build', defaultValue: 'mvn -f pom.xml clean package -U -Dmaven.test.skip=true -Dexec.skip=true -P test', description: '编译打包命令')
        // tomcat目录
        string(name:'tomcatHome', defaultValue: '/apps/admin/taobao-tomcat-production-7.0.59.3', description: 'tomcat家目录')
        // 指定分支
        string(name:'branch', defaultValue: 'test', description: 'git分支')
        // 用户
        string(name:'user', defaultValue: 'tomcat', description: 'server用户')
        // classfiles
        string(name:'classfiles', defaultValue: 'target/classes', description: '类文件')
        // sourcefiles
        string(name:'sourcefiles', defaultValue: 'src/main/java', description: '源文件')
    }

    environment{
        // git凭证
        CRED_ID='view'
        // maven 路径
        MAVEN_DIR='/opt/apache-maven-3.8.6/bin'
        // sonar server地址
        SONAR_IP='SONAR_IP'
        // sonar-scanner
        SONAR_SCANNER='/opt/sonar-scanner/bin'
        // sonar数据
        SONAR_DATA='/var/jenkins_home/sonarData' 
        //java libraries
        LIB_HOME='/root/.m2/repository/**/*.jar'
        
    }

    stages {
        // 拉取代码
        stage('Checkout') {
            steps {
                script {
                //从git拉取代码
                def scmVars = checkout([
                    $class: 'GitSCM',
                    branches: [
                      [
                        name: "${params.branch}"
                      ]
                    ],
                    doGenerateSubmoduleConfigurations: false,
                    extensions: [
                      [
                        $class: 'SubmoduleOption',
                        disableSubmodules: false,
                        parentCredentials: true,
                        recursiveSubmodules: true,
                        reference: '',
                        trackingSubmodules: false
                      ]
                    ],
                    submoduleCfg: [],
                    userRemoteConfigs: [
                      [
                        credentialsId: CRED_ID,
                        url: "${params.repoUrl}"
                      ]
                    ]
                  ]
                )
                 gitversion = scmVars.GIT_COMMIT
                }
                 sh "echo ${gitversion}"
            }
        }

        // 编译
        stage('build') {
            steps{
                // maven构建
                sh "${MAVEN_DIR}/${params.build}"
            }
        }


        //  添加sonar配置
        stage('restart') {
            steps{ 
                echo '添加sonar配置'
               // sh "ssh ${params.user}@${params.ip} 'echo JAVA_OPTS="$JAVA_OPTS -javaagent:${JACOCO_HOME}/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8893,address=$(params.ip)" >> ${params.tomcatHome}/bin/catalina.sh'" 
                echo 'sonar配置完成'

            }
        }

        //  生成sonar报告
        stage('sonar') {
            steps{
                // 判断是否删除result
                script {
                    if (params.is_delete_result == 'yes') {
                        echo '删除result'
                        sh 'rm -rf ${SONAR_DATA}/${params.appname}/result.exec'
                        sh 'rm -rf ${SONAR_DATA}/${params.appname}/result.xml"'
                    } else {
                        echo '不删除result'
                    }
                }
                echo '生成sonar报告'
                sh "mkdir ${SONAR_DATA}/${params.appname} -p"
                sh "java -jar /opt/jacococli.jar dump --address ${params.ip} --port 8893 --destfile ${SONAR_DATA}/${params.appname}/result.exec"
                sh "java -jar /opt/jacococli.jar report ${SONAR_DATA}/${params.appname}/result.exec --classfiles ${params.classfiles} --sourcefiles ${params.sourcefiles} --xml ${SONAR_DATA}/${params.appname}/result.xml"
                sh "${SONAR_SCANNER}/sonar-scanner -D'sonar.branch.name=test' -D'sonar.java.source=1.8' -D'sonar.coverage.jacoco.xmlReportPaths=${SONAR_DATA}/${params.appname}/result.xml' -D'sonar.projectKey=${params.appname}' -D'sonar.sources=${params.sourcefiles}'  -D'sonar.java.binaries=${params.classfiles}'  -D'sonar.scm.provider=git' -D'maven.test.skip=true' -D'sonar.java.libraries=${LIB_HOME}'"

            }
        }


    }
}

正常groovy流水线脚本,看上去没啥问题,却偏偏报错了:

[Pipeline] sh
/var/jenkins_home/workspace/stg-search-ng@tmp/durable-0aa4ef96/script.sh: line 1: ${SONAR_DATA}/${params.appname}/result.exec: bad substitution

 

很容易看出${SONAR_DATA}/${params.appname}/result.exec这个变量没有识别到

排查一圈下来,原来是单双引号的问题改成下面就好了

// ... 省略了一些代码 ...

stage('sonar') {
    steps{
        // 判断是否删除result
        script {
            if (params.is_delete_result == 'yes') {
                echo '删除result'
                sh "rm -rf ${SONAR_DATA}/${params.appname}/result.exec"
                sh "rm -rf ${SONAR_DATA}/${params.appname}/result.xml"
            } else {
                echo '不删除result'
            }
        }
        echo '生成sonar报告'
        sh "mkdir ${SONAR_DATA}/${params.appname} -p"
        sh "java -jar /opt/jacococli.jar dump --address ${params.ip} --port 8893 --destfile ${SONAR_DATA}/${params.appname}/result.exec"
        sh "java -jar /opt/jacococli.jar report ${SONAR_DATA}/${params.appname}/result.exec --classfiles ${params.classfiles} --sourcefiles ${params.sourcefiles} --xml ${SONAR_DATA}/${params.appname}/result.xml"
        sh "${SONAR_SCANNER}/sonar-scanner -D'sonar.branch.name=test' -D'sonar.java.source=1.8' -D'sonar.coverage.jacoco.xmlReportPaths=${SONAR_DATA}/${params.appname}/result.xml' -D'sonar.projectKey=${params.appname}' -D'sonar.sources=${params.sourcefiles}'  -D'sonar.java.binaries=${params.classfiles}'  -D'sonar.scm.provider=git' -D'maven.test.skip=true' -D'sonar.java.libraries=${LIB_HOME}'"
    }
}

注意sh执行脚本要用双引号

 

标签:groovy,双引号,appname,SONAR,sh,params,result,sonar
From: https://www.cnblogs.com/soymilk2019/p/17553476.html

相关文章

  • finalshell工具连接centos 8.5 的使用步骤
    1.打开工具先修改快捷方式    2、连接     3、......
  • pip show 显示模块插件包安装路径、信息
    显示某个模块(包、插件)安装路径、版本信息pipshowFlask或pip3showFlask效果:参考:https://www.zhihu.com/question/603263580?utm_id=0......
  • java的short类型怎么赋值
    在Java中,short类型是一种整数数据类型,占用16位(2个字节)的内存空间。short类型的取值范围为-32768到32767。要给short类型变量赋值,可以通过以下几种方式:直接赋值shortnum=10;在这个例子中,变量num被赋值为10,这是一种直接赋值的方式。由于10是一个常量,它被认为是int类型的,但......
  • 使用HttpUtil时报javax.net.ssl.SSLHandshakeException: No appropriate protocol异常
    在使用HttpUtil类时,针对某一个接口报错出现异常HttpGetInforesult=HttpUtil.getInfo(token,Url);但是这个getInfoUrl在postman上调用是成功的后来查找后发现问题是:在Java8及高版本以上的版本在调用ssl时会出现javax.net.ssl.SSLHandshakeException:Noappropriateprotoc......
  • shardingJDBC分表
    spring:shardingsphere:datasource:names:ds-0ds-0:connectionTimeout:500000#连接超时时间type:com.zaxxer.hikari.HikariDataSourcejdbcUrl:username:password:driver-class-name:com.mys......
  • 树莓派3b安装ubuntu16.04,配置ssh和vnc(windows)
    1.系统安装  首先下载想要使用的系统版本,笔者选择的是32位Ubuntu16.04  下载RaspberryPi OS  首先格式化TF卡  然后加载镜像:“使用自定义镜像”,选择下载的16.04镜像  选择SD卡,然后在右下角设置中开启SSH(虽然最后也没用好像),最后点击烧录。烧录完成后进入boot......
  • 2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串
    2023-07-13:如果你熟悉Shell编程,那么一定了解过花括号展开,它可以用来生成任意字符串。花括号展开的表达式可以看作一个由花括号、逗号和小写英文字母组成的字符串定义下面几条语法规则:如果只给出单一的元素x,那么表达式表示的字符串就只有"x"。R(x)={x}例如,表达式"a"......
  • 如何解析Shp文件以及GISShp在线转换设计工具
    如何解析Shp文件简介(什么是shp)SHP代表Shapefile,是一种地理信息系统(GIS)常用的文件格式。Shapefile是Esri(环境系统研究所)公司定义的一种存储空间矢量数据的格式,用于在GIS软件中存储、分析和共享地理数据。一个Shapefile由多个文件组成,通常以相同的文件名但不同的扩展名来命名。它包含......
  • 浅谈OS命令注入漏洞(Shell注入漏洞)
    一、什么是OS命令注入?1.基本概念OS(Operatingsystem)命令注入(也称为Shell注入)是一个Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,这会破坏应用程序及其所有数据。2.Shell的概念:Shell翻译过来就是”壳”,操作系统的外壳。Shell接收......
  • 在 Oracle Linux 上安装 Shared Folders
    在OracleLinux上安装SharedFolders对于OracleDatabase11g,ZIP安装文件总共有2GB多。由于需要从每个来宾VM访问它们以安装数据库,我决定利用OracleVMVirtualBox的SharedFolders。SharedFolders特性允许来宾VM访问主机文件系统中的存储......