shell 包含kubectl命令和awk $1的Bash脚本在Gitlab管道中无法运行[已关闭]

bhmjp9jg  于 2022-12-19  发布在  Shell
关注(0)|答案(1)|浏览(179)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

2天前关闭。
这篇文章是编辑和提交审查2天前。
Improve this question
在gitlab-ci.yml文件中,我有一个bash脚本。该脚本调用一个带有输入参数1-16-0的函数changeNSLabel。然后changeNSLabel函数将有一个for循环,该循环在命名空间上迭代。此kubectl命令应该只生成istio注入的命名空间的名称,如下所示

kubectl get namespace -Listio.io/rev | awk 'NF==4' | awk -F" {2,}" '{print $1}' | tail -n +2)
--------------
Namespace-A
Namespace-B
Namespace-C

但问题是,我在for循环中使用awk时使用的$1像这样空了,最终打印了所有列

kubectl get namespace -Listio.io/rev | awk 'NF==4' | awk -F" {2,}" '{print }' | tail -n +2
-------------------
Namespace-A        Active   6d14h   1-15-3
Namespace-B        Active   6h22m   1-15-3
Namespace-C        Active   6d14h   1-15-3

如果我在本地运行相同的脚本,它可以正常工作。

function test(){
  changeNSLabel "1-16-0"
}
    
function changeNSLabel(){
  local revision=$1
  echo "#####Fetch all the namespaces with istio-injected enabled #####"
        
  for ns in $(kubectl get ns -Listio.io/rev | awk 'NF==4' | awk -F" {2,}" '{print $1}' | tail -n +2); 
  do 
    kubectl label namespace ${ns} istio-injection- istio.io/rev=$revision --overwrite
  done
}

这个问题我只在我通过gitlab pipeline运行我的脚本时遇到。但是如果我运行相同的脚本

vuv7lop3

vuv7lop31#

这并不是您所要求的,但一个更有成效的解决方案可能是利用kubectl输出JSON的能力,并使用JSONPath来操作它。

SELECTOR="istio.io/rev"
kubectl get namespaces \
--selector=${SELECTOR} \
--output=jsonpath="{range .items[*]}{.metadata.name}{'\n'}{end}"

或者,结果以空格分隔:

SELECTOR="istio.io/rev"
kubectl get namespaces \
--selector=${SELECTOR} \
--output=jsonpath="{.items[*].metadata.name}"

或者,使用--output=name并去掉前缀namespace/

SELECTOR="istio.io/rev"
kubectl get namespaces --selector=${SELECTOR} \
--output=name \
| sed --expression="s|namespace/||g"

或者,如果您更喜欢使用jq这样的独立JSON处理器:

SELECTOR="istio.io/rev"
kubectl get namespaces \
--selector=${SELECTOR} \
--output=json \
| jq -r .items[].metadata.name

awk很棒,但是,利用这样一个事实会更容易,即您(可以)将结构化数据(JSON)作为起点,而不是试图从文本中重新创建结构。

相关问题