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"
}
}
}'
Eu queria um ticket gerado usando o cURL, mas recebendo "erro de análise JSON". Durante a depuração, descobri que o problema está no resumo e na descrição do corpo, usando incorretamente as variáveis DIR_CHANGED
e MODEL_NAME
. Você pode sugerir outras maneiras?
Não conhecendo o conteúdo real de suas variáveis de shell, presumo que pelo menos uma contenha uma nova linha literal, tabulação, aspas duplas ou possivelmente algum outro caractere que precise ser codificado em documentos JSON. Em geral, evite injetar strings de shell em JSON. Use
jq
para criar JSON válido a partir de variáveis de shell. Isso garante que as strings sejam codificadas corretamente.No fragmento de script abaixo, presumo que as cinco variáveis de shell usadas
jq
já foram definidas com os valores pretendidos. O script então cria um documento JSON fornecendo as variáveis do shell parajq
serem inseridas nos locais apropriados no "modelo" fornecido como strings codificadas em JSON. Este resultado é atribuído àpayload
variável shell, que mais tarde é usadacurl
como argumento de opção da--data
opção.Observe que as variáveis, como
$dirs
e$project_key
, usadas najq
expressão, sãojq
variáveis , não variáveis de shell. Eles obtêm seus valores na--arg
opção najq
linha de comando.As expressões entre parênteses que são os valores das chaves
summary
edescription
estão entre parênteses porque são expressões que precisam ser avaliadas para chegar aos seus valores finais.Se você precisar criar
jq
variáveis contendo dados que não sejam strings, por exemplo, se precisar inserir booleanos, números ou fragmentos de documentos JSON, use--argjson
no lugar de--arg
(ou seja,jq ... --argjson components_id "$COMPONENT_ID" ...
se o ID do componente for um número em vez de uma linha).Isso é muito longo para um comentário. (Editar: parece que vou ser rejeitado pela invisibilidade, por favor, dê algumas recomendações para me endireitar então.) (Isso nunca foi feito para gerar votos positivos, por favor, considere isso um comentário e, em vez disso, vote positivamente na resposta lá em cima. )
Primeiras coisas primeiro. Por favor, realce de sintaxe, a menos que o bloco de código seja trivial (curto, sem muitas citações, etc.). Consulte: O que é realce de sintaxe e como funciona? . Eu escrevi
```shell
, em vez```
de iniciar o bloco de código abaixo. Está tudo verde devido às variáveis serem verdes também, isso não ajuda muito.Atualizei as primeiras expansões variáveis para consistência.
Parece bom, para começar não foi um problema de expansão.
Se você quiser ter certeza, execute um
echo
bloco de dados entre aspas. Melhor ainda, canalize parajq
, isso deve fornecer uma bela saída JSON.Talvez seja melhor mergulhar no Jira Rest Api Exaples ou perguntar no StackOverflow, já que o problema não é BASH nem Linux. Verifiquei suas bandeiras, elas correspondem ao que está no site da Atlassian, embora com seus formatos longos.
Termo aditivo:
Eu avaliei minha versão estritamente citada do comando, então @Kusalananda está certo ao afirmar que pode haver um erro de citação devido a espaços em branco ou caracteres especiais.
No entanto, esta mensagem de erro é a resposta do servidor Atlassian, curl funcionou corretamente. Melhor usar a versão citada.
Além disso, um tópico da Comunidade Atlassian sugere que poderia estar@
no nome de usuário .Mais um Adendo
curl sempre funcionaria de qualquer maneira, desde que as credenciais e os recursos da API estivessem corretos. Deve ter sido uma nova linha ou similar que pré-encerrou o bloco de dados. Daí o erro no título. @Kusalananda estava certo.