Repository navigation
feat: add script to install the latest binary #85
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
555dfb8
add install script
beeme1mr ca14734
feat: add script to install the lastest binary
beeme1mr 5dccfc6
Merge branch 'main' into add-install-script
beeme1mr ad1c649
Update bin/install.sh
beeme1mr 334bfb4
Update bin/install.sh
beeme1mr 4a8737e
Update bin/install.sh
beeme1mr c06bceb
automatically add to path
beeme1mr c7e1075
default to $HOME/.local/bin
beeme1mr 0bb2ec3
Merge branch 'main' into add-install-script
beeme1mr File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,262 @@ | ||
| #!/bin/sh | ||
| set -e | ||
|
|
||
| # Adapted/Copied from https://github.com/daveshanley/vacuum/blob/main/bin/install.sh | ||
|
|
||
| if [ -d "$HOME/.local/bin" ] || mkdir -p "$HOME/.local/bin" 2>/dev/null; then | ||
| DEFAULT_INSTALL_DIR="$HOME/.local/bin" | ||
| elif [ -w "/usr/local/bin" ]; then | ||
| DEFAULT_INSTALL_DIR="/usr/local/bin" | ||
| else | ||
| fmt_error "unable to write to $HOME/.local/bin or /usr/local/bin" | ||
| fmt_error "Please run this script with sudo or set INSTALL_DIR to a directory you can write to." | ||
| exit 1 | ||
| fi | ||
|
|
||
| INSTALL_DIR=${INSTALL_DIR:-$DEFAULT_INSTALL_DIR} | ||
| BINARY_NAME=${BINARY_NAME:-"openfeature"} | ||
|
|
||
| REPO_NAME="open-feature/cli" | ||
| ISSUE_URL="https://github.com/open-feature/cli/issues/new" | ||
|
|
||
| # get_latest_release "open-feature/cli" | ||
| get_latest_release() { | ||
| curl --retry 5 --silent "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api | ||
| grep '"tag_name":' | # Get tag line | ||
| sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value | ||
| } | ||
|
|
||
| get_asset_name() { | ||
| echo "openfeature_$1_$2.tar.gz" | ||
| } | ||
|
|
||
| get_download_url() { | ||
| local asset_name=$(get_asset_name $2 $3) | ||
| echo "https://github.com/open-feature/cli/releases/download/v$1/${asset_name}" | ||
| } | ||
|
|
||
| get_checksum_url() { | ||
| echo "https://github.com/open-feature/cli/releases/download/v$1/checksums.txt" | ||
| } | ||
|
|
||
| command_exists() { | ||
| command -v "$@" >/dev/null 2>&1 | ||
| } | ||
|
|
||
| fmt_error() { | ||
| echo ${RED}"Error: $@"${RESET} >&2 | ||
| } | ||
|
|
||
| fmt_warning() { | ||
| echo ${YELLOW}"Warning: $@"${RESET} >&2 | ||
| } | ||
|
|
||
| fmt_underline() { | ||
| echo "$(printf '\033[4m')$@$(printf '\033[24m')" | ||
| } | ||
|
|
||
| fmt_code() { | ||
| echo "\`$(printf '\033[38;5;247m')$@${RESET}\`" | ||
| } | ||
|
|
||
| setup_color() { | ||
| # Only use colors if connected to a terminal | ||
| if [ -t 1 ]; then | ||
| RED=$(printf '\033[31m') | ||
| GREEN=$(printf '\033[32m') | ||
| YELLOW=$(printf '\033[33m') | ||
| BLUE=$(printf '\033[34m') | ||
| MAGENTA=$(printf '\033[35m') | ||
| BOLD=$(printf '\033[1m') | ||
| RESET=$(printf '\033[m') | ||
| else | ||
| RED="" | ||
| GREEN="" | ||
| YELLOW="" | ||
| BLUE="" | ||
| MAGENTA="" | ||
| BOLD="" | ||
| RESET="" | ||
| fi | ||
| } | ||
|
|
||
| get_os() { | ||
| case "$(uname -s)" in | ||
| *linux* ) echo "Linux" ;; | ||
| *Linux* ) echo "Linux" ;; | ||
| *darwin* ) echo "Darwin" ;; | ||
| *Darwin* ) echo "Darwin" ;; | ||
| esac | ||
| } | ||
|
|
||
| get_machine() { | ||
| case "$(uname -m)" in | ||
| "x86_64"|"amd64"|"x64") | ||
| echo "x86_64" ;; | ||
| "i386"|"i86pc"|"x86"|"i686") | ||
| echo "i386" ;; | ||
| "arm64"|"armv6l"|"aarch64") | ||
| echo "arm64" | ||
| esac | ||
| } | ||
|
|
||
| get_tmp_dir() { | ||
| echo $(mktemp -d) | ||
| } | ||
|
|
||
| do_checksum() { | ||
| checksum_url=$(get_checksum_url $version) | ||
| get_checksum_url $version | ||
| expected_checksum=$(curl -sL $checksum_url | grep $asset_name | awk '{print $1}') | ||
|
|
||
| if command_exists sha256sum; then | ||
| checksum=$(sha256sum $asset_name | awk '{print $1}') | ||
| elif command_exists shasum; then | ||
| checksum=$(shasum -a 256 $asset_name | awk '{print $1}') | ||
| else | ||
| fmt_warning "Could not find a checksum program. Install shasum or sha256sum to validate checksum." | ||
| return 0 | ||
| fi | ||
|
|
||
| if [ "$checksum" != "$expected_checksum" ]; then | ||
| fmt_error "Checksums do not match" | ||
| exit 1 | ||
| fi | ||
| } | ||
|
|
||
| do_install_binary() { | ||
| asset_name=$(get_asset_name $os $machine) | ||
| download_url=$(get_download_url $version $os $machine) | ||
|
|
||
| command_exists curl || { | ||
| fmt_error "curl is not installed" | ||
| exit 1 | ||
| } | ||
|
|
||
| command_exists tar || { | ||
| fmt_error "tar is not installed" | ||
| exit 1 | ||
| } | ||
|
|
||
| local tmp_dir=$(get_tmp_dir) | ||
|
|
||
| # Download tar.gz to tmp directory | ||
| echo "Downloading $download_url" | ||
| (cd $tmp_dir && curl -sL -O "$download_url") | ||
|
|
||
| (cd $tmp_dir && do_checksum) | ||
|
|
||
| # Extract download | ||
| (cd $tmp_dir && tar -xzf "$asset_name") | ||
|
|
||
| # Install binary | ||
| if [ -w "$INSTALL_DIR" ]; then | ||
| mv "$tmp_dir/$BINARY_NAME" "$INSTALL_DIR" | ||
| else | ||
| fmt_error "Unable to write to $INSTALL_DIR. Please run this script with sudo or set INSTALL_DIR to a directory you can write to." | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Make the binary executable | ||
| if [ -w "$INSTALL_DIR/$BINARY_NAME" ]; then | ||
| chmod +x "$INSTALL_DIR/$BINARY_NAME" | ||
| else | ||
| sudo chmod +x "$INSTALL_DIR/$BINARY_NAME" 2>/dev/null || { | ||
| fmt_error "Could not make $INSTALL_DIR/$BINARY_NAME executable" | ||
| exit 1 | ||
| } | ||
| fi | ||
|
|
||
| # Check if the binary is executable | ||
| if [ ! -x "$INSTALL_DIR/$BINARY_NAME" ]; then | ||
| fmt_error "The binary is not executable. Please check your permissions." | ||
| exit 1 | ||
| fi | ||
|
|
||
| echo "Installed the OpenFeature cli to $INSTALL_DIR" | ||
|
|
||
|
beeme1mr marked this conversation as resolved.
Resolved
|
||
| # Add to PATH information if not already in PATH | ||
| if ! echo "$PATH" | tr ":" "\n" | grep -q "^$INSTALL_DIR$"; then | ||
| shell_profile="" | ||
| case $SHELL in | ||
| */bash*) | ||
| if [ -f "$HOME/.bashrc" ]; then | ||
| shell_profile="$HOME/.bashrc" | ||
| elif [ -f "$HOME/.bash_profile" ]; then | ||
| shell_profile="$HOME/.bash_profile" | ||
| fi | ||
| ;; | ||
| */zsh*) | ||
| shell_profile="$HOME/.zshrc" | ||
| ;; | ||
| esac | ||
|
|
||
| if [ -n "$shell_profile" ]; then | ||
| echo "" | ||
| echo "${YELLOW}$INSTALL_DIR is not in your PATH.${RESET}" | ||
| echo "To add it to your PATH, run:" | ||
| echo " echo 'export PATH=\"\$PATH:$INSTALL_DIR\"' >> $shell_profile" | ||
| echo "Then, restart your terminal or run:" | ||
| echo " source $shell_profile" | ||
| fi | ||
| fi | ||
|
|
||
| # Cleanup | ||
| rm -rf "$tmp_dir" | ||
| } | ||
|
|
||
| install_termux() { | ||
| echo "Installing the OpenFeature cli, this may take a few minutes..." | ||
| pkg upgrade && pkg install golang git -y && git clone https://github.com/open-feature/cli.git && cd cli/ && go build -o $PREFIX/bin/openfeature | ||
| } | ||
|
|
||
| main() { | ||
| setup_color | ||
|
|
||
| latest_tag=$(get_latest_release $REPO_NAME) | ||
| latest_version=$(echo $latest_tag | sed 's/v//') | ||
| version=${VERSION:-$latest_version} | ||
|
|
||
| os=$(get_os) | ||
| if test -z "$os"; then | ||
| fmt_error "$(uname -s) os type is not supported" | ||
| echo "Please create an issue so we can add support. $ISSUE_URL" | ||
| exit 1 | ||
| fi | ||
|
|
||
| machine=$(get_machine) | ||
| if test -z "$machine"; then | ||
| fmt_error "$(uname -m) machine type is not supported" | ||
| echo "Please create an issue so we can add support. $ISSUE_URL" | ||
| exit 1 | ||
| fi | ||
| if [ ${TERMUX_VERSION} ] ; then | ||
| install_termux | ||
| else | ||
|
beeme1mr marked this conversation as resolved.
Resolved
|
||
| echo "Installing OpenFeature CLI to $INSTALL_DIR..." | ||
| echo "To use a different install location, press Ctrl+C and run again with:" | ||
| echo " INSTALL_DIR=/your/custom/path ./bin/install.sh" | ||
| echo "" | ||
| sleep 2 # Give user a chance to cancel if needed | ||
|
|
||
| do_install_binary | ||
| fi | ||
|
|
||
| printf "$MAGENTA" | ||
| cat <<'EOF' | ||
| ___ _____ _ | ||
| / _ \ _ __ ___ _ __ | ___|__ __ _| |_ _ _ _ __ ___ | ||
| | | | | '_ \ / _ \ '_ \| |_ / _ \/ _` | __| | | | '__/ _ \ | ||
| | |_| | |_) | __/ | | | _| __/ (_| | |_| |_| | | | __/ | ||
| \___/| .__/ \___|_| |_|_| \___|\__,_|\__|\__,_|_| \___| | ||
| |_| | ||
| CLI | ||
|
|
||
| Run `openfeature help` for commands | ||
|
|
||
| EOF | ||
| printf "$RESET" | ||
|
|
||
| } | ||
|
|
||
| main | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.