nodejsで自作別リポジトリ(gitlab/github)をモジュール化して利用するには?デプロイ編
昨日こんな記事を書きました。
開発時は確かにこれで問題なかったのですが、いざ、デプロイしようとするといろいろと問題が発生しました。
現状の整理
現在、趣味のサイトを作成しており、docker imageを作成してそれをコンテナで実行して公開しています。手順は以下になります。
- 修正完了後、gitlabにpushする。
- gitlab ciで自動的にdocker imageを作成し、hub.dockerにpush
- ホストで、docker imageをpull
- ホストで、コンテナを再起動
docker imageの作成では、以下を行っています。
- ベースイメージは、node:7-alpineを利用
- 必要なファイルの追加
- npm initの実行
- その他環境変数やCMDの設定など
このnpm initで落とし穴がありました。
昨日の記事のように、npm でgitリポジトリを利用すると、内部で、gitコマンドが呼び出されます。
しかし、node:7-alpineにはgitコマンドがインストールされてないため、エラーが発生しimageの作成ができませんでした。
対応案
docker buildでgitを利用できるようにする
まず普通に思いつくのがこれ。
しかし、以下の問題点があります。
特に、秘密鍵をimageにいれるのは、docker imageをhub.dockerで公開してしまっているため、かなりリスキー。避けたいところ。
なので、この方法は却下
もし、読み込むモジュールがpublicに公開されているものであれば、これもありかも。
gitlab ci実行中に、必要なモジュールをリポジトリからクローン
こちらも試してみました。
しかし、gitlab ciを実行するイメージのdocker:lastestにもgitコマンドがインストールされていません。
なので、ここでも先ほどと同じ問題(gitのインストール、秘密鍵)がでてきます。
こちらは、build環境のため、セキュリティ的な意味では問題は少ないのですが、gitをわざわざbuildの度にインストールする必要があるのでいまいちです。
ただし、docker:lastestにgitをインストールし、秘密鍵も格納したbuild用のイメージを作成すればまあまあなんとかなりそうな気はします。
git submoduleを利用
gitにはリポジトリを入れ子にできる仕組みがあります。
これを利用することにより、build時にgitコマンドを実行したり、認証に気を付ける必要がなくなります。
ただし、事前にファイルとしてimageに追加しないと、npm initできません。
まあ、多少のゴミ?ができてもそこまで気にする必要はないかと思いますので、今回はこちらを採用します。
git submoduleでのモジュールの読み方
モジュール側の設定
前回とまったく同じです。
利用側の設定
git submoduleの設定
リポジトリのホストが同じ場合には、以下のコマンドを実行します。
ホストが同じため、認証が不要になります。
% git submodule add ../リポジトリ名.git ローカルパス
もし、ホストが異なる場合には、addの後ろはcloneする場合と同じように記述します。
ローカルパスは分かりやすいように、「local/モジュール名」などがよいかと思います。
デプロイ時、新規クローン時
git cloneで取り出すと、submoduleが空っぽになります。
なので、–-recursiveを指定してください。
gitlab ciの場合には、以下の変数を定義すればよいです。
variables: GIT_SUBMODULE_STRATEGY: recursive
この辺は日本語の情報みつかりませんでした。
モジュール側を修正する場合
ファイルを修正後、package.jsonのversionを変更します。
その後、利用側で、以下を実行します。
% git submodule foreach git pull origin master % rm -rf node_modules % npm install
gitのsubmoduleは最初に設定したバージョンに固定されます。
なので、pullし直すように指定する必要があります。
npmもローカルファイルの変更は見てくれないようです。
全て削除して全て読み直すのが確実かと。
開発とデプロイでブランチを分けて、開発するときは、npmにリポジトリを指定するのもありかもしれません。