[英]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.