|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +#-------------------------------------------------------# |
| 4 | +## <DO NOT RUN STANDALONE, meant for CI Only> |
| 5 | +## Meant to Install & Setup Go |
| 6 | +###-----------------------------------------------------### |
| 7 | + |
| 8 | +#-------------------------------------------------------# |
| 9 | +##ENV |
| 10 | +set -euo pipefail |
| 11 | +GO_DIR="${HOME}/.go" |
| 12 | +GO_BIN_DIR="${HOME}/go/bin" |
| 13 | +TEMP_DIR="$(mktemp -d)" |
| 14 | +trap 'rm -rf "$TEMP_DIR"' EXIT |
| 15 | +#-------------------------------------------------------# |
| 16 | + |
| 17 | +#-------------------------------------------------------# |
| 18 | +##Architecture |
| 19 | +case "$(uname -m)" in |
| 20 | + aarch64) ARCH="arm64" ;; |
| 21 | + armv6l) ARCH="armv6l" ;; |
| 22 | + armv7l) ARCH="armv6l" ;; |
| 23 | + i?86) ARCH="386" ;; |
| 24 | + ppc64le) ARCH="ppc64le" ;; |
| 25 | + riscv64) ARCH="riscv64" ;; |
| 26 | + s390x) ARCH="s390x" ;; |
| 27 | + x86_64) ARCH="amd64" ;; |
| 28 | + *) echo "[-] Unsupported architecture: $(uname -m)" && exit 1 ;; |
| 29 | +esac |
| 30 | +echo "[+] Installing Go for linux-${ARCH}..." |
| 31 | +#-------------------------------------------------------# |
| 32 | + |
| 33 | +#-------------------------------------------------------# |
| 34 | +##Deps |
| 35 | +for cmd in curl find grep tar; do |
| 36 | + command -v "${cmd}" >/dev/null || { echo "[-] Missing: ${cmd}" && exit 1; } |
| 37 | +done |
| 38 | +#-------------------------------------------------------# |
| 39 | + |
| 40 | +#-------------------------------------------------------# |
| 41 | +##Install |
| 42 | +#Check if Go is already installed and remove it |
| 43 | +if command -v go >/dev/null 2>&1; then |
| 44 | + EXISTING_GO="$(command -v go)" |
| 45 | + EXISTING_GOROOT="$(go env GOROOT 2>/dev/null || echo "")" |
| 46 | + echo "[!] Found existing Go installation at: ${EXISTING_GO}" |
| 47 | + [[ -n "${EXISTING_GOROOT}" ]] && echo "[!] GOROOT: ${EXISTING_GOROOT}" |
| 48 | + |
| 49 | + # Remove from common system locations |
| 50 | + for sys_path in "/usr/local/go" "/usr/go" "/opt/go"; do |
| 51 | + [[ -d "${sys_path}" ]] && { echo "[!] Removing system Go: ${sys_path}" && sudo rm -rf "${sys_path}"; } |
| 52 | + done |
| 53 | + |
| 54 | + # Remove from user locations |
| 55 | + [[ -n "${EXISTING_GOROOT}" && -d "${EXISTING_GOROOT}" && "${EXISTING_GOROOT}" != "${GO_DIR}" ]] && { |
| 56 | + echo "[!] Removing existing GOROOT: ${EXISTING_GOROOT}" |
| 57 | + rm -rf "${EXISTING_GOROOT}" |
| 58 | + } |
| 59 | +fi |
| 60 | +#Clean Existing |
| 61 | +[[ -d "${GO_DIR}" ]] && rm -rf "${GO_DIR}" |
| 62 | +[[ -d "${GO_BIN_DIR}" ]] && rm -rf "${GO_BIN_DIR}" |
| 63 | +#Get Latest Version |
| 64 | +cd "${TEMP_DIR}" |
| 65 | +LATEST_VERSION="$(curl -qfsSL "https://golang.org/VERSION?m=text" | grep -Ev '[0-9]{4}[^0-9]?[0-1][0-9][^0-9]?[0-3][0-9]' | head -1 | tr -d '"'\''[:space:]')" |
| 66 | +[[ -z "${LATEST_VERSION}" || "${LATEST_VERSION}" == "null" ]] && { |
| 67 | + echo "[-] Failed to get latest Go version" && exit 1; |
| 68 | +} |
| 69 | +DOWNLOAD_URL="https://golang.org/dl/${LATEST_VERSION}.linux-${ARCH}.tar.gz" |
| 70 | +echo "[+] Downloading Go ${LATEST_VERSION}..." |
| 71 | +#Download |
| 72 | +for i in {1..3}; do |
| 73 | + curl -w "(DL) <== %{url}\n" -fSL "${DOWNLOAD_URL}" -o "go.tar.gz" && break |
| 74 | + [[ $i -eq 3 ]] && { echo "[-] Download failed" && exit 1; } |
| 75 | + echo "[!] Retry $i/3..." |
| 76 | +done |
| 77 | +#Extract and install |
| 78 | +tar -xzf "go.tar.gz" |
| 79 | +GO_SRC="$(find "." -maxdepth 1 -type d -name "*go*" | head -1)" |
| 80 | +[[ -z "${GO_SRC}" || ! -d "${GO_SRC}" ]] && { echo "[-] Extract failed" && exit 1; } |
| 81 | +mkdir -p "${HOME}" |
| 82 | +mv "${GO_SRC}" "${GO_DIR}" |
| 83 | +#Create GOPATH bin directory |
| 84 | +mkdir -p "${GO_BIN_DIR}" |
| 85 | +#-------------------------------------------------------# |
| 86 | + |
| 87 | +#-------------------------------------------------------# |
| 88 | +##Check |
| 89 | +export GOROOT="${GO_DIR}" |
| 90 | +export GOPATH="${HOME}/go" |
| 91 | +export PATH="${GO_DIR}/bin:${GO_BIN_DIR}:${PATH}" |
| 92 | +hash -r &>/dev/null |
| 93 | +command -v go >/dev/null || { echo "[-] Installation failed" && exit 1; } |
| 94 | +echo "[+] Success! Go version: $(go version)" |
| 95 | +echo "[+] GOROOT: ${GOROOT}" |
| 96 | +echo "[+] GOPATH: ${GOPATH}" |
| 97 | +echo "[|] PATH: export PATH=\"${GO_DIR}/bin:${GO_BIN_DIR}:\${PATH}\"" |
| 98 | +#-------------------------------------------------------# |
0 commit comments