deps: Change npm to yarn for reliablity, security, and speed.

This commit is contained in:
Pweaver (Paul Weaver) 2017-07-27 17:22:52 -04:00 committed by Tim Abbott
parent f444c68b62
commit 1afaa67c7c
15 changed files with 6079 additions and 193 deletions

View File

@ -32,8 +32,9 @@ script:
- unset GEM_PATH - unset GEM_PATH
- mispipe "./tools/travis/$TEST_SUITE" ts - mispipe "./tools/travis/$TEST_SUITE" ts
cache: cache:
- apt: false yarn: true
- directories: apt: false
directories:
- $HOME/zulip-venv-cache - $HOME/zulip-venv-cache
- $HOME/zulip-npm-cache - $HOME/zulip-npm-cache
- $HOME/zulip-emoji-cache - $HOME/zulip-emoji-cache

View File

@ -886,50 +886,23 @@ gigabytes of RAM, which is the minimum Zulip
not, go to your VM settings and increase the RAM, then restart not, go to your VM settings and increase the RAM, then restart
the VM. the VM.
##### npm install errors ##### yarn install warnings
The `tools/provision` script may encounter an error related to `npm install`
that looks something like:
``` ```
==> default: + npm install $ yarn install
==> default: Traceback (most recent call last): yarn install v0.24.5
==> default: File "/srv/zulip/tools/provision", line 195, in <module> [1/4] Resolving packages...
==> default: [2/4] Fetching packages...
==> default: sys.exit(main()) warning fsevents@1.1.1: The platform "linux" is incompatible with this module.
==> default: File "/srv/zulip/tools/provision", line 191, in main info "fsevents@1.1.1" is an optional dependency and failed compatibility check. Excluding it from installation.
==> default: [3/4] Linking dependencies...
==> default: run(["npm", "install"]) [4/4] Building fresh packages...
==> default: File "/srv/zulip/scripts/lib/zulip_tools.py", line 78, in run $ browserify node_modules/sockjs-client/lib/entry.js --standalone SockJS > node_modules/sockjs-client/sockjs.js
==> default: Done in 23.50s.
==> default: raise subprocess.CalledProcessError(rc, args)
==> default: subprocess
==> default: .
==> default: CalledProcessError
==> default: :
==> default: Command '['npm', 'install']' returned non-zero exit status 34
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.
``` ```
Usually this error is not fatal. Try connecting to the development These are warnings produced by spammy third party JavaScript packages.
environment and re-trying the command from withing the virtual It is okay to proceed and start the Zulip server.
machine:
```
christie@win10 ~/zulip
$ vagrant ssh
(zulip-venv)vagrant@vagrant-ubuntu-trusty-64:~
$ cd zulip
(zulip-venv)vagrant@vagrant-ubuntu-trusty-64:~/zulip
$ npm install
npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.12
```
These are just warnings so it is okay to proceed and start the Zulip server.
#### vagrant-lxc errors #### vagrant-lxc errors

View File

@ -46,7 +46,7 @@ should work.
Install the following non-Python dependencies: Install the following non-Python dependencies:
* libffi-dev — needed for some Python extensions * libffi-dev — needed for some Python extensions
* postgresql 9.1 or later — our database (client, server, headers) * postgresql 9.1 or later — our database (client, server, headers)
* nodejs 0.10 (and npm) * nodejs 0.10 (and yarn)
* memcached (and headers) * memcached (and headers)
* rabbitmq-server * rabbitmq-server
* libldap2-dev * libldap2-dev
@ -69,7 +69,7 @@ sudo apt-get install closure-compiler libfreetype6-dev libffi-dev \
memcached rabbitmq-server libldap2-dev redis-server \ memcached rabbitmq-server libldap2-dev redis-server \
postgresql-server-dev-all libmemcached-dev python-dev \ postgresql-server-dev-all libmemcached-dev python-dev \
python3-dev python-virtualenv hunspell-en-us nodejs \ python3-dev python-virtualenv hunspell-en-us nodejs \
nodejs-legacy npm git yui-compressor puppet gettext postgresql nodejs-legacy git yui-compressor puppet gettext postgresql
# If using Ubuntu, install PGroonga from its PPA # If using Ubuntu, install PGroonga from its PPA
sudo add-apt-repository -ys ppa:groonga/ppa sudo add-apt-repository -ys ppa:groonga/ppa
@ -128,7 +128,7 @@ sudo apt-get update
sudo apt-get install closure-compiler libfreetype6-dev libffi-dev \ sudo apt-get install closure-compiler libfreetype6-dev libffi-dev \
memcached rabbitmq-server libldap2-dev redis-server \ memcached rabbitmq-server libldap2-dev redis-server \
postgresql-server-dev-all libmemcached-dev python-dev \ postgresql-server-dev-all libmemcached-dev python-dev \
hunspell-en-us nodejs nodejs-legacy npm git yui-compressor \ hunspell-en-us nodejs nodejs-legacy git yui-compressor \
puppet gettext tsearch-extras puppet gettext tsearch-extras
``` ```
@ -146,7 +146,7 @@ https://github.com/zulip/zulip.git`
sudo dnf install libffi-devel memcached rabbitmq-server \ sudo dnf install libffi-devel memcached rabbitmq-server \
openldap-devel python-devel redis postgresql-server \ openldap-devel python-devel redis postgresql-server \
postgresql-devel postgresql libmemcached-devel freetype-devel \ postgresql-devel postgresql libmemcached-devel freetype-devel \
nodejs npm yuicompressor closure-compiler gettext nodejs yuicompressor closure-compiler gettext
``` ```
Now continue with the [Common to Fedora/CentOS](#common-to-fedora-centos-instructions) instructions below. Now continue with the [Common to Fedora/CentOS](#common-to-fedora-centos-instructions) instructions below.
@ -324,7 +324,7 @@ Now run these commands:
``` ```
sudo ./scripts/lib/install-node sudo ./scripts/lib/install-node
npm install yarn install
./tools/install-mypy ./tools/install-mypy
sudo mkdir /srv/zulip-emoji-cache sudo mkdir /srv/zulip-emoji-cache
sudo chown -R `whoami`:`whoami` /srv/zulip-emoji-cache sudo chown -R `whoami`:`whoami` /srv/zulip-emoji-cache
@ -364,10 +364,10 @@ proxy in the environment as follows:
export http_proxy=http://proxy_host:port export http_proxy=http://proxy_host:port
``` ```
- And set the npm proxy and https-proxy using: - And set the yarn proxy and https-proxy using:
``` ```
npm config set proxy http://proxy_host:port yarn config set proxy http://proxy_host:port
npm config set https-proxy http://proxy_host:port yarn config set https-proxy http://proxy_host:port
``` ```
## Using Docker (experimental) ## Using Docker (experimental)

View File

@ -61,7 +61,7 @@ templating systems.
* `static/third/` Third-party JavaScript and CSS that has been vendored. * `static/third/` Third-party JavaScript and CSS that has been vendored.
* `node_modules/` Third-party JavaScript installed via `npm`. * `node_modules/` Third-party JavaScript installed via `yarn`.
* `static/assets/` For assets not to be served to the web (e.g. the system to * `static/assets/` For assets not to be served to the web (e.g. the system to
generate our favicons). generate our favicons).

View File

@ -23,11 +23,11 @@ To add a static file to the app (JavaScript, CSS, images, etc), first
add it to the appropriate place under `static/`. add it to the appropriate place under `static/`.
- Third-party files that we haven't patched should be installed via - Third-party files that we haven't patched should be installed via
`npm`, so that it's easy to upgrade them and third-party code `yarn`, so that it's easy to upgrade them and third-party code
doesn't bloat the Zulip repository. You can then access them in doesn't bloat the Zulip repository. You can then access them in
`webpack.assets.json` via their paths under `node_modules`. `webpack.assets.json` via their paths under `node_modules`.
You'll want to add these to the `package.json` in the root of the You'll want to add these to the `package.json` in the root of the
repository, and then provision (to have `npm` download them) before repository, and then provision (to have `yarn` download them) before
continuing. Your commit should also update `PROVISION_VERSION` in continuing. Your commit should also update `PROVISION_VERSION` in
`version.py`. When adding modules to `package.json`, please pin `version.py`. When adding modules to `package.json`, please pin
specific versions of them (don't using carets `^`, tildes `~`, etc). specific versions of them (don't using carets `^`, tildes `~`, etc).

View File

@ -1460,6 +1460,19 @@ $ tools/clean-branches --reviews
Deleting local branch review-original-5156 (was 5a1e982) Deleting local branch review-original-5156 (was 5a1e982)
``` ```
### Merge conflict on yarn.lock file
If there is a merge conflict on yarn.lock, yarn.lock, yarn should be run to
regenerate the file. *Important* don't delete the yarn.lock file. Checkout the
latest one from origin/master so that yarn knows the previous asset versions.
Run the following commands
```
git checkout origin/master -- yarn.lock
yarn install
git add yarn.lock
git rebase --continue
```
[gitbook-rebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing [gitbook-rebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing
[gitbook-git-rebase]: https://git-scm.com/docs/git-rebase [gitbook-git-rebase]: https://git-scm.com/docs/git-rebase

View File

@ -9,7 +9,6 @@ class zulip::static_asset_compiler {
$closure_compiler_package, $closure_compiler_package,
"nodejs", "nodejs",
"nodejs-legacy", "nodejs-legacy",
"npm",
"yui-compressor", "yui-compressor",
# Used by makemessages i18n # Used by makemessages i18n
"gettext", "gettext",

View File

@ -1,25 +1,26 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
ZULIP_PATH=$(dirname "$0") ZULIP_PATH="$(dirname "$0")/../.."
node_version=6.6.0 ZULIP_SRV="/srv"
npm_version=3.10.3 if [ "$TRAVIS" ] ; then
ZULIP_SRV="/home/travis"
current_npm_version="none"
if hash npm 2>/dev/null; then
current_npm_version="$(npm --version)"
fi fi
YARN_BIN="$ZULIP_SRV/zulip-yarn/bin/yarn"
node_version=6.6.0
yarn_version=0.27.5
current_node_version="none" current_node_version="none"
if hash node 2>/dev/null; then if hash node 2>/dev/null; then
current_node_version="$(node --version)" current_node_version="$(node --version)"
fi fi
if [ "$current_npm_version" = "$npm_version" ] && [ "$current_node_version" = "v$node_version" ]; then if [ "$($YARN_BIN --version 2>/dev/null)" = "$yarn_version" ] && [ "$current_node_version" = "v$node_version" ]; then
echo "Node version $node_version and npm version $npm_version are already installed." echo "Node version $node_version and yarn version $yarn_version are already installed."
exit 0 exit 0
fi fi
if true; then if [ "$current_node_version" != "v$node_version" ]; then
export NVM_DIR=/usr/local/nvm export NVM_DIR=/usr/local/nvm
if ! [ -e "$NVM_DIR/nvm.sh" ]; then if ! [ -e "$NVM_DIR/nvm.sh" ]; then
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh | bash wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh | bash
@ -28,7 +29,6 @@ if true; then
source "$NVM_DIR/nvm.sh" source "$NVM_DIR/nvm.sh"
nvm install "$node_version" && nvm alias default "$node_version" nvm install "$node_version" && nvm alias default "$node_version"
export NODE_BIN="$(nvm which default)" export NODE_BIN="$(nvm which default)"
export NPM_BIN=$(echo "$NODE_BIN" | sed 's/node$/npm/')
# Fix messed-up uid=500 and group write bits produced by nvm # Fix messed-up uid=500 and group write bits produced by nvm
n=$(which node) n=$(which node)
@ -36,9 +36,10 @@ if true; then
chown -R root:root "$n" chown -R root:root "$n"
chmod -R go-w "$n" chmod -R go-w "$n"
# Install node and npm wrappers to /usr/local/bin # Install node wrapper to /usr/local/bin
cp "$ZULIP_PATH/../../scripts/setup/node-wrapper" /usr/local/bin/node cp "$ZULIP_PATH/scripts/setup/node-wrapper" /usr/local/bin/node
sed -i "s|NODE_PATH|$NODE_BIN|" /usr/local/bin/node sed -i "s|NODE_PATH|$NODE_BIN|" /usr/local/bin/node
cp "$ZULIP_PATH/../../scripts/setup/npm-wrapper" /usr/local/bin/npm
sed -i "s|NPM_PATH|$NPM_BIN|" /usr/local/bin/npm
fi fi
# Install yarn if not installed
bash "$ZULIP_PATH/scripts/lib/third/install-yarn.sh" "$ZULIP_SRV" --version "$yarn_version"

View File

@ -10,41 +10,49 @@ if False:
from scripts.lib.zulip_tools import subprocess_text_output, run from scripts.lib.zulip_tools import subprocess_text_output, run
ZULIP_PATH = dirname(dirname(dirname(abspath(__file__)))) ZULIP_PATH = dirname(dirname(dirname(abspath(__file__))))
NODE_MODULES_CACHE_PATH = "/srv/zulip-npm-cache" ZULIP_SRV_PATH = "/srv"
if 'TRAVIS' in os.environ: if 'TRAVIS' in os.environ:
# In Travis CI, we don't have root access # In Travis CI, we don't have root access
NODE_MODULES_CACHE_PATH = "/home/travis/zulip-npm-cache" ZULIP_SRV_PATH = "/home/travis"
def generate_sha1sum_node_modules(npm_args=None):
NODE_MODULES_CACHE_PATH = os.path.join(ZULIP_SRV_PATH, 'zulip-npm-cache')
YARN_BIN = os.path.join(ZULIP_SRV_PATH, 'zulip-yarn/bin/yarn')
def generate_sha1sum_node_modules(yarn_args=None):
# type: (Optional[List[str]]) -> str # type: (Optional[List[str]]) -> str
sha1sum = hashlib.sha1() sha1sum = hashlib.sha1()
sha1sum.update(subprocess_text_output(['cat', 'package.json']).encode('utf8')) sha1sum.update(subprocess_text_output(['cat', 'package.json']).encode('utf8'))
sha1sum.update(subprocess_text_output(['npm', '--version']).encode('utf8')) sha1sum.update(subprocess_text_output(['cat', 'yarn.lock']).encode('utf8'))
sha1sum.update(subprocess_text_output([YARN_BIN, '--version']).encode('utf8'))
sha1sum.update(subprocess_text_output(['node', '--version']).encode('utf8')) sha1sum.update(subprocess_text_output(['node', '--version']).encode('utf8'))
if npm_args is not None: if yarn_args is not None:
sha1sum.update(''.join(sorted(npm_args)).encode('utf8')) sha1sum.update(''.join(sorted(yarn_args)).encode('utf8'))
return sha1sum.hexdigest() return sha1sum.hexdigest()
def setup_node_modules(production=False, stdout=None, stderr=None, copy_modules=False): def setup_node_modules(production=False, stdout=None, stderr=None, copy_modules=False,
# type: (bool, Optional[IO], Optional[IO], bool) -> None prefer_offline=False):
# type: (bool, Optional[IO], Optional[IO], bool, bool) -> None
if production: if production:
npm_args = ["--production"] yarn_args = ["--prod"]
else: else:
npm_args = [] yarn_args = []
sha1sum = generate_sha1sum_node_modules(npm_args) if prefer_offline:
yarn_args.append("--prefer-offline")
sha1sum = generate_sha1sum_node_modules(yarn_args)
target_path = os.path.join(NODE_MODULES_CACHE_PATH, sha1sum) target_path = os.path.join(NODE_MODULES_CACHE_PATH, sha1sum)
cached_node_modules = os.path.join(target_path, 'node_modules') cached_node_modules = os.path.join(target_path, 'node_modules')
success_stamp = os.path.join(target_path, '.success-stamp') success_stamp = os.path.join(target_path, '.success-stamp')
# Check if a cached version already exists # Check if a cached version already exists
if not os.path.exists(success_stamp): if not os.path.exists(success_stamp):
do_npm_install(target_path, do_yarn_install(target_path,
npm_args, yarn_args,
success_stamp, success_stamp,
stdout=stdout, stdout=stdout,
stderr=stderr, stderr=stderr,
copy_modules=copy_modules) copy_modules=copy_modules)
print("Using cached node modules from %s" % (cached_node_modules,)) print("Using cached node modules from %s" % (cached_node_modules,))
cmds = [ cmds = [
@ -54,13 +62,12 @@ def setup_node_modules(production=False, stdout=None, stderr=None, copy_modules=
for cmd in cmds: for cmd in cmds:
run(cmd, stdout=stdout, stderr=stderr) run(cmd, stdout=stdout, stderr=stderr)
def do_npm_install(target_path, npm_args, success_stamp, stdout=None, stderr=None, def do_yarn_install(target_path, yarn_args, success_stamp, stdout=None, stderr=None,
copy_modules=False): copy_modules=False):
# type: (str, List[str], str, Optional[IO], Optional[IO], bool) -> None # type: (str, List[str], str, Optional[IO], Optional[IO], bool) -> None
cmds = [ cmds = [
["rm", "-rf", target_path],
['mkdir', '-p', target_path], ['mkdir', '-p', target_path],
['cp', 'package.json', target_path], ['cp', 'package.json', "yarn.lock", target_path],
] ]
cached_node_modules = os.path.join(target_path, 'node_modules') cached_node_modules = os.path.join(target_path, 'node_modules')
if copy_modules: if copy_modules:
@ -68,7 +75,13 @@ def do_npm_install(target_path, npm_args, success_stamp, stdout=None, stderr=Non
cmds.append(["cp", "-rT", "prod-static/serve/node_modules", cached_node_modules]) cmds.append(["cp", "-rT", "prod-static/serve/node_modules", cached_node_modules])
else: else:
print("Cached version not found! Installing node modules.") print("Cached version not found! Installing node modules.")
cmds.append(['npm', 'install'] + npm_args + ['--prefix', target_path])
# Copy the existing node_modules to speed up install
if os.path.exists("node_modules"):
cmds.append(["cp", "-R", "node_modules/", cached_node_modules])
cd_exec = os.path.join(ZULIP_PATH, "scripts/lib/cd_exec")
cmds.append([cd_exec, target_path, YARN_BIN, "install", "--non-interactive"] +
yarn_args)
cmds.append(['touch', success_stamp]) cmds.append(['touch', success_stamp])
for cmd in cmds: for cmd in cmds:

View File

@ -1,16 +1,27 @@
#!/bin/sh #!/bin/sh
set -e set -e
#####################
# install-yarn.sh was patched to install yarn in a custom directory.
# The following changes were made:
# * yarn_link now just simlinks to /usr/bin
# * yarn_detect_profile was removed
# * Paths were changed to variables declared at the top
# * Most of the non error coloration was removed to not distract during installs.
# #######################
reset="\033[0m" reset="\033[0m"
red="\033[31m" red="\033[31m"
green="\033[32m"
yellow="\033[33m" yellow="\033[33m"
cyan="\033[36m"
white="\033[37m"
gpg_key=9D41F3C3 gpg_key=9D41F3C3
ZULIP_ROOT="$1"
YARN_DIR_NAME="zulip-yarn"
YARN_DIR="$ZULIP_ROOT/$YARN_DIR_NAME"
YARN_BIN="$YARN_DIR/bin/yarn"
yarn_get_tarball() { yarn_get_tarball() {
printf "$cyan> Downloading tarball...$reset\n" printf "Downloading tarball...\n"
if [ "$1" = '--nightly' ]; then if [ "$1" = '--nightly' ]; then
url=https://nightly.yarnpkg.com/latest.tar.gz url=https://nightly.yarnpkg.com/latest.tar.gz
elif [ "$1" = '--rc' ]; then elif [ "$1" = '--rc' ]; then
@ -32,9 +43,9 @@ yarn_get_tarball() {
if curl --fail -L -o "$tarball_tmp#1" "$url{,.asc}"; then if curl --fail -L -o "$tarball_tmp#1" "$url{,.asc}"; then
yarn_verify_integrity $tarball_tmp yarn_verify_integrity $tarball_tmp
printf "$cyan> Extracting to ~/.yarn...$reset\n" printf "Extracting to $YARN_DIR...\n"
mkdir .yarn mkdir "$YARN_DIR_NAME"
tar zxf $tarball_tmp -C .yarn --strip 1 # extract tarball tar zxf $tarball_tmp -C "$YARN_DIR_NAME" --strip 1 # extract tarball
rm $tarball_tmp* rm $tarball_tmp*
else else
printf "$red> Failed to download $url.$reset\n" printf "$red> Failed to download $url.$reset\n"
@ -51,11 +62,11 @@ yarn_verify_integrity() {
fi fi
if [ "$YARN_GPG" == "no" ]; then if [ "$YARN_GPG" == "no" ]; then
printf "$cyan> WARNING: Skipping GPG integrity check!$reset\n" printf "WARNING: Skipping GPG integrity check!\n"
return return
fi fi
printf "$cyan> Verifying integrity...$reset\n" printf "Verifying integrity...\n"
# Grab the public key if it doesn't already exist # Grab the public key if it doesn't already exist
gpg --list-keys $gpg_key >/dev/null 2>&1 || (curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --import) gpg --list-keys $gpg_key >/dev/null 2>&1 || (curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --import)
@ -67,7 +78,7 @@ yarn_verify_integrity() {
# Actually perform the verification # Actually perform the verification
if gpg --verify "$1.asc" $1; then if gpg --verify "$1.asc" $1; then
printf "$green> GPG signature looks good$reset\n" printf "GPG signature looks good\n"
else else
printf "$red> GPG signature for this Yarn release is invalid! This is BAD and may mean the release has been tampered with. It is strongly recommended that you report this to the Yarn developers.$reset\n" printf "$red> GPG signature for this Yarn release is invalid! This is BAD and may mean the release has been tampered with. It is strongly recommended that you report this to the Yarn developers.$reset\n"
yarn_verify_or_quit "> Do you really want to continue?" yarn_verify_or_quit "> Do you really want to continue?"
@ -75,90 +86,28 @@ yarn_verify_integrity() {
} }
yarn_link() { yarn_link() {
printf "$cyan> Adding to \$PATH...$reset\n" printf "Adding to /usr/bin\n"
YARN_PROFILE="$(yarn_detect_profile)"
SOURCE_STR="\nexport PATH=\"\$HOME/.yarn/bin:\$PATH\"\n"
if [ -z "${YARN_PROFILE-}" ] ; then version=`$YARN_BIN --version` || (
printf "$red> Profile not found. Tried ${YARN_PROFILE} (as defined in \$PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.\n" printf "$red> Yarn was installed, but doesn't seem to be working :(.$reset\n"
echo "> Create one of them and run this script again" exit 1;
echo "> Create it (touch ${YARN_PROFILE}) and run this script again" )
echo " OR"
printf "> Append the following lines to the correct file yourself:$reset\n"
command printf "${SOURCE_STR}"
else
if ! grep -q 'yarn' "$YARN_PROFILE"; then
if [[ $YARN_PROFILE == *"fish"* ]]; then
command fish -c 'set -U fish_user_paths $fish_user_paths ~/.yarn/bin'
else
command printf "$SOURCE_STR" >> "$YARN_PROFILE"
fi
fi
printf "$cyan> We've added the following to your $YARN_PROFILE\n" ln -nsf "$YARN_BIN" /usr/bin/yarn
echo "> If this isn't the profile of your current shell then please add the following to your correct profile:"
printf " $SOURCE_STR$reset\n"
version=`$HOME/.yarn/bin/yarn --version` || ( printf "Successfully installed Yarn $version!\n"
printf "$red> Yarn was installed, but doesn't seem to be working :(.$reset\n"
exit 1;
)
printf "$green> Successfully installed Yarn $version! Please open another terminal where the \`yarn\` command will now be available.$reset\n"
fi
} }
yarn_detect_profile() {
if [ -n "${PROFILE}" ] && [ -f "${PROFILE}" ]; then
echo "${PROFILE}"
return
fi
local DETECTED_PROFILE
DETECTED_PROFILE=''
local SHELLTYPE
SHELLTYPE="$(basename "/$SHELL")"
if [ "$SHELLTYPE" = "bash" ]; then
if [ -f "$HOME/.bashrc" ]; then
DETECTED_PROFILE="$HOME/.bashrc"
elif [ -f "$HOME/.bash_profile" ]; then
DETECTED_PROFILE="$HOME/.bash_profile"
fi
elif [ "$SHELLTYPE" = "zsh" ]; then
DETECTED_PROFILE="$HOME/.zshrc"
elif [ "$SHELLTYPE" = "fish" ]; then
DETECTED_PROFILE="$HOME/.config/fish/config.fish"
fi
if [ -z "$DETECTED_PROFILE" ]; then
if [ -f "$HOME/.profile" ]; then
DETECTED_PROFILE="$HOME/.profile"
elif [ -f "$HOME/.bashrc" ]; then
DETECTED_PROFILE="$HOME/.bashrc"
elif [ -f "$HOME/.bash_profile" ]; then
DETECTED_PROFILE="$HOME/.bash_profile"
elif [ -f "$HOME/.zshrc" ]; then
DETECTED_PROFILE="$HOME/.zshrc"
elif [ -f "$HOME/.config/fish/config.fish" ]; then
DETECTED_PROFILE="$HOME/.config/fish/config.fish"
fi
fi
if [ ! -z "$DETECTED_PROFILE" ]; then
echo "$DETECTED_PROFILE"
fi
}
yarn_reset() { yarn_reset() {
unset -f yarn_install yarn_reset yarn_get_tarball yarn_link yarn_detect_profile yarn_verify_integrity yarn_verify_or_quit unset -f yarn_install yarn_reset yarn_get_tarball yarn_link yarn_verify_integrity yarn_verify_or_quit
} }
yarn_install() { yarn_install() {
printf "${white}Installing Yarn!$reset\n" printf "Installing Yarn!\n"
if [ -d "$HOME/.yarn" ]; then if [ -d "$YARN_DIR" ]; then
if [ -e "$HOME/.yarn/bin/yarn" ] ; then if [ -e "$YARN_BIN" ] ; then
local latest_url local latest_url
local specified_version local specified_version
local version_type local version_type
@ -178,17 +127,17 @@ yarn_install() {
specified_version=`curl -sS $latest_url` specified_version=`curl -sS $latest_url`
version_type='latest' version_type='latest'
fi fi
yarn_version=`$HOME/.yarn/bin/yarn -V` yarn_version=`$YARN_BIN -V`
yarn_alt_version=`$HOME/.yarn/bin/yarn --version` yarn_alt_version=`$YARN_BIN --version`
if [ "$specified_version" = "$yarn_version" -o "$specified_version" = "$yarn_alt_version" ]; then if [ "$specified_version" = "$yarn_version" -o "$specified_version" = "$yarn_alt_version" ]; then
printf "Yarn is already at the $specified_version version.\n" printf "Yarn is already at the $specified_version version.\n"
exit 0 exit 0
else else
rm -rf "$HOME/.yarn" rm -rf "$YARN_DIR"
fi fi
else else
printf "$red> $HOME/.yarn already exists, possibly from a past Yarn install.$reset\n" printf "$red> $YARN_DIR already exists, possibly from a past Yarn install.$reset\n"
printf "$red> Remove it (rm -rf $HOME/.yarn) and run this script again.$reset\n" printf "$red> Remove it (rm -rf $YARN_DIR) and run this script again.$reset\n"
exit 0 exit 0
fi fi
fi fi
@ -208,5 +157,5 @@ yarn_verify_or_quit() {
fi fi
} }
cd ~ cd $ZULIP_ROOT
yarn_install $1 $2 yarn_install $2 $3

View File

@ -1,2 +0,0 @@
#!/bin/bash
NPM_PATH "$@"

View File

@ -12,16 +12,18 @@ NODE_MODULES_CACHE_PATH = "/srv/zulip-npm-cache"
if "--travis" in sys.argv: if "--travis" in sys.argv:
NODE_MODULES_CACHE_PATH = os.path.join(os.environ["HOME"], "zulip-npm-cache") NODE_MODULES_CACHE_PATH = os.path.join(os.environ["HOME"], "zulip-npm-cache")
try: try:
subprocess.check_output(['npm', '--version']) subprocess.check_output([os.path.join(NODE_MODULES_CACHE_PATH, "yarn/bin/yarn"), '--version'])
except OSError: except OSError:
print('NPM not found. Most probably we are running static-analysis and ' print('yarn not found. Most probably we are running static-analysis and '
'hence npm is not installed. Exiting without cleaning npm cache.') 'hence yarn is not installed. Exiting without cleaning npm cache.')
sys.exit(0) sys.exit(0)
sha1sum = generate_sha1sum_node_modules() sha1sum = generate_sha1sum_node_modules()
current_cache_dir_base = os.path.join(NODE_MODULES_CACHE_PATH, sha1sum) current_cache_dir_base = os.path.join(NODE_MODULES_CACHE_PATH, sha1sum)
current_success_stamp = os.path.join(current_cache_dir_base, '.success-stamp') current_success_stamp = os.path.join(current_cache_dir_base, '.success-stamp')
print("Current cache stamp at %s" % (current_success_stamp,))
for cache_dir_base in os.listdir(NODE_MODULES_CACHE_PATH): for cache_dir_base in os.listdir(NODE_MODULES_CACHE_PATH):
node_modules_dir = os.path.join(NODE_MODULES_CACHE_PATH, cache_dir_base) node_modules_dir = os.path.join(NODE_MODULES_CACHE_PATH, cache_dir_base)
if node_modules_dir == current_cache_dir_base and os.path.exists(current_success_stamp): if node_modules_dir == current_cache_dir_base and os.path.exists(current_success_stamp):

View File

@ -192,7 +192,7 @@ def install_apt_deps():
def main(options): def main(options):
# type: (Any) -> int # type: (Any) -> int
# npm install and management commands expect to be run from the root of the # yarn and management commands expect to be run from the root of the
# project. # project.
os.chdir(ZULIP_PATH) os.chdir(ZULIP_PATH)
@ -226,11 +226,11 @@ def main(options):
else: else:
print("No need to apt operations.") print("No need to apt operations.")
# Here we install nvm, node, and npm. # Here we install node.
run(["sudo", "scripts/lib/install-node"]) run(["sudo", "scripts/lib/install-node"])
# Install NPM packages before running other scripts so that if a script # This is a wrapper around `yarn`, which we run last since
# requires any NPM package it can use it. # it can often fail due to network issues beyond our control.
try: try:
# Hack: We remove `node_modules` as root to work around an # Hack: We remove `node_modules` as root to work around an
# issue with the symlinks being improperly owned by root. # issue with the symlinks being improperly owned by root.
@ -239,9 +239,9 @@ def main(options):
if not os.path.isdir(NODE_MODULES_CACHE_PATH): if not os.path.isdir(NODE_MODULES_CACHE_PATH):
run(["sudo", "mkdir", NODE_MODULES_CACHE_PATH]) run(["sudo", "mkdir", NODE_MODULES_CACHE_PATH])
run(["sudo", "chown", "%s:%s" % (user_id, user_id), NODE_MODULES_CACHE_PATH]) run(["sudo", "chown", "%s:%s" % (user_id, user_id), NODE_MODULES_CACHE_PATH])
setup_node_modules() setup_node_modules(prefer_offline=True)
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
print(WARNING + "`npm install` failed; retrying..." + ENDC) print(WARNING + "`yarn install` failed; retrying..." + ENDC)
setup_node_modules() setup_node_modules()
# Import tools/setup_venv.py instead of running it so that we get an # Import tools/setup_venv.py instead of running it so that we get an

View File

@ -1,2 +1,2 @@
ZULIP_VERSION = "1.6.0+git" ZULIP_VERSION = "1.6.0+git"
PROVISION_VERSION = '6.1' PROVISION_VERSION = '7.0'

5937
yarn.lock Normal file

File diff suppressed because it is too large Load Diff