在管道脚本Jenkinsfile中传递参数

时间:2018-08-19 22:49:22

标签: shell jenkins groovy jenkins-pipeline

我在运行管道的git项目的根目录下有一个Jenkinsfile。我还用不同的Groovy文件(smp.gvy)编写了一些函数,我需要将这些参数传递给构建参数并在shell脚本的函数内部访问它们。我正在将我的整个mvn行作为一个arg传递给该函数,但似乎它为空。

在Jenkinsfile中,我有

properties([
  parameters([
    string(name: 'sshusername', defaultValue: 'testuser'),
    string(name: 'sshpassword', defaultValue: 'p@ssw0rd!'),
    string(name: 'featuretags', defaultValue: '@Regression')

  ])
]) 

stage("Regression and Progression Test on ${bddEnv}") {
    commonToolsInfra.notifyBuildMap(
         message:'SMP CD pipeline: functional tests started. ', 
         buildStatus:'IN-PROGRESS', 
         slackChannel:slackChannel, sandboxMode:SANDBOX_MODE)

    node("${FUNCTIONAL_TEST_AGENT}") {
         unstash 'tnd-smp'+"${BUILD_TAG}"
         unstash 'TND-INFRA'+"${BUILD_TAG}"

         dir ('tnd-functional-tests'){
             unstash 'TND-FUNCTIONAL-TESTS'+"${BUILD_TAG}"
         }

         if("${SKIP_FUNCTIONAL}" == 'false')
             smpTools.runSMPFunctionalTests("-Dbrowser=chrome \
                 -Dweb-driver=chromedriverlinux.bin \
                 -Dssh.username=${sshusername} \
                 -Dssh.password=${sshpassword} \
                 -Denv=${bddEnv}  \
                 -Dcucumber.options='--tags ${featuretags}'", "Test Report")
            }// this function is in smp.gvy see below                 
    }
}

在smp.gvy中

def runSMPFunctionalTests (String arguments = "-Denv=Dev1",  String reportLabel) {

dir ('tnd-functional-tests') {
    withMaven(jdk: 'Java 8') {

        try {

            sh '''

            if [ ! "$(docker ps -q -f name=tnd-chrome)" ]; then
                if [ "$(docker ps -aq -f status=exited -f name=tnd-chrome)" ]; then
                    # cleanup
                    echo "Removing exited docker container..."
                    docker rm tnd-chrome
                fi
                    echo "Running the docker container again..."
                    docker run -d -e JAVA_OPTS=-Xms512m -e JAVA_OPTS=-Xmx1024m \
                    -v /dev/shm:/dev/shm -e DBUS_SESSION_BUS_ADDRESS=/dev/null \
                    --name tnd-chrome csa-docker.apro.nbnco.net.au/tnd/tnd-chrome:v1

                    DO_SSH_TUNNEL="true"
            else
                echo "Running docker instance tnd-chrome found...Using it"
            fi
            sudo chmod a+rwx ./src/test/resources/webdriver/*

            echo "Args for maven ${arguments}" //this prints null for arguments
            mvn clean verify ${arguments}

            '''
        } catch(err) {
                if (currentBuild.result == 'UNSTABLE')
                    currentBuild.result = 'FAILURE'
                throw err
        } finally {
                publishHTML (target: [
                allowMissing: true,
                alwaysLinkToLastBuild: false,
                keepAll: true,
                reportDir: 'target/site/serenity',
                reportFiles: 'index.html',
                reportName: "${reportLabel} BUILD ${env.BUILD_NUMBER}"
            ])
        }
    }
}

这里有两个问题,如果我回显从我的jenkinsfile传递到第二个Groovy文件的参数,我将得到null。另外我在密码中有一个@字符,因此在使用它调用git clone之前有必要对其进行转义或替换。

谢谢...

1 个答案:

答案 0 :(得分:1)

'''替换为""",以使Groovy进行字符串替换。

sh """
    if [ ! "\$(docker ps -q -f name=tnd-chrome)" ]; then
        if [ "\$(docker ps -aq -f status=exited -f name=tnd-chrome)" ]; then
            # cleanup
            echo "Removing exited docker container..."
            docker rm tnd-chrome
        fi
            echo "Running the docker container again..."
            docker run -d -e JAVA_OPTS=-Xms512m -e JAVA_OPTS=-Xmx1024m \
            -v /dev/shm:/dev/shm -e DBUS_SESSION_BUS_ADDRESS=/dev/null \
            --name tnd-chrome csa-docker.apro.nbnco.net.au/tnd/tnd-chrome:v1

            DO_SSH_TUNNEL="true"
    else
        echo "Running docker instance tnd-chrome found...Using it"
    fi

    sudo chmod a+rwx ./src/test/resources/webdriver/*

    echo "Args for maven ${arguments}" //this prints null for arguments
    mvn clean verify ${arguments}

"""

然后以前缀$前缀"$(docker ps -q -f name=tnd-chrome)""$(docker ps -aq -f status=exited -f name=tnd-chrome)"的{​​{1}}

\

更多细节可以阅读Groovy String

如果您不能100%确保更改正确,则可以使用此Groovy在线工具:https://groovy-playground.appspot.com/来验证更改是否符合预期。

enter image description here

右侧的字符串是字符串替换后的字符串,并将移交给"\$(docker ps -q -f name=tnd-chrome)" "\$(docker ps -aq -f status=exited -f name=tnd-chrome)" 步骤函数来执行。