diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eacec0d7..45aeb75f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,11 @@ name: Build and Release -on: [push, pull_request, workflow_dispatch] +on: + workflow_dispatch: + push: + branches: [main] + tags: + - "v*.*.*" jobs: build: @@ -39,19 +44,15 @@ jobs: if [[ "${RUNNER_OS}" == "Windows" ]]; then binary_extension=".exe" fi - binary_path="metaboss-${{ matrix.os }}${binary_extension}" + if [[ "${RUNNER_OS}" == "macOS" ]]; then + binary_path="metaboss-macos-intel-latest${binary_extension}" + else + binary_path="metaboss-${{ matrix.os }}${binary_extension}" + fi mv "target/release/metaboss${binary_extension}" "${binary_path}" echo "::set-output name=binary_path::${binary_path}" - strip "${binary_path}" - - name: Publish Artifacts - if: "!startsWith(github.ref, 'refs/tags/')" - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.os }} - path: ${{ steps.build.outputs.binary_path }} - - name: Release Tags uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100644 index 00000000..d88ed583 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,184 @@ +#!/bin/bash +# +# Metaboss CLI binary installation script +# ------------------------------------ +# +# Shamelessly borrowed from Sugar CLI: [https://github.com/metaplex-foundation/sugar/blob/main/script/sugar-install.sh] +# The purpose of this script is to automate the download and installation +# of the Metaboss binary. +# +# The script does a (simple) platform detection, downloads the binary +# for the detected platform and copies it to a folder in the PATH variable. +# +# Currently the supported platforms are Windows, macOS, Linux, or another Unix-like OS +# running variations of the sh Unix shells. +# + +RED() { echo $'\e[1;31m'$1$'\e[0m'; } +GRN() { echo $'\e[1;32m'$1$'\e[0m'; } +CYN() { echo $'\e[1;36m'$1$'\e[0m'; } + +abort_on_error() { + if [ ! $1 -eq 0 ]; then + RED "Aborting: operation failed" + exit 1 + fi +} + +CYN "Metaboss CLI binary installation script" +echo "---------------------------------------" +echo "" + +OS_FLAVOUR="$(uname -s)" +PROCESSOR="$(uname -m)" + +# we need to check whether we are running on an ARM +# architecture or not + +case "$PROCESSOR" in + arm* | aarch* | ppc* ) + if [ "$OS_FLAVOUR" != Darwin ]; then + echo "Binary for $PROCESSOR architecture is not currently supported. Please follow the instructions at:" + echo " => $(CYN https://github.com/samuelvanderwaal/metaboss)" + echo "" + echo "to build Metaboss from the source code." + exit 1 + fi + ;; + + *) + # good to go + ;; +esac + +BIN="metaboss" +VERSION="metaboss-ubuntu-latest" + +if [ "$OS_FLAVOUR" = Darwin ]; then + case "$PROCESSOR" in + arm* ) + VERSION="metaboss-macos-m1-latest" + ;; + *) + VERSION="metaboss-macos-intel-latest" + ;; + esac +fi + +DIST="$VERSION" + +# creates a temporary directory to save the distribution file +SOURCE="$(mktemp -d)" + +echo "$(CYN "1.") 🖥 $(CYN "Downloading distribution")" +echo "" + +# downloads the distribution file +REMOTE="https://github.com/samuelvanderwaal/metaboss/releases/latest/download/" +curl -L $REMOTE$BIN"-"$DIST --output "$SOURCE/$DIST" +abort_on_error $? + +SIZE=$(wc -c "$SOURCE/$DIST" | grep -oE "[0-9]+" | head -n 1) + +if [ $SIZE -eq 0 ]; then + RED "Aborting: could not download Metaboss distribution" + exit 1 +fi + +# makes sure the binary will be executable +chmod u+x "$SOURCE/$DIST" +abort_on_error $? + +echo "" +echo "$(CYN "2.") 📤 $(CYN "Moving binary into place")" +echo "" + +if [ ! "$(command -v $BIN)" = "" ]; then + # binary already found on system, ask if we should + # replace it + EXISTING="$(which $BIN)" + + echo "Metaboss binary was found at:" + echo " => $(CYN $EXISTING)" + echo "" + echo -n "$(CYN "Replace it? [Y/n]") (default 'n'): " + read REPLACE + + if [ -z "REPLACE" ]; then + REPLACE="n" + fi + + if [ "$REPLACE" = Y ]; then + echo "" + echo "'$BIN' binary will be moved to '$(dirname "$EXISTING")'." + + mv "$SOURCE/$DIST" "$EXISTING" + abort_on_error $? + else + # nothing else to do, replacement was cancelled + RED "Aborting: replacement cancelled" + exit 1 + fi +else + # determines a suitable directory for the binary - preference: + # 1) ~/.cargo/bin if exists + # 2) ~/bin otherwise + TARGET="$HOME/.cargo/bin" + + if [ ! -d "$TARGET" ]; then + TARGET="$HOME/bin" + + if [ ! -d "$TARGET" ]; then + mkdir $TARGET + fi + fi + + echo "'$BIN' binary will be moved to '$TARGET'." + + mv "$SOURCE/$DIST" "$TARGET/$BIN" + abort_on_error $? + + if [ "$(command -v $BIN)" = "" ]; then + ENV_FILE="$HOME/.$(basename $SHELL)rc" + + if [ -f "$ENV_FILE" ]; then + echo " => adding '$TARGET' to 'PATH' variable in '$ENV_FILE'" + echo "export PATH=\"$HOME/bin:\$PATH\"" >> "$ENV_FILE" + else + echo " => adding '$TARGET' to 'PATH' variable to execute 'metaboss' from any directory." + echo " - file '$(CYN $ENV_FILE)' was not found" + echo "" + echo -n "$(CYN "Would you like to create '$ENV_FILE'? [Y/n]") (default 'n'): " + read CREATE + + if [ -z "REPLACE" ]; then + CREATE="n" + fi + + if [ "$CREATE" = Y ]; then + echo " => adding '$TARGET' to 'PATH' variable in '$ENV_FILE'" + echo "export PATH=\"$HOME/bin:\$PATH\"" >> "$ENV_FILE" + else + echo "" + echo " $(RED "[File creation cancelled]")" + echo "" + echo " - to manually add '$TARGET' to 'PATH' you will need to:" + echo "" + echo " 1. create a file named '$(basename $ENV_FILE)' in your directory '$(dirname $ENV_FILE)'" + echo " 2. add the following line to the file:" + echo "" + echo " export PATH=\"$HOME/bin:\$PATH\"" + fi + fi + fi +fi + +echo "" +# sanity check +if [ "$(command -v $BIN)" = "" ]; then + # installation was completed, but Metaboss is not in the PATH + echo "✅ $(GRN "Installation complete:") restart your shell to update 'PATH' variable or type '$TARGET/$BIN' to start using it." +else + # success + echo "✅ $(GRN "Installation successful:") type '$BIN' to start using it." +fi \ No newline at end of file