First commit
This commit is contained in:
commit
258e7bb7a4
2 changed files with 229 additions and 0 deletions
9
Makefile
Normal file
9
Makefile
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
HUGO_BIN = cache/bin/hugo
|
||||||
|
|
||||||
|
install-hugo: $(HUGO_BIN)
|
||||||
|
$(HUGO_BIN):
|
||||||
|
#mv $$(find cache -name "hugo_*_linux-amd64.tar.gz") cache/hugo.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf ./cache/
|
||||||
220
tools/github-release-downloader.sh
Executable file
220
tools/github-release-downloader.sh
Executable file
|
|
@ -0,0 +1,220 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# GitHub Release Asset Downloader
|
||||||
|
# Simplest way to download the latest artifact from a public GitHub project
|
||||||
|
#
|
||||||
|
# How to use:
|
||||||
|
# Export the following variables or pass them as parameters.
|
||||||
|
# $ ./github-release-downloader.sh \
|
||||||
|
# <GITHUB_ORG> \
|
||||||
|
# <GITHUB_REPO> \
|
||||||
|
# <SEARCH_PATTERN>
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# $ ./github-release-downloader.sh \
|
||||||
|
# gohugoio \
|
||||||
|
# hugo \
|
||||||
|
# "_linux-amd64.tar.gz"
|
||||||
|
#
|
||||||
|
# Inspired by:
|
||||||
|
# https://gist.github.com/umohi/bfc7ad9a845fc10289c03d532e3d2c2f
|
||||||
|
|
||||||
|
# START
|
||||||
|
|
||||||
|
# Parameters
|
||||||
|
declare -r GITHUB_ORG=${GITHUB_ORG:-$1}
|
||||||
|
declare -r GITHUB_REPO=${GITHUB_REPO:-$2}
|
||||||
|
declare -r SEARCH_PATTERN=${SEARCH_PATTERN:-$3}
|
||||||
|
|
||||||
|
# Helpers
|
||||||
|
if [ -z "$TERM" ] || [ "$TERM" == "dumb" ]; then
|
||||||
|
tput() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
if ! type tput >/dev/null 2>&1; then
|
||||||
|
tput() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
log_info() {
|
||||||
|
local CYAN=$(tput setaf 6)
|
||||||
|
local NC=$(tput sgr0)
|
||||||
|
echo "${CYAN}[INFO ]${NC} $*" 1>&2
|
||||||
|
}
|
||||||
|
log_warning() {
|
||||||
|
local YELLOW=$(tput setaf 3)
|
||||||
|
local NC=$(tput sgr0)
|
||||||
|
echo "${YELLOW}[WARNING]${NC} $*" 1>&2
|
||||||
|
}
|
||||||
|
log_error() {
|
||||||
|
local RED=$(tput setaf 1)
|
||||||
|
local NC=$(tput sgr0)
|
||||||
|
echo "${RED}[ERROR ]${NC} $*" 1>&2
|
||||||
|
}
|
||||||
|
log_success() {
|
||||||
|
local GREEN=$(tput setaf 2)
|
||||||
|
local NC=$(tput sgr0)
|
||||||
|
echo "${GREEN}[SUCCESS]${NC} $*" 1>&2
|
||||||
|
}
|
||||||
|
log_title() {
|
||||||
|
local GREEN=$(tput setaf 2)
|
||||||
|
local BOLD=$(tput bold)
|
||||||
|
local NC=$(tput sgr0)
|
||||||
|
echo 1>&2
|
||||||
|
echo "${GREEN}${BOLD}---- $* ----${NC}" 1>&2
|
||||||
|
}
|
||||||
|
h_run() {
|
||||||
|
local ORANGE=$(tput setaf 3)
|
||||||
|
local NC=$(tput sgr0)
|
||||||
|
echo "${ORANGE}\$${NC} $*" 1>&2
|
||||||
|
eval "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
err() {
|
||||||
|
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
function get_tags() {
|
||||||
|
# DEPRECATED, using release instead
|
||||||
|
log_info "Checking https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/tags"
|
||||||
|
|
||||||
|
# TODO add error handling
|
||||||
|
TAGS=$(curl -sL https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/tags)
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_latest_tag() {
|
||||||
|
# DEPRECATED, using release instead
|
||||||
|
get_tags
|
||||||
|
|
||||||
|
TAG_LATEST=$(echo ${TAGS} | jq -r '.[0]')
|
||||||
|
TAG_LATEST_NAME=$(echo $TAG_LATEST | jq -r .name)
|
||||||
|
|
||||||
|
log_info "[get_latest_tag] latest tag identified: ${TAG_LATEST_NAME}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_releases() {
|
||||||
|
log_info "[get_releases] checking https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/releases"
|
||||||
|
|
||||||
|
# TODO add error handling
|
||||||
|
RELEASES=$(curl -sL https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/releases)
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_latest_release() {
|
||||||
|
get_releases
|
||||||
|
|
||||||
|
RELEASE_LATEST=$(echo ${RELEASES} | jq -r '.[0]')
|
||||||
|
RELEASE_LATEST_NAME=$(echo $RELEASE_LATEST | jq -r .name)
|
||||||
|
local _ID=$(echo $RELEASE_LATEST | jq -r .id)
|
||||||
|
|
||||||
|
log_info "[get_latest_release] latest release identified: name=${RELEASE_LATEST_NAME} id=${_ID}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_release_assets() {
|
||||||
|
local _RELEASE_NAME=$1
|
||||||
|
|
||||||
|
RELEASE=""
|
||||||
|
ASSETS=""
|
||||||
|
|
||||||
|
# TODO error handling, release not found
|
||||||
|
RELEASE=$(echo ${RELEASES} | jq -r ".[] | select(.name == \"$_RELEASE_NAME\")")
|
||||||
|
ASSETS=$(echo ${RELEASES} | jq -r ".[] | select(.name == \"$_RELEASE_NAME\") | .assets")
|
||||||
|
|
||||||
|
local _ASSETS_COUNT=$(echo ${ASSETS} | jq length)
|
||||||
|
log_info "[get_release_assets] release=${_RELEASE_NAME} - total_of_assets=${_ASSETS_COUNT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function search_asset_by_name() {
|
||||||
|
local _CONTAINS=$1
|
||||||
|
|
||||||
|
ASSET=""
|
||||||
|
ASSET_NAME=""
|
||||||
|
ASSET_URL=""
|
||||||
|
# TODO assert ASSETS is > 0
|
||||||
|
|
||||||
|
ASSET=$(echo $ASSETS | jq -r ".[] | select(.name | contains(\"$_CONTAINS\"))")
|
||||||
|
|
||||||
|
ASSET_NAME=$(echo ${ASSET} | jq -r ".name" | head -n 1)
|
||||||
|
ASSET_URL=$(echo ${ASSET} | jq -r ".browser_download_url" | head -n 1)
|
||||||
|
|
||||||
|
log_info "[search_asset_by_name] found ${ASSET_NAME}"
|
||||||
|
log_info "[search_asset_by_name] ${ASSET_URL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_help() {
|
||||||
|
# Prints help section from the top of the file
|
||||||
|
#
|
||||||
|
# It stops until it finds the '# START' line
|
||||||
|
|
||||||
|
echo "HELP:"
|
||||||
|
while read -r LINE; do
|
||||||
|
if [[ "${LINE}" == "#!/bin/bash" ]] || [[ "${LINE}" == "" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ "${LINE}" == "# START" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
echo "${LINE}" | sed 's/^# / /g' | sed 's/^#//g'
|
||||||
|
done <${BASH_SOURCE[0]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Input validation
|
||||||
|
declare -i MISSING_ARG=0
|
||||||
|
if [[ "${GITHUB_ORG}" == "" ]]; then
|
||||||
|
echo "ERROR! Missing 'GITHUB_ORG' argument!"
|
||||||
|
MISSING_ARG=1
|
||||||
|
fi
|
||||||
|
if [[ "${GITHUB_REPO}" == "" ]]; then
|
||||||
|
echo "ERROR! Missing 'GITHUB_REPO' argument!"
|
||||||
|
MISSING_ARG=1
|
||||||
|
fi
|
||||||
|
if [[ "${SEARCH_PATTERN}" == "" ]]; then
|
||||||
|
echo "ERROR! Missing 'SEARCH_PATTERN' argument!"
|
||||||
|
MISSING_ARG=1
|
||||||
|
fi
|
||||||
|
if [[ ${MISSING_ARG} -gt 0 ]]; then
|
||||||
|
print_help
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Variables (DEPRECATED)
|
||||||
|
# declare TAGS
|
||||||
|
# declare TAG_LATEST
|
||||||
|
# declare TAG_LATEST_NAME
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
declare RELEASES
|
||||||
|
declare RELEASE_LATEST
|
||||||
|
declare RELEASE_LATEST_NAME
|
||||||
|
declare RELEASE
|
||||||
|
declare ASSETS
|
||||||
|
declare ASSET
|
||||||
|
|
||||||
|
# Main
|
||||||
|
function main() {
|
||||||
|
log_info "Parameters:"
|
||||||
|
log_info " GITHUB_ORG : ${GITHUB_ORG}"
|
||||||
|
log_info " GITHUB_REPO : ${GITHUB_REPO}"
|
||||||
|
log_info " SEARCH_PATTERN : ${SEARCH_PATTERN}"
|
||||||
|
|
||||||
|
# Retrieve
|
||||||
|
get_latest_release
|
||||||
|
get_release_assets ${RELEASE_LATEST_NAME}
|
||||||
|
search_asset_by_name ${SEARCH_PATTERN}
|
||||||
|
|
||||||
|
declare -r OUTPUT_FILE_PATH="$(pwd)/${ASSET_NAME}"
|
||||||
|
|
||||||
|
# Download
|
||||||
|
if [[ -f "${OUTPUT_FILE_PATH}" ]]; then
|
||||||
|
log_warning "File already exist! ${OUTPUT_FILE_PATH}"
|
||||||
|
log_warning "Skipping..."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
log_info "Downloading..."
|
||||||
|
h_run "curl --progress-bar -o ${OUTPUT_FILE_PATH} ${ASSET_URL}"
|
||||||
|
log_success "Saved on: ${OUTPUT_FILE_PATH}"
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
||||||
Loading…
Add table
Reference in a new issue