簡體   English   中英

包含帶有 awk $1 的 kubectl 命令的 Bash 腳本在 Gitlab 管道中不起作用

[英]Bash script containing kubectl commands with awk $1 is not working in Gitlab pipeline

在 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

如果我在本地運行相同的腳本,它工作正常。 這是我在 gitlab-ci.yml 中調用的test.sh腳本

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 管道運行我的腳本時,我才會面臨這個問題。 但是如果我運行相同的腳本

這不完全是您所要求的,但更有成效的解決方案可能是利用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) 作為起點這一事實比嘗試從文本重新創建結構更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM