首页 > 解决方案 > 无法在詹金斯管道阶段使用 for 循环从列表中读取项目

问题描述

运行一个 linux 命令并将命令的输出保存为列表,然后将列表项一一变红。

stage('NAMESPACE Availability') {
            node ('master'){
                  withEnv(["KUBECONFIG=${JENKINS_HOME}/.kube/config"]){
                  NS_list = sh (
                  script: '''kubectl get ns | awk '{print \$1}' | awk '{\$1=\$1; print "[\\x27" $0 "\\x27]"}' FS='\n' OFS="','" RS='' ''',
                  returnStdout: true
                  ).trim()
                  echo "${NS_list}"
                  NS(NS_list)
             }

      }
}
  def NS(list) {
     for (i in list) {
        echo "${i}"
        if ( i == "${NAME_SPACE}" ) {
            sh "kubectl delete all --all -n '${NAME_SPACE}' && kubectl delete '${NAME_SPACE}' "
        break;
    }
  }
}

与其将其读取为 Item ,不如将其读取为 character ,假设命令输出为 ['NAME','b2','b6','b7','cert-manager','default'] ,其读数如下所示。

[Pipeline] echo
[
[Pipeline] echo
'
[Pipeline] echo
N
[Pipeline] echo
A
[Pipeline] echo
M
[Pipeline] echo
E
[Pipeline] echo

[Pipeline] echo
'
[Pipeline] echo
,
[Pipeline] echo
'

标签: jenkinskubernetesgroovyjenkins-pipeline

解决方案


我按照以下更改解决了我的问题。而不是使用 for(loop).. 我使用了“.contains”

stage('NAMESPACE Availability') {
            node ('master'){
                  withEnv(["KUBECONFIG=${JENKINS_HOME}/.kube/config"]){
                  NS_list = sh (
                  script: '''kubectl get ns | awk '{print \$1}' ''',
                  returnStdout: true
                  ).trim()
                  def lst = "${NS_list}";
                      NS = (lst.contains( "${NAME_SPACE}" ));
                      echo "${NS}"
                      if ( NS == true ) {
                         sh "kubectl delete all --all -n ${NAME_SPACE} "
                      }
                      else {
                         sh "kubectl create ns ${NAME_SPACE}"
                      }

        }

推荐阅读