|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +if [ ! $GITHUB_EVENT_NAME == "release" ]; then |
| 4 | + echo "Wrong event '$GITHUB_EVENT_NAME'!" |
| 5 | + exit 1 |
| 6 | +fi |
| 7 | + |
| 8 | +EVENT_JSON=`cat $GITHUB_EVENT_PATH` |
| 9 | + |
| 10 | +action=`echo $EVENT_JSON | jq -r '.action'` |
| 11 | +if [ ! $action == "published" ]; then |
| 12 | + echo "Wrong action '$action'. Exiting now..." |
| 13 | + exit 0 |
| 14 | +fi |
| 15 | + |
| 16 | +draft=`echo $EVENT_JSON | jq -r '.release.draft'` |
| 17 | +if [ $draft == "true" ]; then |
| 18 | + echo "It's a draft release. Exiting now..." |
| 19 | + exit 0 |
| 20 | +fi |
| 21 | + |
| 22 | +RELEASE_PRE=`echo $EVENT_JSON | jq -r '.release.prerelease'` |
| 23 | +RELEASE_TAG=`echo $EVENT_JSON | jq -r '.release.tag_name'` |
| 24 | +RELEASE_BRANCH=`echo $EVENT_JSON | jq -r '.release.target_commitish'` |
| 25 | +RELEASE_ID=`echo $EVENT_JSON | jq -r '.release.id'` |
| 26 | +RELEASE_BODY=`echo $EVENT_JSON | jq -r '.release.body'` |
| 27 | + |
| 28 | +OUTPUT_DIR="$GITHUB_WORKSPACE/build" |
| 29 | +PACKAGE_NAME="esp32-$RELEASE_TAG" |
| 30 | +PACKAGE_JSON_MERGE="$GITHUB_WORKSPACE/.github/scripts/merge_packages.py" |
| 31 | +PACKAGE_JSON_TEMPLATE="$GITHUB_WORKSPACE/package/package_esp32_index.template.json" |
| 32 | +PACKAGE_JSON_DEV="package_esp32_dev_index.json" |
| 33 | +PACKAGE_JSON_REL="package_esp32_index.json" |
| 34 | + |
| 35 | +echo "Event: $GITHUB_EVENT_NAME, Repo: $GITHUB_REPOSITORY, Path: $GITHUB_WORKSPACE, Ref: $GITHUB_REF" |
| 36 | +echo "Action: $action, Branch: $RELEASE_BRANCH, ID: $RELEASE_ID" |
| 37 | +echo "Tag: $RELEASE_TAG, Draft: $draft, Pre-Release: $RELEASE_PRE" |
| 38 | + |
| 39 | +function get_file_size(){ |
| 40 | + local file="$1" |
| 41 | + if [[ "$OSTYPE" == "darwin"* ]]; then |
| 42 | + eval `stat -s "$file"` |
| 43 | + local res="$?" |
| 44 | + echo "$st_size" |
| 45 | + return $res |
| 46 | + else |
| 47 | + stat --printf="%s" "$file" |
| 48 | + return $? |
| 49 | + fi |
| 50 | +} |
| 51 | + |
| 52 | +function git_upload_asset(){ |
| 53 | + local name=$(basename "$1") |
| 54 | + # local mime=$(file -b --mime-type "$1") |
| 55 | + curl -k -X POST -sH "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/octet-stream" --data-binary @"$1" "https://uploads.github.com/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets?name=$name" |
| 56 | +} |
| 57 | + |
| 58 | +function git_safe_upload_asset(){ |
| 59 | + local file="$1" |
| 60 | + local name=$(basename "$file") |
| 61 | + local size=`get_file_size "$file"` |
| 62 | + local upload_res=`git_upload_asset "$file"` |
| 63 | + if [ $? -ne 0 ]; then |
| 64 | + >&2 echo "ERROR: Failed to upload '$name' ($?)" |
| 65 | + return 1 |
| 66 | + fi |
| 67 | + up_size=`echo "$upload_res" | jq -r '.size'` |
| 68 | + if [ $up_size -ne $size ]; then |
| 69 | + >&2 echo "ERROR: Uploaded size does not match! $up_size != $size" |
| 70 | + #git_delete_asset |
| 71 | + return 1 |
| 72 | + fi |
| 73 | + echo "$upload_res" | jq -r '.browser_download_url' |
| 74 | + return $? |
| 75 | +} |
| 76 | + |
| 77 | +function git_upload_to_pages(){ |
| 78 | + local path=$1 |
| 79 | + local src=$2 |
| 80 | + |
| 81 | + if [ ! -f "$src" ]; then |
| 82 | + >&2 echo "Input is not a file! Aborting..." |
| 83 | + return 1 |
| 84 | + fi |
| 85 | + |
| 86 | + local info=`curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.object+json" -X GET "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path?ref=gh-pages"` |
| 87 | + local type=`echo "$info" | jq -r '.type'` |
| 88 | + local message=$(basename $path) |
| 89 | + local sha="" |
| 90 | + local content="" |
| 91 | + |
| 92 | + if [ $type == "file" ]; then |
| 93 | + sha=`echo "$info" | jq -r '.sha'` |
| 94 | + sha=",\"sha\":\"$sha\"" |
| 95 | + message="Updating $message" |
| 96 | + elif [ ! $type == "null" ]; then |
| 97 | + >&2 echo "Wrong type '$type'" |
| 98 | + return 1 |
| 99 | + else |
| 100 | + message="Creating $message" |
| 101 | + fi |
| 102 | + |
| 103 | + content=`base64 -i "$src"` |
| 104 | + data="{\"branch\":\"gh-pages\",\"message\":\"$message\",\"content\":\"$content\"$sha}" |
| 105 | + |
| 106 | + echo "$data" | curl -s -k -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3.raw+json" -X PUT --data @- "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$path" |
| 107 | +} |
| 108 | + |
| 109 | +function git_safe_upload_to_pages(){ |
| 110 | + local path=$1 |
| 111 | + local file="$2" |
| 112 | + local name=$(basename "$file") |
| 113 | + local size=`get_file_size "$file"` |
| 114 | + local upload_res=`git_upload_to_pages "$path" "$file"` |
| 115 | + if [ $? -ne 0 ]; then |
| 116 | + >&2 echo "ERROR: Failed to upload '$name' ($?)" |
| 117 | + return 1 |
| 118 | + fi |
| 119 | + up_size=`echo "$upload_res" | jq -r '.content.size'` |
| 120 | + if [ $up_size -ne $size ]; then |
| 121 | + >&2 echo "ERROR: Uploaded size does not match! $up_size != $size" |
| 122 | + #git_delete_asset |
| 123 | + return 1 |
| 124 | + fi |
| 125 | + echo "$upload_res" | jq -r '.content.download_url' |
| 126 | + return $? |
| 127 | +} |
| 128 | + |
| 129 | +function merge_package_json(){ |
| 130 | + local jsonLink=$1 |
| 131 | + local jsonOut=$2 |
| 132 | + local old_json=$OUTPUT_DIR/oldJson.json |
| 133 | + local merged_json=$OUTPUT_DIR/mergedJson.json |
| 134 | + |
| 135 | + echo "Downloading previous JSON $jsonLink ..." |
| 136 | + curl -L -o "$old_json" "https://github.com/$GITHUB_REPOSITORY/releases/download/$jsonLink?access_token=$GITHUB_TOKEN" 2>/dev/null |
| 137 | + if [ $? -ne 0 ]; then echo "ERROR: Download Failed! $?"; exit 1; fi |
| 138 | + |
| 139 | + echo "Creating new JSON ..." |
| 140 | + set +e |
| 141 | + stdbuf -oL python "$PACKAGE_JSON_MERGE" "$jsonOut" "$old_json" > "$merged_json" |
| 142 | + set -e |
| 143 | + |
| 144 | + set -v |
| 145 | + if [ ! -s $merged_json ]; then |
| 146 | + rm -f "$merged_json" |
| 147 | + echo "Nothing to merge" |
| 148 | + else |
| 149 | + rm -f "$jsonOut" |
| 150 | + mv "$merged_json" "$jsonOut" |
| 151 | + echo "JSON data successfully merged" |
| 152 | + fi |
| 153 | + rm -f "$old_json" |
| 154 | + set +v |
| 155 | +} |
| 156 | + |
| 157 | +set -e |
| 158 | + |
| 159 | +## |
| 160 | +## PACKAGE ZIP |
| 161 | +## |
| 162 | + |
| 163 | +mkdir -p "$OUTPUT_DIR" |
| 164 | +PKG_DIR="$OUTPUT_DIR/$PACKAGE_NAME" |
| 165 | +PACKAGE_ZIP="$PACKAGE_NAME.zip" |
| 166 | + |
| 167 | +echo "Updating submodules ..." |
| 168 | +git -C "$GITHUB_WORKSPACE" submodule update --init --recursive > /dev/null 2>&1 |
| 169 | + |
| 170 | +mkdir -p "$PKG_DIR/tools" |
| 171 | + |
| 172 | +# Copy all core files to the package folder |
| 173 | +echo "Copying files for packaging ..." |
| 174 | +cp -f "$GITHUB_WORKSPACE/boards.txt" "$PKG_DIR/" |
| 175 | +cp -f "$GITHUB_WORKSPACE/programmers.txt" "$PKG_DIR/" |
| 176 | +cp -Rf "$GITHUB_WORKSPACE/cores" "$PKG_DIR/" |
| 177 | +cp -Rf "$GITHUB_WORKSPACE/libraries" "$PKG_DIR/" |
| 178 | +cp -Rf "$GITHUB_WORKSPACE/variants" "$PKG_DIR/" |
| 179 | +cp -f "$GITHUB_WORKSPACE/tools/espota.exe" "$PKG_DIR/tools/" |
| 180 | +cp -f "$GITHUB_WORKSPACE/tools/espota.py" "$PKG_DIR/tools/" |
| 181 | +cp -f "$GITHUB_WORKSPACE/tools/esptool.py" "$PKG_DIR/tools/" |
| 182 | +cp -f "$GITHUB_WORKSPACE/tools/gen_esp32part.py" "$PKG_DIR/tools/" |
| 183 | +cp -f "$GITHUB_WORKSPACE/tools/gen_esp32part.exe" "$PKG_DIR/tools/" |
| 184 | +cp -Rf "$GITHUB_WORKSPACE/tools/partitions" "$PKG_DIR/tools/" |
| 185 | +cp -Rf "$GITHUB_WORKSPACE/tools/sdk" "$PKG_DIR/tools/" |
| 186 | + |
| 187 | +# Remove unnecessary files in the package folder |
| 188 | +echo "Cleaning up folders ..." |
| 189 | +find "$PKG_DIR" -name '*.DS_Store' -exec rm -f {} \; |
| 190 | +find "$PKG_DIR" -name '*.git*' -type f -delete |
| 191 | + |
| 192 | +# Replace tools locations in platform.txt |
| 193 | +echo "Generating platform.txt..." |
| 194 | +cat "$GITHUB_WORKSPACE/platform.txt" | \ |
| 195 | +sed "s/version=.*/version=$ver$extent/g" | \ |
| 196 | +sed 's/runtime.tools.xtensa-esp32-elf-gcc.path={runtime.platform.path}\/tools\/xtensa-esp32-elf//g' | \ |
| 197 | +sed 's/tools.esptool_py.path={runtime.platform.path}\/tools\/esptool/tools.esptool_py.path=\{runtime.tools.esptool_py.path\}/g' \ |
| 198 | + > "$PKG_DIR/platform.txt" |
| 199 | + |
| 200 | +# Add header with version information |
| 201 | +echo "Generating core_version.h ..." |
| 202 | +ver_define=`echo $RELEASE_TAG | tr "[:lower:].\055" "[:upper:]_"` |
| 203 | +ver_hex=`git -C "$GITHUB_WORKSPACE" rev-parse --short=8 HEAD 2>/dev/null` |
| 204 | +echo \#define ARDUINO_ESP32_GIT_VER 0x$ver_hex > "$PKG_DIR/cores/esp32/core_version.h" |
| 205 | +echo \#define ARDUINO_ESP32_GIT_DESC `git -C "$GITHUB_WORKSPACE" describe --tags 2>/dev/null` >> "$PKG_DIR/cores/esp32/core_version.h" |
| 206 | +echo \#define ARDUINO_ESP32_RELEASE_$ver_define >> "$PKG_DIR/cores/esp32/core_version.h" |
| 207 | +echo \#define ARDUINO_ESP32_RELEASE \"$ver_define\" >> "$PKG_DIR/cores/esp32/core_version.h" |
| 208 | + |
| 209 | +# Compress package folder |
| 210 | +echo "Creating ZIP ..." |
| 211 | +pushd "$OUTPUT_DIR" >/dev/null |
| 212 | +zip -qr "$PACKAGE_ZIP" "$PACKAGE_NAME" |
| 213 | +if [ $? -ne 0 ]; then echo "ERROR: Failed to create $PACKAGE_ZIP ($?)"; exit 1; fi |
| 214 | + |
| 215 | +# Calculate SHA-256 |
| 216 | +echo "Calculating SHA sum ..." |
| 217 | +PACKAGE_PATH="$OUTPUT_DIR/$PACKAGE_ZIP" |
| 218 | +PACKAGE_SHA=`shasum -a 256 "$PACKAGE_ZIP" | cut -f 1 -d ' '` |
| 219 | +PACKAGE_SIZE=`get_file_size "$PACKAGE_ZIP"` |
| 220 | +popd >/dev/null |
| 221 | +rm -rf "$PKG_DIR" |
| 222 | +echo "'$PACKAGE_ZIP' Created! Size: $PACKAGE_SIZE, SHA-256: $PACKAGE_SHA" |
| 223 | +echo |
| 224 | + |
| 225 | +# Upload package to release page |
| 226 | +echo "Uploading package to release page ..." |
| 227 | +PACKAGE_URL=`git_safe_upload_asset "$PACKAGE_PATH"` |
| 228 | +echo "Package Uploaded" |
| 229 | +echo "Download URL: $PACKAGE_URL" |
| 230 | +echo |
| 231 | + |
| 232 | +## |
| 233 | +## PACKAGE JSON |
| 234 | +## |
| 235 | + |
| 236 | +# Construct JQ argument with package data |
| 237 | +jq_arg=".packages[0].platforms[0].version = \"$RELEASE_TAG\" | \ |
| 238 | + .packages[0].platforms[0].url = \"$PACKAGE_URL\" |\ |
| 239 | + .packages[0].platforms[0].archiveFileName = \"$PACKAGE_ZIP\" |\ |
| 240 | + .packages[0].platforms[0].size = \"$PACKAGE_SIZE\" |\ |
| 241 | + .packages[0].platforms[0].checksum = \"SHA-256:$PACKAGE_SHA\"" |
| 242 | + |
| 243 | +# Generate package JSONs |
| 244 | +echo "Genarating $PACKAGE_JSON_DEV ..." |
| 245 | +cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV" |
| 246 | +if [ "$RELEASE_PRE" == "false" ]; then |
| 247 | + echo "Genarating $PACKAGE_JSON_REL ..." |
| 248 | + cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_REL" |
| 249 | +fi |
| 250 | + |
| 251 | +# Figure out the last release or pre-release |
| 252 | +echo "Getting previous releases ..." |
| 253 | +releasesJson=`curl -sH "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$GITHUB_REPOSITORY/releases" 2>/dev/null` |
| 254 | +if [ $? -ne 0 ]; then echo "ERROR: Get Releases Failed! ($?)"; exit 1; fi |
| 255 | + |
| 256 | +set +e |
| 257 | +prev_release=$(echo "$releasesJson" | jq -e -r '. | map(select(.draft == false and .prerelease == false)) | sort_by(.created_at | - fromdateiso8601) | .[0].tag_name') |
| 258 | +prev_any_release=$(echo "$releasesJson" | jq -e -r '. | map(select(.draft == false)) | sort_by(.created_at | - fromdateiso8601) | .[0].tag_name') |
| 259 | +shopt -s nocasematch |
| 260 | +if [ "$prev_any_release" == "$RELEASE_TAG" ]; then |
| 261 | + prev_release=$(echo "$releasesJson" | jq -e -r '. | map(select(.draft == false and .prerelease == false)) | sort_by(.created_at | - fromdateiso8601) | .[1].tag_name') |
| 262 | + prev_any_release=$(echo "$releasesJson" | jq -e -r '. | map(select(.draft == false)) | sort_by(.created_at | - fromdateiso8601) | .[1].tag_name') |
| 263 | +fi |
| 264 | +COMMITS_SINCE_RELEASE="$prev_any_release" |
| 265 | +shopt -u nocasematch |
| 266 | +set -e |
| 267 | + |
| 268 | +# Merge package JSONs with previous releases |
| 269 | +if [ ! -z "$prev_any_release" ] && [ "$prev_any_release" != "null" ]; then |
| 270 | + echo "Merging with JSON from $prev_any_release ..." |
| 271 | + merge_package_json "$prev_any_release/$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV" |
| 272 | +fi |
| 273 | + |
| 274 | +if [ "$RELEASE_PRE" == "false" ]; then |
| 275 | + COMMITS_SINCE_RELEASE="$prev_release" |
| 276 | + if [ ! -z "$prev_release" ] && [ "$prev_release" != "null" ]; then |
| 277 | + echo "Merging with JSON from $prev_release ..." |
| 278 | + merge_package_json "$prev_release/$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL" |
| 279 | + fi |
| 280 | +fi |
| 281 | + |
| 282 | +echo "Previous Release: $prev_release" |
| 283 | +echo "Previous (any)release: $prev_any_release" |
| 284 | +echo |
| 285 | + |
| 286 | +# Upload package JSONs |
| 287 | +echo "Uploading $PACKAGE_JSON_DEV ..." |
| 288 | +echo "Download URL: "`git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV"` |
| 289 | +echo "Pages URL: "`git_safe_upload_to_pages "$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV"` |
| 290 | +echo |
| 291 | +if [ "$RELEASE_PRE" == "false" ]; then |
| 292 | + echo "Uploading $PACKAGE_JSON_REL ..." |
| 293 | + echo "Download URL: "`git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL"` |
| 294 | + echo "Pages URL: "`git_safe_upload_to_pages "$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL"` |
| 295 | + echo |
| 296 | +fi |
| 297 | + |
| 298 | +## |
| 299 | +## RELEASE NOTES |
| 300 | +## |
| 301 | + |
| 302 | +# Create release notes |
| 303 | +echo "Preparing release notes ..." |
| 304 | +releaseNotes="" |
| 305 | + |
| 306 | +# Process annotated tags |
| 307 | +relNotesRaw=`git -C "$GITHUB_WORKSPACE" show -s --format=%b $RELEASE_TAG` |
| 308 | +readarray -t msgArray <<<"$relNotesRaw" |
| 309 | +arrLen=${#msgArray[@]} |
| 310 | +if [ $arrLen > 3 ] && [ "${msgArray[0]:0:3}" == "tag" ]; then |
| 311 | + ind=3 |
| 312 | + while [ $ind -lt $arrLen ]; do |
| 313 | + if [ $ind -eq 3 ]; then |
| 314 | + releaseNotes="#### ${msgArray[ind]}" |
| 315 | + releaseNotes+=$'\r\n' |
| 316 | + else |
| 317 | + oneLine="$(echo -e "${msgArray[ind]}" | sed -e 's/^[[:space:]]*//')" |
| 318 | + if [ ${#oneLine} -gt 0 ]; then |
| 319 | + if [ "${oneLine:0:2}" == "* " ]; then oneLine=$(echo ${oneLine/\*/-}); fi |
| 320 | + if [ "${oneLine:0:2}" != "- " ]; then releaseNotes+="- "; fi |
| 321 | + releaseNotes+="$oneLine" |
| 322 | + releaseNotes+=$'\r\n' |
| 323 | + fi |
| 324 | + fi |
| 325 | + let ind=$ind+1 |
| 326 | + done |
| 327 | +fi |
| 328 | + |
| 329 | +# Append Commit Messages |
| 330 | +if [ ! -z "$COMMITS_SINCE_RELEASE" ] && [ "$COMMITS_SINCE_RELEASE" != "null" ]; then |
| 331 | + echo "Getting commits since $COMMITS_SINCE_RELEASE ..." |
| 332 | + commitFile=$OUTPUT_DIR/commits.txt |
| 333 | + git -C "$GITHUB_WORKSPACE" log --oneline $COMMITS_SINCE_RELEASE.. > "$OUTPUT_DIR/commits.txt" |
| 334 | + releaseNotes+=$'\r\n##### Commits\r\n' |
| 335 | + IFS=$'\n' |
| 336 | + for next in `cat $commitFile` |
| 337 | + do |
| 338 | + IFS=' ' read -r commitId commitMsg <<< "$next" |
| 339 | + commitLine="- [$commitId](https://github.com/$GITHUB_REPOSITORY/commit/$commitId) $commitMsg" |
| 340 | + releaseNotes+="$commitLine" |
| 341 | + releaseNotes+=$'\r\n' |
| 342 | + done |
| 343 | + rm -f $commitFile |
| 344 | +fi |
| 345 | + |
| 346 | +# Prepend the original release body |
| 347 | +if [ "${RELEASE_BODY: -1}" == $'\r' ]; then |
| 348 | + RELEASE_BODY="${RELEASE_BODY:0:-1}" |
| 349 | +else |
| 350 | + RELEASE_BODY="$RELEASE_BODY" |
| 351 | +fi |
| 352 | +RELEASE_BODY+=$'\r\n' |
| 353 | +releaseNotes="$RELEASE_BODY$releaseNotes" |
| 354 | + |
| 355 | +# Update release page |
| 356 | +echo "Updating release notes ..." |
| 357 | +releaseNotes=$(printf '%s' "$releaseNotes" | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))') |
| 358 | +releaseNotes=${releaseNotes:1:-1} |
| 359 | +curlData="{\"body\": \"$releaseNotes\"}" |
| 360 | +releaseData=`curl --data "$curlData" "https://api.github.com/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID?access_token=$GITHUB_TOKEN" 2>/dev/null` |
| 361 | +if [ $? -ne 0 ]; then echo "ERROR: Updating Release Failed: $?"; exit 1; fi |
| 362 | +echo "Release notes successfully updated" |
| 363 | +echo |
| 364 | + |
| 365 | +## |
| 366 | +## SUBMODULE VERSIONS |
| 367 | +## |
| 368 | + |
| 369 | +# Upload submodules versions |
| 370 | +echo "Generating submodules.txt ..." |
| 371 | +git -C "$GITHUB_WORKSPACE" submodule status > "$OUTPUT_DIR/submodules.txt" |
| 372 | +echo "Uploading submodules.txt ..." |
| 373 | +echo "Download URL: "`git_safe_upload_asset "$OUTPUT_DIR/submodules.txt"` |
| 374 | +echo "" |
| 375 | +set +e |
| 376 | + |
| 377 | +## |
| 378 | +## DONE |
| 379 | +## |
| 380 | +echo "DONE!" |
0 commit comments