Skip to content

Instantly share code, notes, and snippets.

@mjdietzx
Last active March 29, 2021 15:19
Show Gist options
  • Save mjdietzx/6ec00ebd1223ca1cf87fa0c80e0bf84e to your computer and use it in GitHub Desktop.
Save mjdietzx/6ec00ebd1223ca1cf87fa0c80e0bf84e to your computer and use it in GitHub Desktop.
Create and add pre-built artifacts to a GitHub release from CI server using the GitHub releases API.
#!/bin/bash
# creates a GitHub release (draft) and adds pre-built artifacts to the release
# after running this script user should manually check the release in GitHub, optionally edit it, and publish it
# args: :version_number (the version number of this release), :body (text describing the contents of the tag)
# example usage: ./gh_release_bamboo.sh "1.0.0" "Release notes: ..."
# => name: nRF5-ble-driver_<platform_name>_1.0.0_compiled-binaries.zip example: nRF5-ble-driver_win-64_2.0.1_compiled-binaries.zip
# to ensure that bash is used: https://answers.atlassian.com/questions/28625/making-a-bamboo-script-execute-using-binbash
if [ "$(ps -p "$$" -o comm=)" != "bash" ]; then
# taken from http://unix-linux.questionfor.info/q_unix-linux-programming_85038.html
bash "$0" "$@"
exit "$?"
fi
# define variables
GH_ACCESS_TOKEN="REPLACE_ME"
GH_API="https://api.github.com"
GH_OWNER="mjdietzx"
GH_REPO="$GH_API/repos/$GH_OWNER/pc-ble-driver/releases?access_token=$GH_ACCESS_TOKEN"
# create a GitHub release, see: https://www.barrykooij.com/create-github-releases-via-command-line/
RELEASE_JSON=$(printf '{"tag_name": "v%s","target_commitish": "master","name": "nRF5-ble-driver_%s","body": "%s","draft": true,"prerelease": false}' "$1" "$1" "$2")
echo "Creating a release with info: $RELEASE_JSON."
release_id="$(curl --data "$RELEASE_JSON" $GH_REPO | python -c "import sys, json; print json.load(sys.stdin)['id']")"
# exit script if GitHub release was not successfully created
if [ -z "$release_id" ]
then
echo "Failed to create GitHub release. Exiting with error."
exit 1
else
echo "Release created with id: $release_id."
fi
# add artifacts to the release
# note that we expect artifacts for each platform to be located in separate sub-dirs,
# and we add these zipped sub-dirs to the release
ARTIFACTS_DIR="./artifacts"
for path in "$ARTIFACTS_DIR"/*; do
# if not a directory, skip
[ -d "$path" ] || continue
dirname="$(basename "$path")"
# create a zip file if windows release, else create a tar.gz file
fname="$ARTIFACTS_DIR/nRF5-ble-driver_${dirname}_$1_compiled-binaries"
if echo "$dirname" | grep -q "win"; then
f="$fname.zip"
# `-Z store` specifies no compression to be sure zip file is windows compatible: https://superuser.com/questions/5155/how-to-create-a-zip-file-compatible-with-windows-under-linux)
zip -Z store -r "$f" "$path"
else
f="$fname.tar.gz"
tar -czf "$f" "$path"
fi
GH_ASSET="https://uploads.github.com/repos/$GH_OWNER/pc-ble-driver/releases/$release_id/assets?name=$(basename "$f")&access_token=$GH_ACCESS_TOKEN"
curl --data-binary @"$f" -H "Content-Type: application/octet-stream" "$GH_ASSET"
done
echo "Release successful!"
exit 0
@mrodem
Copy link

mrodem commented Apr 19, 2017

I wasn't aware that compressed zip files were not platform independent. Are you sure about this? I have created compressed zip files using the zip command and shared them with Windows users before at least.

@mrodem
Copy link

mrodem commented Apr 19, 2017

Consider adding quotes around $ARTIFACTS_DIR/*, $f, $path, and $GH_ASSET on lines 41, 49, and 52. Could cause problems if a file or directory contains whitespace characters.

@bihanssen
Copy link

Not a big thing, but it would be nice to use zip on windows, and tar.gz on linux and macos. That would follow the convention we are using for other and previous releases.

@mjdietzx
Copy link
Author

@mrodem I'm not sure if compressing zip files will compromise platform independence but at least saw some discussion that it could be a problem https://superuser.com/questions/5155/how-to-create-a-zip-file-compatible-with-windows-under-linux so I'm just not compressing when zipping for windows to be safe (since whether we compress or not shouldn't matter anyways)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment