Skip to content

Instantly share code, notes, and snippets.

@maxim
Last active October 5, 2025 23:43
Show Gist options
  • Save maxim/6e15aa45ba010ab030c4 to your computer and use it in GitHub Desktop.
Save maxim/6e15aa45ba010ab030c4 to your computer and use it in GitHub Desktop.

Revisions

  1. maxim revised this gist Nov 5, 2015. No changes.
  2. maxim created this gist Nov 5, 2015.
    55 changes: 55 additions & 0 deletions gh-dl-release
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    #!/usr/bin/env bash
    #
    # gh-dl-release! It works!
    #
    # This script downloads an asset from latest or specific Github release of a
    # private repo. Feel free to extract more of the variables into command line
    # parameters.
    #
    # PREREQUISITES
    #
    # curl, wget, jq
    #
    # USAGE
    #
    # Set all the variables inside the script, make sure you chmod +x it, then
    # to download specific version to my_app.tar.gz:
    #
    # gh-dl-release 2.1.1 my_app.tar.gz
    #
    # to download latest version:
    #
    # gh-dl-release latest latest.tar.gz
    #
    # If your version/tag doesn't match, the script will exit with error.

    TOKEN="<github_access_token>"
    REPO="<user_or_org>/<repo_name>"
    FILE="<name_of_asset_file>" # the name of your release asset file, e.g. build.tar.gz
    VERSION=$1 # tag name or the word "latest"
    GITHUB="https://api.github.com"

    alias errcho='>&2 echo'

    function gh_curl() {
    curl -H "Authorization: token $TOKEN" \
    -H "Accept: application/vnd.github.v3.raw" \
    $@
    }

    if [ "$VERSION" = "latest" ]; then
    # Github should return the latest release first.
    parser=".[0].assets | map(select(.name == \"$FILE\"))[0].id"
    else
    parser=". | map(select(.tag_name == \"$VERSION\"))[0].assets | map(select(.name == \"$FILE\"))[0].id"
    fi;

    asset_id=`gh_curl -s $GITHUB/repos/$REPO/releases | jq "$parser"`
    if [ "$asset_id" = "null" ]; then
    errcho "ERROR: version not found $VERSION"
    exit 1
    fi;

    wget -q --auth-no-challenge --header='Accept:application/octet-stream' \
    https://$TOKEN:@api.github.com/repos/$REPO/releases/assets/$asset_id \
    -O $2