upload-appimage.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #! /bin/bash
  2. # Env
  3. export BUILD=${DRONE_BUILD_NUMBER}
  4. export PR=${DRONE_PULL_REQUEST}
  5. export GIT_USERNAME=${CI_UPLOAD_GIT_USERNAME}
  6. export GIT_TOKEN=${CI_UPLOAD_GIT_TOKEN}
  7. # Needed to get it working on drone
  8. export SUFFIX=${DRONE_PULL_REQUEST:=master}
  9. if [ $SUFFIX != "master" ]; then
  10. SUFFIX="PR-$SUFFIX"
  11. fi
  12. export DESKTOP_CLIENT_ROOT=${DESKTOP_CLIENT_ROOT:-/home/user}
  13. export APPNAME=${APPNAME:-nextcloud}
  14. # Defaults
  15. export GIT_REPO=ci-builds
  16. export API_BASE_URL=https://api.github.com/repos/$GIT_USERNAME/$GIT_REPO
  17. export DESKTOP_API_BASE_URL=https://api.github.com/repos/nextcloud/desktop
  18. # PR / master
  19. export TAG_NAME=${PR:=master}
  20. export RELEASE_BODY=https://github.com/nextcloud/desktop
  21. if [ $TAG_NAME != "master" ]; then
  22. TAG_NAME="PR-$TAG_NAME"
  23. RELEASE_BODY="nextcloud/desktop#$PR"
  24. fi
  25. cd ${DESKTOP_CLIENT_ROOT}
  26. echo `pwd`
  27. ls
  28. # AppImage
  29. if [ ! -z "$DRONE_COMMIT" ]
  30. then
  31. export APPIMAGE=$(readlink -f ./${APPNAME}-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage)
  32. else
  33. export APPIMAGE=$(readlink -f ./Nextcloud*.AppImage)
  34. fi
  35. export UPDATE=$(readlink -f ./Nextcloud*.AppImage.zsync)
  36. export BASENAME=$(basename ${APPIMAGE})
  37. if ! test -e $APPIMAGE ; then
  38. exit 1
  39. fi
  40. echo "Found AppImage: $BASENAME"
  41. if [ $TAG_NAME != "master" ]; then
  42. # Delete all old comments in desktop PR, starting with "AppImage file:"
  43. oldComments=$(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $DESKTOP_API_BASE_URL/issues/$PR/comments | jq '.[] | (.id |tostring) + "|" + (.user.login | test("'${GIT_USERNAME}'") | tostring) + "|" + (.body | test("AppImage file:.*") | tostring)' | grep "true|true" | tr -d "\"" | cut -f1 -d"|")
  44. if [[ "$oldComments" != "" ]]; then
  45. echo $oldComments | while read comment ; do
  46. curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X DELETE $DESKTOP_API_BASE_URL/issues/comments/$comment
  47. done
  48. fi
  49. fi
  50. # Helper functions
  51. urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
  52. create_release()
  53. {
  54. name=$TAG_NAME
  55. body=$RELEASE_BODY
  56. tagName=$TAG_NAME
  57. echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X POST $API_BASE_URL/releases -d "{ \"tag_name\": \"$tagName\", \"target_commitish\": \"master\", \"name\": \"$name\", \"body\": \"$body\", \"draft\": false, \"prerelease\": true }")
  58. }
  59. get_release()
  60. {
  61. tagName=$TAG_NAME
  62. echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $API_BASE_URL/releases/tags/$tagName)
  63. }
  64. get_release_assets()
  65. {
  66. releaseId=$1
  67. echo $(curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X GET $API_BASE_URL/releases/$releaseId/assets)
  68. }
  69. upload_release_asset()
  70. {
  71. uploadUrl=$1
  72. echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $APPIMAGE)
  73. echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $UPDATE)
  74. }
  75. delete_release_asset()
  76. {
  77. assetId=$1
  78. curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X DELETE $API_BASE_URL/releases/assets/$assetId
  79. }
  80. # Try to get an already existing release
  81. json=$(get_release)
  82. releaseId=$(echo $json | jq -r '.id')
  83. uploadUrl=$(echo $json | jq -r '.upload_url')
  84. if [[ "$uploadUrl" == "null" ]]; then
  85. # Try to create a release
  86. json=$(create_release)
  87. echo $json
  88. releaseId=$(echo $json | jq -r '.id')
  89. uploadUrl=$(echo $json | jq -r '.upload_url')
  90. if [[ "$uploadUrl" == "null" ]]; then
  91. echo "create_release failed: $json"
  92. exit 2
  93. fi
  94. fi
  95. # Prepare upload url
  96. uploadUrl=$(echo "${uploadUrl/'{?name,label}'/?name=$BASENAME}")
  97. # Try to delete existing AppImage assets for this PR
  98. assets=$(get_release_assets $releaseId)
  99. for data in $(echo $assets | jq -r '.[] | @uri'); do
  100. json=$(urldecode "$data")
  101. assetId=$(echo $json | jq -r '.id')
  102. name=$(echo $json | jq -r '.name')
  103. if [[ "$name" == *.AppImage ]]; then
  104. echo "Deleting old asset: $name"
  105. $(delete_release_asset $assetId)
  106. fi
  107. done
  108. # Upload release asset
  109. echo "Uploading new asset: $BASENAME"
  110. json=$(upload_release_asset "$uploadUrl")
  111. browserDownloadUrl=$(echo $json | jq -r '.browser_download_url')
  112. if [[ "$browserDownloadUrl" == "null" ]]; then
  113. echo "upload_release_asset failed: $json"
  114. exit 3
  115. fi
  116. if [ $TAG_NAME != "master" ]; then
  117. # Create comment in desktop PR
  118. curl 2>/dev/null -u $GIT_USERNAME:$GIT_TOKEN -X POST $DESKTOP_API_BASE_URL/issues/$PR/comments -d "{ \"body\" : \"AppImage file: [$BASENAME]($browserDownloadUrl) <br/><br/>To test this change/fix you can simply download above AppImage file and test it. <br/><br/>Please make sure to quit your existing Nextcloud app and backup your data. \" }"
  119. fi
  120. echo
  121. echo "AppImage link: $browserDownloadUrl"