curl --request POST \
--url 'https://bankofloyal.atlassian.net/rest/api/2/issue' \
--user [email protected]:$JIRA_TOKEN \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"fields": {
"project": {
"key": "'$JIRA_PROJECT'"
},
"parent": {
"key": "'$PARENT_ISSUE_KEY'"
},
"components": [
{
"id": "'$COMPONENT_ID'"
}
],
"summary": "Directories with migration changes: '"${DIR_JOINED}"'",
"description": "Name of models: '"${MODEL_NAMES}"'",
"issuetype": {
"name": "Sub-task"
}
}
}'
cURLを使用して生成されたチケットを取得しようとすると、「JSON解析エラー」が発生します。デバッグ中に、bodyの概要と説明で変数DIR_CHANGED
と誤った使用が問題であることがわかりましたMODEL_NAME
。他の方法を提案してもらえますか?
ベストアンサー1
シェル変数の実際の内容がわからないため、少なくとも1つに改行、タブ、二重引用符、またはJSON文書でエンコードする必要がある他の文字が含まれているとします。通常、JSONにシェル文字列を挿入しないでください。jq
シェル変数で有効なJSONを作成するために使用されます。これにより、文字列が正しくエンコードされます。
以下のスクリプトスニペットでは、使用されている5つのシェル変数がjq
予想値に設定されていると想定しています。その後、スクリプトは、jq
提供された「テンプレート」の適切な場所にJSONエンコード文字列として挿入されるシェル変数を提供してJSON文書を生成します。結果は、後でオプションのオプションパラメータpayload
として使用されるシェル変数に割り当てられます。curl
--data
payload=$(
jq -n -c \
--arg project_key "$JIRA_PROJECT" \
--arg parent_key "$PARENT_ISSUE_KEY" \
--arg components_id "$COMPONENT_ID" \
--arg dirs "$DIR_JOINED" \
--arg models "$MODEL_NAMES" '
{
fields: {
project: { key: $project_key },
parent: { key: $parent_key },
components: [{ id: $components_id }],
summary: ("Directories with migration changes: " + $dirs),
description: ("Name of models: " + $models),
issuetype: { name: "Sub-task" }
}
}'
)
curl --request POST \
--user "[email protected]:$JIRA_TOKEN" \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data "$payload" \
'https://bankofloyal.atlassian.net/rest/api/2/issue'
$dirs
andなどの式で使用される変数に注意してください。$project_key
jq
jq
変数です、シェル変数ではありません。コマンドライン--arg
のオプションから値を取得しますjq
。
summary
合計キーの値である括弧式は、description
最終値を取得するために評価する必要がある式なので、括弧で囲みます。
文字列以外のデータを含む変数を作成する必要がある場合jq
(たとえば、ブール値、数値、またはJSON文書の断片を挿入する必要がある場合)、代わりに--argjson
inを使用してください--arg
(つまり、jq ... --argjson components_id "$COMPONENT_ID" ...
コンポーネントのIDが数値である必要がある場合)。文字列ではなく)。