【问题标题】:Jenkins pass paramater as an env to the shell script for passing sh to kubernetes podJenkins 将参数作为 env 传递给 shell 脚本,用于将 sh 传递给 kubernetes pod
【发布时间】:2021-01-11 17:56:03
【问题描述】:

我们有一个 dockerized maven 项目,我们通过 Jenkins 和 Helm 将它部署到 kubernetes。所以我想做的事情是,将下面的 shell 脚本作为命令传递到 deployment.yaml 中,如下所示以启动 selenium 测试pod 正在创建时。但不知何故,在我部署服务之前,我需要根据条件语句(jenkins 参数)更新 shell 脚本中的变量,然后将更新 shell 脚本传递给 kubernetes pod。

那么,有没有办法根据 jenkins 参数添加 if 语句和更新变量,并以适当的值传递给 pod?

Shell 脚本

#!/bin/sh
    
mvn --projects {$projectName} --also-make clean test -Dcucumber.filter.tags="@${servicename} or @${tag}" -Denvironment=test -Ddhc=true -Djavax.net.ssl.trustStore=/usr/java/openjdk-14/lib/security/cacerts

Deployment.yaml


  env:
    {{- range $key, $value := .Values.extraEnv }}
    - name: {{ $key }}
      value: {{ $value | quote }}
    {{- end }}
  command: ["/test-script.sh"]

Jenkinsfile


parameters {    
    string(name: 'projectName', defaultValue: "Xx", description: 'Which project do you want to test?')
    string(name: "service_name", defaultValue: 'Yy', description: 'Selenium tag for service name')
    string(name: "tag", defaultValue: 'must')
    //string(name:'branchName', defaultValue: "origin/development", description: 'Environment for selenium tests')}

    stage('Deploy to dev'){
        steps{
            script{
                   sh """ 
                       helm upgrade --install --debugtest-service --values values.${ENV}.yaml --namespace ${namespace} --set image.tag=${env.BUILD_NUMBER} .
                     """
                }
            }

EDIT-1

我刚刚根据以下答案添加了我的问题。那么在运行 sed 并更新脚本后,如何添加 if 语句来检查服务名称参数的值?或者我可以使用类似的东西

if [ <PROJECTNAME> == "xx]

这是我想做的步骤。

    projectName=$1
    serviceName=$2
    tag=$3
    
    if [ "$serviceName" == "xx" ]
    then
        echo "Tests are running "..
        mvn --projects <PROJECTNAME> --also-make clean test -Dcucumber.filter.tags=""@<SERVICENAME> or @<TAG>"" 
    else 
    echo 'All test scenarios are running on stage environment'
    mvn --projects <PROJECTNAME> --also-make clean test -Dcucumber.filter.tags="@<SERVICENAME> or @<SERVICENAME>" -
    fi

【问题讨论】:

    标签: shell jenkins kubernetes jenkins-pipeline sh


    【解决方案1】:

    您可以为这些需要在构建时动态更新的值保留占位符。 我会使用占位符而不是变量来保留下面的 shell 脚本:

    #!/bin/sh
    mvn --projects <PROJECTNAME> --also-make clean test -Dcucumber.filter.tags="@<SERVICENAME> or @<TAG>" -Denvironment=test -Ddhc=true -Djavax.net.ssl.trustStore=/usr/java/openjdk-14/lib/security/cacerts
    

    然后在helm upgrade ... 命令上方的sh block 中添加sed 行,以将占位符替换为构建时间值,以便将其传递给下一组操作。

    sh """
    sed -i \"s/<PROJECTNAME>/${projectName}/g; s/<SERVICENAME>/${service_name}/g; s/<TAG>/${tag}/g\" /path/to/test-script.sh
    helm upgrade . . . 
    """
    

    EDIT-1:

    Example: 
    if (serviceName == 'xx') {
        env.TAG = serviceName
    } 
    sh """
    .... other actions
    """
    

    【讨论】:

    • 感谢您的有用回复。是否可以为占位符添加 if 语句?如何通过比较詹金斯参数值使用占位符添加 if 条件?
    • @semural,这应该不具有挑战性。您可以在 shell 脚本中使用条件值,甚至可以使用基本的 groovy 语法在 sh 块上方设置条件值。
    • 再次感谢我只是想知道我是否可以使用 if 语句作为占位符
    • 对不起。我不确定我是否理解。你能更好地解释你的场景吗?可能举个例子。请将场景添加为 EDIT-1 与您现有的问题。
    • 我认为在巡视编辑案例中不需要 servicename 作为构建参数。但是,默认情况下将 serviceName 变量设置为所有测试场景,并在 groovy 语法中设置 if 条件检查服务名称是否为 this,然后将标记值设置为与服务名称相同。通过这种方式,您可以拥有相同的脚本并根据常规条件应用更改。
    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多