Skip to content

Commit

Permalink
Install Script (#1558)
Browse files Browse the repository at this point in the history
* Install Script

Signed-off-by: Chigozie Nri <chigozie@gmail.com>

* Move install.sh out of tools

Signed-off-by: Chigozie Nri <chigozie@gmail.com>

* Revert "Move install.sh out of tools"

This reverts commit 311ea58.

Signed-off-by: Chigozie Nri <chigozie@gmail.com>

* Apply suggestions from code review

Co-authored-by: chigozienri <chigozie@gmail.com>
Signed-off-by: Mattt <mattt@me.com>

* Update URL to cog.run/install

Signed-off-by: Mattt <mattt@me.com>

* Update README

Signed-off-by: Mattt Zmuda <mattt@replicate.com>

---------

Signed-off-by: Chigozie Nri <chigozie@gmail.com>
Signed-off-by: Mattt <mattt@me.com>
Signed-off-by: Mattt Zmuda <mattt@replicate.com>
Co-authored-by: Mattt <mattt@replicate.com>
  • Loading branch information
chigozienri and mattt authored Jun 20, 2024
1 parent 641543e commit e326946
Show file tree
Hide file tree
Showing 2 changed files with 208 additions and 9 deletions.
25 changes: 16 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,20 @@ If you're using macOS, you can install Cog using Homebrew:
brew install cog
```

You can also download and install the latest release of Cog
directly from GitHub by running the following commands in a terminal:
You can also download and install the latest release using our
[install script](https://cog.run/install):

```
# via curl
curl -fsSL https://cog.run/install | sh
# or via wget:
wget -qO- https://cog.run/install | sh
# or via fetch:
fetch -o - https://cog.run/install | sh
```

You can manually install the latest release of Cog directly from GitHub
by running the following commands in a terminal:

```console
sudo curl -o /usr/local/bin/cog -L "https://github.com/replicate/cog/releases/latest/download/cog_$(uname -s)_$(uname -m)"
Expand All @@ -138,19 +150,14 @@ sudo make install

## Upgrade

If you previously installed Cog from a GitHub Releases URL, you can upgrade to the latest version by running the same commands you used to install it:

```console
sudo curl -o /usr/local/bin/cog -L "https://github.com/replicate/cog/releases/latest/download/cog_$(uname -s)_$(uname -m)"
sudo chmod +x /usr/local/bin/cog
```

If you're using macOS and you previously installed Cog with Homebrew, run the following:

```console
brew upgrade cog
```

Otherwise, you can upgrade to the latest version by running the same commands you used to install it.

## Next steps

- [Get started with an example model](docs/getting-started.md)
Expand Down
192 changes: 192 additions & 0 deletions tools/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
#!/bin/sh
#
# This script should be run via curl:
# sh -c "$(curl -fsSL https://raw.githubusercontent.com/replicate/cog/main/tools/install.sh)"
# or via wget:
# sh -c "$(wget -qO- https://raw.githubusercontent.com/replicate/cog/main/tools/install.sh)"
# or via fetch:
# sh -c "$(fetch -o - https://raw.githubusercontent.com/replicate/cog/main/tools/install.sh)"
#
# As an alternative, you can first download the install script and run it afterwards:
# wget https://raw.githubusercontent.com/replicate/cog/main/tools/install.sh
# sh install.sh
#
# You can tweak the install location by setting the INSTALL_DIR env var when running the script.
# INSTALL_DIR=~/my/custom/install/location sh install.sh
#
# By default, cog will be installed at /usr/local/bin/cog


# This install script is based on that of ohmyzsh[1], which is licensed under the MIT License
# [1] https://github.com/ohmyzsh/ohmyzsh/blob/master/tools/install.sh
# MIT License

# Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors)

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
set -e


command_exists() {
command -v "$@" >/dev/null 2>&1
}

user_can_sudo() {
# Check if sudo is installed
command_exists sudo || return 1
# Termux can't run sudo, so we can detect it and exit the function early.
case "$PREFIX" in
*com.termux*) return 1 ;;
esac
# The following command has 3 parts:
#
# 1. Run `sudo` with `-v`. Does the following:
# • with privilege: asks for a password immediately.
# • without privilege: exits with error code 1 and prints the message:
# Sorry, user <username> may not run sudo on <hostname>
#
# 2. Pass `-n` to `sudo` to tell it to not ask for a password. If the
# password is not required, the command will finish with exit code 0.
# If one is required, sudo will exit with error code 1 and print the
# message:
# sudo: a password is required
#
# 3. Check for the words "may not run sudo" in the output to really tell
# whether the user has privileges or not. For that we have to make sure
# to run `sudo` in the default locale (with `LANG=`) so that the message
# stays consistent regardless of the user's locale.
#
! LANG= sudo -n -v 2>&1 | grep -q "may not run sudo"
}

check_docker() {
if ! command_exists docker; then
echo "Docker is not installed on your system. Please install Docker before proceeding."
exit 1
fi

if ! docker run hello-world >/dev/null 2>&1; then
echo "Docker engine is not running, or docker cannot be run without sudo. Please setup Docker so that your user has permission to run it: https://docs.docker.com/engine/install/linux-postinstall/"
exit 1
fi
}

setup_cog() {
COG_LOCATION="${INSTALL_DIR}/cog"
BINARY_URI="https://github.com/replicate/cog/releases/latest/download/cog_$(uname -s)_$(uname -m)"
if [ -f "$COG_LOCATION" ]; then
echo "A file already exists at $COG_LOCATION"
echo "Do you want to delete this file and continue with this installation anyway?"
read -p "Delete file? (y/N): " choice
case "$choice" in
y|Y ) echo "Deleting existing file and continuing with installation..."; sudo rm $COG_LOCATION;;
* ) echo "Exiting installation."; exit 1;;
esac
fi
if command_exists curl; then
sudo curl -o $COG_LOCATION -L $BINARY_URI
elif command_exists wget; then
sudo wget $BINARY_URI -O $COG_LOCATION
elif command_exists fetch; then
sudo fetch -o $COG_LOCATION $BINARY_URI
else
echo "One of curl, wget, or fetch must be present for this installer to work."
exit 1
fi
if [ "$(cat $COG_LOCATION)" = "Not Found" ]; then
echo "Error: Cog binary not found at ${BINARY_URI}. Check releases to see if a binary is available for your system."
rm $COG_LOCATION
exit 1
fi

sudo chmod +x $COG_LOCATION

SHELL_NAME=$(basename "$SHELL")
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
echo "Adding $INSTALL_DIR to PATH in .$SHELL_NAME"rc
echo "" >> ~/.$SHELL_NAME"rc"
echo "# Created by \`cog\` install script on $(date)" >> ~/.$SHELL_NAME"rc"
echo "export PATH=\$PATH:$INSTALL_DIR" >> ~/.$SHELL_NAME"rc"
source ~/.$SHELL_NAME"rc"

echo "You may need to open a new terminal window to run cog for the first time."
fi

echo
}


print_success() {
echo "Successfully installed cog. Run \`cog login\` to configure Replicate access"
}

main() {

# Check if OS X
if [ "$(uname -s)" = "Darwin" ]; then
echo "On OS X, it is recommended to install cog using Homebrew instead:"
echo \`brew install cog\`
echo "Do you want to continue with this installation anyway?"

read -p "Continue? (y/N): " choice
case "$choice" in
y|Y ) echo "Continuing with installation...";;
* ) echo "Exiting installation."; exit 1;;
esac
fi

# Set install directory
read -p "Install location? [/usr/local/bin]: " INSTALL_DIR
if [ ! -d "$INSTALL_DIR" ]; then
echo "The directory $INSTALL_DIR does not exist. Please create it and re-run this script."
# Ask user to manually create directory rather than making it for them,
# so they don't just type in "y" again and accidentally install at ./y
exit 1
fi
# Expand abbreviations in INSTALL_DIR
INSTALL_DIR=$(cd "$INSTALL_DIR"; pwd)

# Check if `cog` command already exists
if command_exists cog; then
echo "A cog command already exists on your system at the following location: $(which cog)".
echo "The installations may interfere with one another."
echo "Do you want to continue with this installation anyway?"
read -p "Continue? (y/N): " choice
case "$choice" in
y|Y ) echo "Continuing with installation...";;
* ) echo "Exiting installation."; exit 1;;
esac
fi
if ! user_can_sudo; then
echo "You need sudo permissions to run this install script. Please try again as a sudoer."
exit 1
fi

check_docker
setup_cog

if command_exists cog; then
print_success
else
echo 'Error: cog not installed.'
exit 1
fi
}

main "$@"

0 comments on commit e326946

Please sign in to comment.