読者です 読者をやめる 読者になる 読者になる

kei0425tan’s blog

技術的なことを主に

nodejsで自作別リポジトリ(gitlab/github)をモジュール化して利用するには?デプロイ編

昨日こんな記事を書きました。

kei0425tan.hatenablog.com

開発時は確かにこれで問題なかったのですが、いざ、デプロイしようとするといろいろと問題が発生しました。

現状の整理

現在、趣味のサイトを作成しており、docker imageを作成してそれをコンテナで実行して公開しています。手順は以下になります。

  1. 修正完了後、gitlabにpushする。
  2. gitlab ciで自動的にdocker imageを作成し、hub.dockerにpush
  3. ホストで、docker imageをpull
  4. ホストで、コンテナを再起動

docker imageの作成では、以下を行っています。

  1. ベースイメージは、node:7-alpineを利用
  2. 必要なファイルの追加
  3. npm initの実行
  4. その他環境変数やCMDの設定など

このnpm initで落とし穴がありました。
昨日の記事のように、npm でgitリポジトリを利用すると、内部で、gitコマンドが呼び出されます。
しかし、node:7-alpineにはgitコマンドがインストールされてないため、エラーが発生しimageの作成ができませんでした。

対応案

docker buildでgitを利用できるようにする

まず普通に思いつくのがこれ。
しかし、以下の問題点があります。

  • 実行環境に不必要なコマンド(git)をインストールする必要がある。
  • プライベートリポジトリなため、認証が必要になる。秘密鍵をimageに入れる必要がある。

特に、秘密鍵を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/モジュール名」などがよいかと思います。

npm install
% npm install local/モジュール名 --save

リポジトリの代わりにローカルファイルを指定します。

デプロイ時、新規クローン時

git cloneで取り出すと、submoduleが空っぽになります。
なので、–-recursiveを指定してください。

gitlab ciの場合には、以下の変数を定義すればよいです。

variables:
  GIT_SUBMODULE_STRATEGY: recursive

docs.gitlab.com

この辺は日本語の情報みつかりませんでした。

モジュール側を修正する場合

ファイルを修正後、package.jsonのversionを変更します。
その後、利用側で、以下を実行します。

% git submodule foreach git pull origin master
% rm -rf node_modules
% npm install

gitのsubmoduleは最初に設定したバージョンに固定されます。
なので、pullし直すように指定する必要があります。

npmもローカルファイルの変更は見てくれないようです。
全て削除して全て読み直すのが確実かと。


開発とデプロイでブランチを分けて、開発するときは、npmにリポジトリを指定するのもありかもしれません。

参考にしたサイト

ありがとうございます!

www.d-wood.com
qiita.com