我試圖實作jq管道curl命令,從https://docs.gitlab.com/ee/api/lint.html#use-jq-to-create-and-process-yaml--json-payloads但在make檔案的背景關系中。
我已經花了好幾個小時,嘗試了似乎所有的轉義和嘗試替代命令,但我無法讓等價物發揮作用。我在makefile之外沒有問題。
我試著用"$(<foo.yml)"替代"$(<foo.yml)"或$(shell cat foo.yml),甚至cat foo.yml | ... @-但沒有運氣。shell cat是我得到的最接近的方法,但是cat洗掉了
字符,這使得我傳遞給GitLab的JSON結果出現了混亂的錯誤。
{"valid":false, "errors":["(u003cunknownu003e): block sequence entries are not allowed in this context at line 1 column 12"], "warning":[], "status": "invalid"}
我將該字串與Makefile背景關系之外的作業原始版本進行了比較,唯一不同的是缺乏 字符。
請幫助我們! 謝謝你。
編輯 按照要求,這里有來自 URL 的額外細節。
這是命令。
這是我試圖移動到Makefile背景關系中的命令。這條命令在我的bash終端中可以正常作業。
jq --null-input --arg yaml "$(< . gitlab-ci.yml)" '.content=$yaml'| curl "https://gitlab. com/api/v4/ci/lint?" --header "Content-Type: application/json" --header "PRIVATE-TOKEN: $GITLAB_PERSONAL_ACCESS_TOKEN"-data @-
這里是回應。
{"valid":true, "errors":[], "warning":[], "status": "valid"}
下面是我的Makefile版本:
.PHONY: lint
make lint:
jq --null-input ' 。 content="$(shell cat "$(GITLAB_CI_FILE_PATH)")"' | curl --header "Content-Type: application/json" --header "PRIVATE-TOKEN: $(GITLAB_PERSONAL_ACCESS_TOKEN)"/span> --data @- "https://gitlab. com/api/v4/ci/lint"。
這里是回應。
{"valid":false, "errors":["(u003cunknownu003e): block sequence entries are not allowed in this context at line 1 column 12"], "warning":[], "status": "invalid"}
我知道,這是因為我的makefile版本不包含換行字符。
這是輸入的YAML檔案:
include:/span>
- 專案: adamcunnington.info/MLG/common
檔案: cicd/.gitlab-ci-python.yml
uj5u.com熱心網友回復:
如果你能提供你想寫的完整規則,將非常有幫助。
使用$(<foo.yml)不能在make配方中作業,因為make將所有以$開頭的內容都視為make變數,并在運行shell前將其展開。 你需要將所有你想讓shell看到的$轉義為$。
使用$$(<foo.yml)在某些系統上可以作業,但在其他系統上不行:這種語法沒有被POSIX標準定義,所以提供POSIX功能的shell不會對它做任何事情。 這就是bash shell的增強語法。 Make總是默認運行/bin/sh,所以如果你的/bin/sh真的是bash,它可能會作業。 如果不是,就不行。
使用$(shell cat foo.yml)不能作業,因為make的shell函式在替換輸出之前會洗掉所有的換行。
由于我們不能看到你的實際規則,我們不能真正建議最好的替代方案。 你是否有什么理由不使用簡單的、標準的:
jq < foo.yml
?
ETA
正如所解釋的,你的shell是bash。 Make總是默認使用/bin/sh作為shell(想象一下,如果make總是使用呼叫它的人所使用的任何shell,那么移植性就會出現問題)。
如果你不知道如何重寫你的makefile配方以使用標準的POSIX語法,而你想使用bash特定的語法,你可以告訴make使用bash作為它的shell:
SHELL := /bin/bash
現在所有針對bash的魔法將在你的食譜中發揮作用。 當然,你的makefile在沒有/bin/bash的系統上將無法作業。
uj5u.com熱心網友回復:
對于jq部分,一個更簡單、更可移植的重新表述將是
jq --null-input --rawfile yaml .gitlab-ci.yml ' .content=$yaml'
在一個Makefile里面,顯然要把美元符號加倍。
一個小的區別是,在---rawfile中,檔案中的最后一個換行也被包括在內。
--rawfile選項是在jq1.6.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/308006.html
標籤:
