Skip to content

Commit d472d4e

Browse files
committed
Make installer work on any os/arch
1 parent b58b8fe commit d472d4e

File tree

1 file changed

+120
-121
lines changed

1 file changed

+120
-121
lines changed

install.sh

Lines changed: 120 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
set -eu
33

44
# code-server's automatic install script.
5-
# See https://github.com/cdr/code-server/blob/main/docs/install
5+
# See https://coder.com/docs/code-server/v3.10.2/install
66

77
usage() {
88
arg0="$0"
@@ -14,7 +14,7 @@ usage() {
1414
fi
1515

1616
cath << EOF
17-
Installs code-server for Linux, macOS and FreeBSD.
17+
Installs code-server.
1818
It tries to use the system package manager if possible.
1919
After successful installation it explains how to start using code-server.
2020
@@ -48,24 +48,23 @@ Usage:
4848
--rsh <bin>
4949
Specifies the remote shell for remote installation. Defaults to ssh.
5050
51-
- For Debian, Ubuntu and Raspbian it will install the latest deb package.
52-
- For Fedora, CentOS, RHEL and openSUSE it will install the latest rpm package.
53-
- For Arch Linux it will install the AUR package.
54-
- For any unrecognized Linux operating system it will install the latest standalone
55-
release into ~/.local
51+
The detection method works as follows:
52+
- Debian, Ubuntu, Raspbian: install the deb package from GitHub.
53+
- Fedora, CentOS, RHEL, openSUSE: install the rpm package from GitHub.
54+
- Arch Linux: install from the AUR (which pulls releases from GitHub).
55+
- FreeBSD, Alpine: install from yarn/npm.
56+
- macOS: install using Homebrew if installed otherwise install from GitHub.
57+
- All others: install the release from GitHub.
5658
57-
- For macOS it will install the Homebrew package.
58-
- If Homebrew is not installed it will install the latest standalone release
59-
into ~/.local
59+
We only build releases on GitHub for amd64 and arm64 on Linux and amd64 for
60+
macOS. When the detection method tries to pull a release from GitHub it will
61+
fall back to installing from npm when there is no matching release for the
62+
system's operating system and architecture.
6063
61-
- For FreeBSD or Alpine, it will install the npm package with yarn or npm.
64+
The standalone method will force installion using GitHub releases. It will not
65+
fall back to npm so on architectures without pre-built releases this will error.
6266
63-
- If ran on an architecture with no releases, it will install the
64-
npm package with yarn or npm.
65-
- We only have releases for amd64 and arm64 presently.
66-
- The npm package builds the native modules on postinstall.
67-
68-
It will cache all downloaded assets into ~/.cache/code-server
67+
The installer will cache all downloaded assets into ~/.cache/code-server
6968
7069
More installation docs are at https://coder.com/docs/code-server/v3.10.2/install
7170
EOF
@@ -120,7 +119,6 @@ main() {
120119
DRY_RUN \
121120
METHOD \
122121
STANDALONE_INSTALL_PREFIX \
123-
VERSION \
124122
OPTIONAL \
125123
ALL_FLAGS \
126124
RSH_ARGS \
@@ -198,80 +196,69 @@ main() {
198196
return
199197
fi
200198

201-
VERSION="${VERSION-$(echo_latest_version)}"
202199
METHOD="${METHOD-detect}"
203200
if [ "$METHOD" != detect ] && [ "$METHOD" != standalone ]; then
204201
echoerr "Unknown install method \"$METHOD\""
205202
echoerr "Run with --help to see usage."
206203
exit 1
207204
fi
208-
STANDALONE_INSTALL_PREFIX="${STANDALONE_INSTALL_PREFIX-$HOME/.local}"
209205

210-
OS="$(os)"
211-
if [ ! "$OS" ]; then
212-
echoerr "Unsupported OS $(uname)."
213-
exit 1
214-
fi
206+
# These are used by the various install_* functions that make use of GitHub
207+
# releases in order to download and unpack the right release.
208+
CACHE_DIR=$(echo_cache_dir)
209+
STANDALONE_INSTALL_PREFIX=${STANDALONE_INSTALL_PREFIX:-$HOME/.local}
210+
VERSION=${VERSION:-$(echo_latest_version)}
211+
# These can be overridden for testing but shouldn't normally be used as it can
212+
# result in a broken code-server.
213+
OS=${OS:-$(os)}
214+
ARCH=${ARCH:-$(arch)}
215215

216216
distro_name
217217

218-
ARCH="$(arch)"
219-
if [ ! "$ARCH" ]; then
220-
if [ "$METHOD" = standalone ]; then
221-
echoerr "No precompiled releases for $(uname -m)."
222-
echoerr 'Please rerun without the "--method standalone" flag to install from npm.'
223-
exit 1
224-
fi
225-
echoh "No precompiled releases for $(uname -m)."
226-
install_npm
227-
return
228-
fi
229-
230-
if [ "$OS" = "freebsd" ]; then
231-
if [ "$METHOD" = standalone ]; then
232-
echoerr "No precompiled releases available for $OS."
233-
echoerr 'Please rerun without the "--method standalone" flag to install from npm.'
234-
exit 1
235-
fi
236-
echoh "No precompiled releases available for $OS."
237-
install_npm
238-
return
239-
fi
240-
241-
if [ "$OS" = "linux" ] && [ "$(distro)" = "alpine" ]; then
242-
if [ "$METHOD" = standalone ]; then
243-
echoerr "No precompiled releases available for alpine."
244-
echoerr 'Please rerun without the "--method standalone" flag to install from npm.'
218+
# Standalone installs by pulling pre-built releases from GitHub.
219+
if [ "$METHOD" = standalone ]; then
220+
if has_standalone; then
221+
install_standalone
222+
else
223+
echoerr "There are no standalone releases for $ARCH"
224+
echoerr "Please try again without '--method standalone'"
245225
exit 1
246226
fi
247-
echoh "No precompiled releases available for alpine."
248-
install_npm
249-
return
250227
fi
251228

252-
CACHE_DIR="$(echo_cache_dir)"
253-
254-
if [ "$METHOD" = standalone ]; then
255-
install_standalone
256-
return
257-
fi
229+
# DISTRO can be overridden for testing but shouldn't normally be used as it
230+
# can result in a broken code-server.
231+
DISTRO=${DISTRO:-$(distro)}
258232

259-
case "$(distro)" in
233+
case $DISTRO in
234+
# macOS uses brew when available and falls back to standalone. We only have
235+
# amd64 for macOS so for anything else use npm.
260236
macos)
261-
install_macos
262-
;;
263-
debian)
264-
install_deb
265-
;;
266-
fedora | opensuse)
267-
install_rpm
268-
;;
269-
arch)
270-
install_aur
237+
BREW_PATH="${BREW_PATH-brew}"
238+
if command_exists "$BREW_PATH"; then
239+
install_brew
240+
else
241+
echoh "Homebrew not installed."
242+
echoh "Falling back to standalone installation."
243+
npm_fallback install_standalone
244+
fi
271245
;;
246+
# The .deb and .rpm files are pulled from GitHub and we only have amd64 and
247+
# arm64 there and need to fall back to npm otherwise.
248+
debian) npm_fallback install_deb ;;
249+
fedora | opensuse) npm_fallback install_rpm ;;
250+
# Arch uses the AUR package which only supports amd64 and arm64 since it
251+
# pulls releases from GitHub so we need to fall back to npm.
252+
arch) npm_fallback install_aur ;;
253+
# We don't have GitHub releases that work on Alpine or FreeBSD so we have no
254+
# choice but to use npm here.
255+
alpine | freebsd) install_npm ;;
256+
# For anything else we'll try to install standalone but fall back to npm if
257+
# we don't have releases for the architecture.
272258
*)
273259
echoh "Unsupported package manager."
274-
install_standalone
260+
echoh "Falling back to standalone installation."
261+
npm_fallback install_standalone
275262
;;
276263
esac
277264
}
@@ -326,23 +313,15 @@ fetch() {
326313
sh_c mv "$FILE.incomplete" "$FILE"
327314
}
328315

329-
install_macos() {
330-
if command_exists brew; then
331-
echoh "Installing from Homebrew."
332-
echoh
333-
334-
sh_c brew install code-server
335-
336-
return
337-
fi
338-
339-
echoh "Homebrew not installed."
316+
install_brew() {
317+
echoh "Installing latest from Homebrew."
318+
echoh
340319

341-
install_standalone
320+
sh_c "$BREW_PATH" install code-server
342321
}
343322

344323
install_deb() {
345-
echoh "Installing v$VERSION deb package from GitHub releases."
324+
echoh "Installing v$VERSION of the $ARCH deb package from GitHub."
346325
echoh
347326

348327
fetch "https://github.com/cdr/code-server/releases/download/v$VERSION/code-server_${VERSION}_$ARCH.deb" \
@@ -353,7 +332,7 @@ install_deb() {
353332
}
354333

355334
install_rpm() {
356-
echoh "Installing v$VERSION rpm package from GitHub releases."
335+
echoh "Installing v$VERSION of the $ARCH rpm package from GitHub."
357336
echoh
358337

359338
fetch "https://github.com/cdr/code-server/releases/download/v$VERSION/code-server-$VERSION-$ARCH.rpm" \
@@ -364,7 +343,7 @@ install_rpm() {
364343
}
365344

366345
install_aur() {
367-
echoh "Installing from the AUR."
346+
echoh "Installing latest from the AUR."
368347
echoh
369348

370349
sh_c mkdir -p "$CACHE_DIR/code-server-aur"
@@ -379,7 +358,7 @@ install_aur() {
379358
}
380359

381360
install_standalone() {
382-
echoh "Installing standalone release archive v$VERSION from GitHub releases."
361+
echoh "Installing v$VERSION of the $ARCH release from GitHub."
383362
echoh
384363

385364
fetch "https://github.com/cdr/code-server/releases/download/v$VERSION/code-server-$VERSION-$OS-$ARCH.tar.gz" \
@@ -406,50 +385,74 @@ install_standalone() {
406385
}
407386

408387
install_npm() {
409-
if command_exists yarn; then
388+
echoh "Installing latest from npm."
389+
echoh
390+
391+
YARN_PATH="${YARN_PATH-yarn}"
392+
NPM_PATH="${YARN_PATH-npm}"
393+
if command_exists "$YARN_PATH"; then
410394
sh_c="sh_c"
411-
if [ ! -w "$(yarn global bin)" ]; then
395+
if [ ! "${DRY_RUN-}" ] && [ ! -w "$($YARN_PATH global bin)" ]; then
412396
sh_c="sudo_sh_c"
413397
fi
414398
echoh "Installing with yarn."
415399
echoh
416-
"$sh_c" yarn global add code-server --unsafe-perm
417-
NPM_BIN_DIR="$(yarn global bin)" echo_npm_postinstall
400+
"$sh_c" "$YARN_PATH" global add code-server --unsafe-perm
401+
NPM_BIN_DIR="\$($YARN_PATH global bin)" echo_npm_postinstall
418402
return
419-
elif command_exists npm; then
403+
elif command_exists "$NPM_PATH"; then
420404
sh_c="sh_c"
421-
if [ ! -w "$(npm config get prefix)" ]; then
405+
if [ ! "${DRY_RUN-}" ] && [ ! -w "$(NPM_PATH config get prefix)" ]; then
422406
sh_c="sudo_sh_c"
423407
fi
424408
echoh "Installing with npm."
425409
echoh
426-
"$sh_c" npm install -g code-server --unsafe-perm
427-
NPM_BIN_DIR="$(npm bin -g)" echo_npm_postinstall
410+
"$sh_c" "$NPM_PATH" install -g code-server --unsafe-perm
411+
NPM_BIN_DIR="\$($NPM_PATH bin -g)" echo_npm_postinstall
428412
return
429413
fi
430-
echoh
431414
echoerr "Please install npm or yarn to install code-server!"
432415
echoerr "You will need at least node v12 and a few C dependencies."
433416
echoerr "See the docs https://coder.com/docs/code-server/v3.10.2/install#yarn-npm"
417+
434418
exit 1
435419
}
436420

437-
os() {
438-
case "$(uname)" in
439-
Linux)
440-
echo linux
441-
;;
442-
Darwin)
443-
echo macos
444-
;;
445-
FreeBSD)
446-
echo freebsd
421+
# Run $1 if we have a standalone otherwise run install_npm.
422+
npm_fallback() {
423+
if has_standalone; then
424+
$1
425+
else
426+
echoh "No standalone releases for $ARCH."
427+
echoh "Falling back to installation from npm."
428+
install_npm
429+
fi
430+
}
431+
432+
# Determine if we have standalone releases on GitHub for the system's arch.
433+
has_standalone() {
434+
case $ARCH in
435+
amd64) return 0 ;;
436+
# We only have amd64 for macOS.
437+
arm64)
438+
[ "$(distro)" != macos ]
439+
return
447440
;;
441+
*) return 1 ;;
448442
esac
449443
}
450444

451-
# distro prints the detected operating system including linux distros.
452-
# Also parses ID_LIKE for common distro bases.
445+
os() {
446+
uname="$(uname)"
447+
case $uname in
448+
Linux) echo linux ;;
449+
Darwin) echo macos ;;
450+
FreeBSD) echo freebsd ;;
451+
*) echo "$uname" ;;
452+
esac
453+
}
454+
455+
# Print the detected Linux distro, otherwise print the OS name.
453456
#
454457
# Example outputs:
455458
# - macos -> macos
@@ -486,7 +489,7 @@ distro() {
486489
fi
487490
}
488491

489-
# os_name prints a pretty human readable name for the OS/Distro.
492+
# Print a human-readable name for the OS/distro.
490493
distro_name() {
491494
if [ "$(uname)" = "Darwin" ]; then
492495
echo "macOS v$(sw_vers -productVersion)"
@@ -506,20 +509,16 @@ distro_name() {
506509
}
507510

508511
arch() {
509-
case "$(uname -m)" in
510-
aarch64)
511-
echo arm64
512-
;;
513-
x86_64)
514-
echo amd64
515-
;;
516-
amd64) # FreeBSD.
517-
echo amd64
518-
;;
512+
uname_m=$(uname -m)
513+
case $uname_m in
514+
aarch64) echo arm64 ;;
515+
x86_64) echo amd64 ;;
516+
*) echo "$uname_m" ;;
519517
esac
520518
}
521519

522520
command_exists() {
521+
if [ ! "$1" ]; then return 1 ; fi
523522
command -v "$@" > /dev/null
524523
}
525524

0 commit comments

Comments
 (0)