dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

zsh + virtualenv環境でGoogle Cloud SDKをインストール

ちょっとハマったのでメモ。
zsh + virtualenv という環境だと、インストールするのにちょっと注意が必要みたいです。

1. インストールする

まずは、以下の URL の手順に沿ってコマンドを実行します。

https://cloud.google.com/sdk/

curl https://sdk.cloud.google.com | bash

zsh だけどよくわかんないので | bash はそのままにして実行します。
すると...

Directory to extract under (this will create a directory google-cloud-sdk) (/Users/*****):
tar -C /Users/***** -xvf /var/folders/hq/c40z6hdx2sb23y2gy8jpzh480000gp/T/tmp.XXXXXXXXXX.g0mBaDMo/google-cloud-sdk.tar.gz
x google-cloud-sdk/
x google-cloud-sdk/help/
x google-cloud-sdk/help/text.long/
x google-cloud-sdk/help/text.long/gcloud_components_update
x google-cloud-sdk/help/text.long/gcloud_components_restore

...

/Users/*****/google-cloud-sdk/install.sh
Welcome to the Google Cloud SDK!
Traceback (most recent call last):
  File "/Users/*****/google-cloud-sdk/bin/bootstrapping/install.py", line 8, in <module>
    import bootstrapping
  File "/Users/*****/google-cloud-sdk/bin/bootstrapping/bootstrapping.py", line 9, in <module>
    import setup
  File "/Users/*****/google-cloud-sdk/bin/bootstrapping/setup.py", line 44, in <module>
    from googlecloudsdk.core.util import platforms
  File "/Users/*****/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/util/platforms.py", line 5, in <module>
    import collections
ImportError: No module named collections

あれ、なんかエラー出てとまってしまってますね。。。
ファイルは/Users/*****/ (***** はPC名) にダウンロードされてるので、
/google-cloud-sdk/bin/bootstrapping/install.py を見てみます。

#!/bin/sh
#
# Copyright 2013 Google Inc. All Rights Reserved.
#

echo Welcome to the Google Cloud SDK!

...

"$CLOUDSDK_PYTHON" $CLOUDSDK_PYTHON_ARGS "${CLOUDSDK_ROOT_DIR}/bin/bootstrapping/install.py" "$@"

色々書いてますが、要するに最後の /bin/bootstrapping/install.py を実行していることがわかります。
ので、このスクリプトを直接実行してみます。

~/google-cloud-sdk $ bin/bootstrapping/install.py

The Google Cloud SDK is currently in developer preview. To help improve the
quality of this product, we collect anonymized data on how the SDK is used.
You may choose to opt out of this collection now (by choosing 'N' at the below
prompt), or at any time in the future by running the following command:
    gcloud config set --scope=user disable_usage_reporting true

Do you want to help improve the Google Cloud SDK (Y/n)?  n


This will install all the core command line tools necessary for working with
the Google Cloud Platform.


The following components will be installed:
    -------------------------------------------------------------------------------------------
    | BigQuery Command Line Tool                                        |     2.0.18 | < 1 MB |
    | BigQuery Command Line Tool (Platform Specific)                    |     2.0.18 | < 1 MB |
    | Cloud DNS Admin Command Line Interface                            | 2014.11.06 | < 1 MB |
    | Cloud SDK Core Command Line Tools                                 |          1 |        |
    | Cloud SDK Core Libraries (Platform Specific)                      | 2014.10.20 | < 1 MB |
    | Cloud SQL Admin Command Line Interface                            | 2014.11.18 | < 1 MB |
    | Cloud Storage Command Line Tool                                   |        4.6 | 2.1 MB |
    | Cloud Storage Command Line Tool (Platform Specific)               |        4.6 | < 1 MB |
    | Compute Engine Command Line Interface                             | 2014.11.18 | < 1 MB |
    | Compute Engine Command Line Tool (deprecated)                     |     1.16.5 | < 1 MB |
    | Compute Engine Command Line Tool (deprecated) (Platform Specific) |     1.16.5 | < 1 MB |
    -------------------------------------------------------------------------------------------

Performing in place update...


Installing: BigQuery Command Line Tool ... Done
Installing: BigQuery Command Line Tool (Platform Specific) ... Done
Installing: Cloud DNS Admin Command Line Interface ... Done
Installing: Cloud SDK Core Command Line Tools ... Done
Installing: Cloud SDK Core Libraries (Platform Specific) ... Done
Installing: Cloud SQL Admin Command Line Interface ... Done
Installing: Cloud Storage Command Line Tool ... Done
Installing: Cloud Storage Command Line Tool (Platform Specific) ... Done
Installing: Compute Engine Command Line Interface ... Done
Installing: Compute Engine Command Line Tool (deprecated) ... Done
Installing: Compute Engine Command Line Tool (deprecated) (Platform Specific) ... Done


Done!

The Google Cloud SDK installer will now prompt you to update an rc
file to bring the Google Cloud CLIs into your environment.

Enter path to an rc file to update, or leave blank to use
[/Users/*****/.bash_profile]:  /Users/*****/.zshrc

Modify profile to update your $PATH? (Y/n)?  Y


Modify profile to enable bash completion? (Y/n)?  Y

お、無事終わったっぽい。
途中、Google Cloud SDKCLI のパスを追加するファイルを聞かれるので
.bash_profile でなく、 ~/.zshrc を指定しました。

2. SDK へパスを通す

では、.zshrc を更新します。

~/google-cloud-sdk $ source ~/.zshrc
/Users/*****/google-cloud-sdk/path.bash.inc:3: = not found
/Users/*****/google-cloud-sdk/completion.bash.inc:8: command not found: complete
/Users/*****/google-cloud-sdk/completion.bash.inc:19: parse error near `]]'

うーん、なんかエラーが出てる。。。
.zshrc を見ます。

.zshrc

# The next line updates PATH for the Google Cloud SDK.
source '/Users/*****/google-cloud-sdk/path.bash.inc'

# The next line enables bash completion for gcloud.
source '/Users/*****/google-cloud-sdk/completion.bash.inc'

上が $PATHCLI の場所を追加するためのファイル、
下がシェルコマンド補完のためのファイルのようです。

とりあえずどちらも bash になっている箇所を zsh に変えます。

.zshrc (修正後)

# The next line updates PATH for the Google Cloud SDK.
source '/Users/*****/google-cloud-sdk/path.zsh.inc'

# The next line enables bash completion for gcloud.
source '/Users/*****/google-cloud-sdk/completion.zsh.inc'

もう一度実行。

~/google-cloud-sdk $ source ~/.zshrc
bashcompinit:126: parse error near `|'
/Users/*****/google-cloud-sdk/completion.zsh.inc:11: command not found: complete
/Users/*****/google-cloud-sdk/completion.zsh.inc:46: command not found: complete
/Users/*****/google-cloud-sdk/completion.zsh.inc:47: command not found: complete
/Users/*****/google-cloud-sdk/completion.zsh.inc:48: command not found: complete

CLI へのパスは通ったみたいなんですが、下のコマンド補完の方はエラーが消えません。
で、結局原因がよくわからないのと、このままでも gcloud コマンドは使えるので
下の行は一旦コメントアウトしました。

.zshrc (最終的に...)

# The next line updates PATH for the Google Cloud SDK.
source '/Users/*****/google-cloud-sdk/path.zsh.inc'

# The next line enables bash completion for gcloud.
# source '/Users/*****/google-cloud-sdk/completion.zsh.inc'

この状態で

$ gcloud auth login

を実行し、Google アカウントでログインすると...

f:id:dackdive:20141122152439p:plain

というわけで、無事にインストールできました。


補足その1

zshGoogle Cloud SDK をインストールをする方法についてはこちらの記事を参考にしました。

ただ、現在は path.zsh.inc というファイルは自動で作成されるらしく
.zshrc のパスを変更するだけでうまくいきました。

補足その2

最初の、インストールに失敗したところについて。
こんな Issue がありました。

Google Issue Tracker

これによると、

Basically the problem is that the virtualenv lib directory does not include the argparse module (even though it is a standard library). Normally virtualenv falls back to /usr/lib/python2.7 to find argparse, but we run all our scripts with the -S option to disable all site packages. With this option, virtualenv no longer falls back to /usr/lib/python2.7 (even for standard libraries) and the import fails.

  • virtualenv の lib ディレクトリには標準ライブラリが含まれない
  • が、普通だと /usr/lib/python2.7 にフォールバックするので問題にならない
  • python-S オプションをつけるとこのフォールバックをしないようになるので、結果として No module named ***** エラーになる

といったところでしょうか。

試しに、install.py

which $CLOUDSDK_PYTHON
echo $CLOUDSDK_PYTHON_ARGS
echo $CLOUDSDK_ROOT_DIR
"$CLOUDSDK_PYTHON" $CLOUDSDK_PYTHON_ARGS "${CLOUDSDK_ROOT_DIR}/bin/bootstrapping/install.py" "$@"

それぞれの変数を見てみると、

/Users/*****/.pyenv/shims/python
-S
/Users/*****/google-cloud-sdk

というわけで、virtualenv の python-S オプションをつけて実行していることがわかります。

で、これについてはどうしようもないので、
virtualenv で作成した python を使わず、システムデフォルトの(?)python を使うとうまくいきます。

$ pyenv global 2.7.5
$ curl https://sdk.cloud.google.com | bash

インストールの時だけ切り替えてもいいのかも。