Bash - проблемы разбора JSON Github Api - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужно прочитать файл, который мы используем в качестве журнала изменений в нашем проекте с открытым исходным кодом (Argentum Online http://www.argentumonline.org) и использовать некоторый текст оттуда, чтобы использовать его в описании релиза в github. .

У меня есть следующий скрипт, в основном нам нужно обратить внимание на filename, где мы читаем файл, а затем я сохраняю значения в массиве:

# Build
# Publish on github
echo "<<< Publishing on AO-LIBRE Server Release  >>>"
token="1234ASD"

# Get the last tag name
tag=$(git describe --tags)

# PAY ATTENTION HERE!!!!!
filename="C:\ao-server-release-without-rubbish-files-temp\Changelog-server.txt"

readarray -t lines <<< $(sed -n "/^- "$tag".*/,/^---.*/p" "$filename")

description=""
for line in "${lines[@]}"; do
     description=$(echo "$description" "$line")
done 
# PAY ATTENTION HERE!!!!!



# Get the title and the description as separated variables
name=$tag
description=$(echo "$description" | sed -z 's/\n/\\n/g') # Escape line breaks to prevent json parsing problems

# Create a release
release=$(curl -XPOST -H "Authorization:token $token" --data "{\"tag_name\": \"$tag\", \"target_commitish\": \"master\", \"name\": \"$name\", \"body\": \"$description\", \"draft\": false, \"prerelease\": false}" https://api.github.com/repos/ao-libre/ao-server/releases)

# Extract the id of the release from the creation response
id=$(echo "$release" | sed -n -e 's/"id":\ \([0-9]\+\),/\1/p' | head -n 1 | sed 's/[[:blank:]]//g')

# Upload the artifact
curl -XPOST -H "Authorization:token $token" -H "Content-Type:application/octet-stream" --data-binary @artifact.zip https://uploads.github.com/repos/ao-libre/ao-server/releases/$id/assets?name=$tag.zip

Changelog-server .txt:

-v0.13.29
* 02/04/2020: Subida de texto mas suave, sin depender de los fps. (FrankoH298)
* 02/04/2020: Arreglado reconectar al logear, y setAlpha() en drawText. (FrankoH298)
* 03/04/2020: Si no se puede descargar la lista de servers de github por que tira error 500, no hacemos nada con sinfo.dat. (Recox)
* 04/04/2020: Fix Al abrir un cartel / lapida el juego se cuelga (Wyr0x)
* 04/04/2020: Centrar texto carteles / lapidas (Wyr0x)
* 04/04/2020: Fix minimapa indicador + mostrar en barra de tareas (Wyr0x)
* 04/04/2020: Fix bug HandleHeadingChange pedia 18 bytes: podia causar NPCs y personajes no se giren bien (Wyr0x)
* 04/04/2020: Ahora anda bien la distancia con los wavs (FrankoH298)
* 04/04/2020: no mas mensajes en blanco en la consola (FrankoH298)
* 04/04/2020: fixed lblEnergia and buttonDropGold (FrankoH298)

---

Но я получаю следующий ответ от github

C:\Program Files (x86)\Jenkins\workspace\ao-server-release>exit 0 
[ao-server-release] $ "C:\Program Files\Git\bin\sh.exe" -xe C:\windows\TEMP\jenkins3213339319317768479.sh
+ echo '<<< Publishing on AO-LIBRE Server Release  >>>'
<<< Publishing on AO-LIBRE Server Release  >>>
+ token=123456
++ git describe --tags
+ tag=v0.13.29
+ filename='C:\ao-server-release-without-rubbish-files-temp\Changelog-server.txt'
+ readarray -t lines
++ sed -n '/^- v0.13.29.*/,/^---.*/p' 'C:\ao-server-release-without-rubbish-files-temp\Changelog-server.txt'
+ description=
+ for line in "${lines[@]}"
++ echo '' '- v0.13.29'
+ description=' - v0.13.29'
+ for line in "${lines[@]}"
++ echo ' - v0.13.29' '* 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298)'
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298)'
+ for line in "${lines[@]}"
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298)' '* 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo)'
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo)'
+ for line in "${lines[@]}"
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo)' '* 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298)'
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298)'
+ for line in "${lines[@]}"
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298)' '* 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).'
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).'
+ for line in "${lines[@]}"
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).' ''
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data). '
+ for line in "${lines[@]}"
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data). ' ---
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---'
+ name=v0.13.29
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---'
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---'
++ echo ' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---'
++ sed -z 's/\n/\\n/g'
+ description=' - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---\n'
++ curl -XPOST -H 'Authorization:token 123456' --data '{"tag_name": "v0.13.29", "target_commitish": "master", "name": "v0.13.29", "body": " - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---\n", "draft": true, "prerelease": true}' https://api.github.com/repos/ao-libre/ao-server/releases
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   716  100   132  100   584    375   1659 --:--:-- --:--:-- --:--:--  2039
+ release='{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/repos/releases/#create-a-release"
}'
++ echo '{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/repos/releases/#create-a-release"
}'

У меня уже есть эта строка для предотвращения проблем с синтаксическим анализом json, но они все еще существуют.

description=$(echo "$description" | sed -z 's/\n/\\n/g') # Escape line breaks to prevent json parsing problems

Любая идея или помощь, пожалуйста?

1 Ответ

0 голосов
/ 06 апреля 2020

Эй, проблема в том, что вы добавляете новую строку в конце клавиши body в json, которую следует либо удалить, либо экранировать.

{
  "tag_name":"v0.13.29",
  "target_commitish":"master",
  "name":"v0.13.29",
  "body":" - v0.13.29 * 02/04/2020: Al desconectarse del personaje, sin cerrar el socket, te envia a la pestaña de tu cuenta. (FrankoH298) * 02/04/2020: MD universal y Daga +4 ahora la puede usar el bardo (Neo) * 02/04/2020: Fix QuitarUser() and moved Areas.AreasOptimizacion() (FrankoH298) * 02/04/2020: Usamos clsByteQueue para enviar TODOS los paquetes de manera ordenada, sacamos las llamadas a EnviarDatosASlot(id, sndData) y usamos WriteASCIIStringFixed(data).  ---\\n",
  "draft":true,
  "prerelease":true
}
...