Skip to content

投稿

UbuntuでNode.jsを使用した継続的インテグレーションのセットアップ

2015年8月15日 • 19 分で読める

UbuntuでNode.jsを使用した継続的インテグレーションのセットアップ

このガイドを皆さんにお届けするために、血と汗と涙を流しました。デスバレーの灼熱の熱に耐え、マッキンリー山の頂上に登りました。多くの犠牲を払いました。

このポストで共有されているコンテンツの多くは、私のオリジナル作品ではありません。可能な限り、元の作品へのリンクを張っています。

この記事は、Linuxの基本的な操作ができることを前提としています。

本番環境でUbuntu上でNode.jsアプリケーションをホストおよび管理するための包括的なガイドを見つけることができませんでした。このテーマに関する複数の記事をまとめました。この記事の終わりまでに、独自のUbuntuサーバーをセットアップし、継続的インテグレーションサーバーを介してNode.jsをデプロイできるようになることを願っています。

環境

Windows上のTeamCityを使用しており、GitHubからのコードをAWSでホストされているUbuntuにデプロイしています。

テクノロジー

この記事では、以下のテクノロジーを使用しました:

  • AWS上のUbuntu 14.04
  • Plink 0.64
  • TeamCity 9.1
  • GitHub
  • Nginx 1.9.3

Ubuntuのセットアップ

ここでは詳しく説明しません。Amazon Web Services(AWS)はこれを非常に簡単にしてくれます。どこにあるか、または独自のサーバー上にあるかは関係ありません。

いくつかの落とし穴に遭遇しました。まず、ポート80が開いていることを確認してください。ポート80を閉じた状態で接続しようとした愚かな間違いを犯しました。自分の間違いに気づいたとき、私はサイのお尻のような気分でした。

ソースからNode.jsをインストール

Node.jsはGoogleのV8 JavaScriptエンジンを使用するサーバーテクノロジーです。2010年のリリース以来、広く普及しています。

以下の指示は、もともとDigital Ocean投稿から来ています。

apt-getからNode.jsをインストールするオプションは常にありますが、数バージョン遅れています。最新のビットを取得するには、ソースからNode.jsをインストールしてください。

このセクションの終わりに、最新の安定版Node.js(この記事の時点で)をダウンロードし、ソースをビルドしてNode.jsをインストールします。

サーバーにログインします。パッケージリストを更新することから始めます。

sudo apt-get update

すべてのパッケージをアップグレードすることもお勧めします。これはNode.jsには必要ありませんが、サーバーを最新の状態に保つことは良い習慣です。

sudo apt-get upgrade

サーバーは完全に最新です。ソースをダウンロードする時間です。

cd ~

執筆時点では、12.7がNode.jsの最新の安定版リリースです。最新バージョンについてはnodejs.orgをチェックしてください。

wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz

ダウンロードしたアーカイブを抽出します。

tar xvf node-v*

新しく作成されたディレクトリに移動します

cd node-v*

Node.jsを構成およびビルドします。

./configure

make

Node.jsをインストール

sudo make install

ダウンロードおよび抽出されたファイルを削除するには。もちろん、これはオプションです。

cd ~

rm -rf node-v*

おめでとうございます!Node.jsがインストールされました!そして、それはそれほど難しくありませんでした。

Nginxのセットアップ

ソース

Node.jsはWebサーバーとして機能できますが、世界に公開したいものではありません。産業用で堅牢で機能豊富なWebサーバーがこのタスクに適しています。このタスクのためにNginxを使用することにしました。

これは必要な機能を備えた成熟したWebサーバーです。複数のNode.jsインスタンスを実行するには、ポートフォワーディングが必要になります。

複数のNode.jsインスタンスが同時に実行されている必要があるのはなぜかと思っているかもしれません。それは公正な質問です…私のシナリオでは、1つのサーバーがあり、同じマシン上でDEV、QA、PRODを実行する必要があります。ええ、理想的ではないことは知っていますが、環境ごとに3つのサーバーを立ち上げたくありません。

まずNginxをインストールしましょう

sudo -s

add-apt-repository ppa:nginx/stable

apt-get update 

apt-get install nginx

Nginxが正常にインストールされたら、ドメインをセットアップする必要があります。各サイトを独自のドメイン/サブドメインに配置したいと仮定します。そうでなく、異なるサブフォルダを使用したい場合は、それが可能で非常に簡単です。ここではそのシナリオをカバーしていません。それを行う方法についての膨大なドキュメントがあります。異なるドメインとポートフォワーディングを対応するNode.jsインスタンスに設定することについてのドキュメントはほとんどありません。これが私がカバーするものです。

Nginxがインストールされたので、/etc/nginx/sites-available/にyourdomain.comのファイルを作成します

sudo nano /etc/nginx/sites-available/yourdomain.com

新しく作成したファイルに次の構成を追加します

# the IP(s) on which your node server is running. I chose port 9001.
upstream app_myapp1 {
    server 127.0.0.1:9001;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    server_name yourdomain.com;
    access_log /var/log/nginx/yourdomain.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://app_myapp1;

    }
 }

「yourdomain.com」を実際のドメインに置き換えてください。エディタを保存して終了します。

sites-enabledディレクトリにこのファイルへのシンボリックリンクを作成します。

cd /etc/nginx/sites-enabled/ 

ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

すべてが正しく機能していることをテストするために、シンプルなノードアプリを作成して/var/www/yourdomain.com/app.jsに保存して実行します。

手元にない場合は、シンプルなnodejsアプリです。

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');}).listen(9001, "127.0.0.1");
console.log('Server running at http://127.0.0.1:9001/');

Nginxを再起動しましょう。

sudo /etc/init.d/nginx restart

まだ起動していない場合は、Node.jsインスタンスを起動することを忘れないでください。

cd /var/www/yourdomain/ && node app.js

すべてが正しく機能している場合、yourdomain.comに移動すると「Hello World」が表示されます。

別のNode.jsインスタンスに別のドメインを追加するには、上記の手順を繰り返す必要があります。具体的には、新しいNginx設定ファイルでアップストリーム名、ポート、ドメインを変更する必要があります。proxy_passアドレスはnginx設定ファイルのアップストリーム名と一致する必要があります。アップストリーム名とproxy_pass値を見ると、意味がわかります。

要約すると、ソースからNodeJSをインストールし、Nginxのインストールを完了しました。Nginxとnode.jsでポートフォワーディングを構成およびテストしました

PM2のインストール

「PM2とは何ですか?」と思っているかもしれません。最初に聞いたときは私もそう思いました。PM2はNode.jsアプリケーション用のプロセスマネージャーです。Node.jsにはそれほど多くは付属していません。これはその魅力の一部です。欠点は、その前にレイヤーを提供する必要があるということです。PM2はそれらのレイヤーの1つです。

PM2はNode.jsプロセスのライフサイクルを管理します。終了すると、PM2がそれを再起動します。サーバーが再起動されると、PM2はすべてのNode.jsプロセスを再起動します。また、広範な開発ライフサイクルプロセスもあります。PM2のこの側面はカバーしていません。よく書かれたドキュメントを読むことをお勧めします。

ターミナルにログインしていると仮定して、NPM経由でPM2をインストールすることから始めます。Npmはnode.jsパッケージマネージャー(npm)です。Node.jsをインストールしたときにインストールされました。

sudo npm install pm2 -g

それだけです。PM2がインストールされました。

PM2の使用

PM2は使いやすいです。

PM2のハローワールドはシンプルです。

pm2 start hello.js

これにより、アプリケーションがPM2のプロセスリストに追加されます。このリストは、アプリケーションが起動されるたびに出力されます。

この例では、2つのNode.jsアプリケーションが実行されています。1つはapi.devと呼ばれ、もう1つはapi.preと呼ばれています。

PM2は自動的にアプリの名前をリストの「App name」に割り当てます。

すぐに使える状態では、PM2はサーバーの再起動時に起動するように構成されていません。コマンドはLinuxのさまざまなフレーバーで異なります。Ubuntuで実行しているので、Ubuntuコマンドを実行します。

pm2 start ubuntu

まだ完全には終わっていません。PM2バイナリへのパスを追加する必要があります。幸いなことに、前のコマンドの出力はそれを行う方法を教えてくれます。

出力:

[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
Run the command that was generated (similar to the highlighted output above) to set PM2 up to start on boot (use the command from your own output):

 sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy

その他のPM2の使用例(オプション)

アプリ名でアプリケーションを停止

pm2 stop example

アプリ名で再起動

pm2 restart example

PM2で管理されている現在のアプリケーションのリスト

pm2 list

プロセスを開始するときに名前を指定します。呼び出すと、PM2はJavaScriptファイルを名前として使用します。これはあなたにとって機能しないかもしれません。名前を指定する方法は次のとおりです。

pm2 start www.js --name api.pre

これでPM2を使い始めるのに十分なはずです。PM2の機能の詳細については、GitHubリポジトリにアクセスしてください。

Plinkのセットアップと使用

おそらく「Betsey’s cowの名前で、Plinkとは何ですか?」と思っているでしょう。少なくともそれは思いました。私はまだそれについてどう思うかわかりません。私はそのようなものを見たことがありません。

映画Wall-eを見たことがありますか?Wall-eはスプーク(スプーンとフォークの組み合わせ)を取り出します。最初に彼はそれをフォークに入れようとしますが、それは修正されず、次に彼はそれをスプーンに入れようとしますが、それは合いません。それがPlinkです。Putty(SSH)とWindowsコマンドラインの間のクロスです。

Plinkは基本的に、Windowsコマンドラインからbashコマンドを実行しながらLinux(おそらくUnix)シェルにログインできます。

Plinkをダウンロードすることから始めます。それは単なる実行可能ファイルです。C:/Program Files (x86)/Plinkに配置することをお勧めします。後で参照する必要があります。

AWSでUbuntuインスタンスを実行している場合。Puttyの証明書がすでにセットアップされています(Puttyを使用していると仮定しています)。

そうでない場合は、AWSでUbuntu互換のssh証明書があることを確認する必要があります。

AWSを使用していない場合は、コマンドラインでユーザー名とパスワードを指定でき、ssh証明書について心配する必要はありません。

Plinkを使用してUbuntuに接続するコマンドラインの例を次に示します。

"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" 

これは先走っているかもしれませんが、Ubuntuサーバー上でsshスクリプトを実行するには、Plinkコマンドの最後に完全なパスを追加します。

"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" /var/www/deploy-dev-ui.sh

そして、親愛なる読者よ、それがPlinkです。

NODE_ENVの理解

NODE_ENVはexpressjsで人気のある環境変数です。node.jsインスタンスを開始する前に、NODE_ENVを環境に設定します。コードでは、環境に基づいて特定のファイルをロードできます。

Setting NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD

環境変数は、process.env.NODE_ENVを使用してNode.jsインスタンス内で取得されます。

var environment = process.env.NODE_ENV

またはexpressjsで

app.get('env')

*注:app.get('env')はデフォルトで「development」です。

すべてをまとめる

NodejsPM2NginxPlinkがインストールされ、うまくいくことを願っています。これらすべてのピースを継続的インテグレーションソリューションにまとめる必要があります。

GitHubリポジトリを/var/www/yourdomain.comにクローンします。SSHはHTTPSより安全ですが、HTTPSを使用することをお勧めします。これは理想的ではないことは知っていますが、PlinkをGitHubでUbuntuで機能させることができませんでした。詳しく説明しないでも、PlinkとGitHub SSH証明書形式は異なり、PlinkからSSH経由でGitHubを呼び出すことは機能しませんでした。問題を解決できたら教えてください!

GitHubプルをハンズフリーにするには、ユーザー名とパスワードをオリジンURLの一部にする必要があります。

オリジンURLを設定する方法は次のとおりです。もちろん、適切な場所に情報を代入する必要があります。

git remote set-url origin  https://username:password@github.com/username/yourdomain.git

リポジトリをクローンします。

cd /var/www/yourdomain.com
git clone https://username:password@github.com/username/yourdomain.git .

このディレクトリが隠しファイルを含めて完全に空でない場合、Gitはこのディレクトリにリポジトリをクローンしません。

ディレクトリ内の隠しファイルを見つけるには、このコマンドを実行します

ls -a

接着剤として、シェルスクリプトを使用しています。これは私のスクリプトのコピーです。

#!/bin/bash

echo "> Current PM2 Apps"
pm2 list

echo "> Stopping running API"
pm2 stop api.dev

echo "> Set Environment variable."
export NODE_ENV=DEV

echo "> Changing directory to dev.momentz.com."
cd /var/www/yourdomain.com

echo "> Listing the contents of the directory."
ls -a

echo "> Remove untracked directories in addition to untracked files."
git clean -f -d

echo "> Pull updates from Github."
git pull

echo "> Install npm updates."
sudo npm install

echo "> Transpile the ECMAScript 2015 code"
gulp babel

echo "> Restart the API"
pm2 start transpiled/www.js --name api.dev

echo "> List folder directories"
ls -a

echo "> All done."

このシェルスクリプトはTeamCityで起動しますが、何でも起動できます。

生のコマンドは次のとおりです。

"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" /var/www/deploy-yourdomain.sh
exit
>&2

それだけです。

終わりに

このプロセスにはいくつかの粗い部分があります…時間をかけてそれらの部分を磨きたいと思っています。提案がある場合は、コメントに残してください。

このドキュメントは私のGitHubリポジトリにあります。テクノロジーは変わるので、エラーが見つかった場合は更新してください。その後、このポストを更新します。

Author: Chuck Conway is an AI Engineer with nearly 30 years of software engineering experience. He builds practical AI systems—content pipelines, infrastructure agents, and tools that solve real problems—and shares what he’s learning along the way. Connect with him on social media: X (@chuckconway) or visit him on YouTube and on SubStack.

著者: Chuck Conwayは、ソフトウェアエンジニアリングの経験が30年近くあるAIエンジニアです。彼は実用的なAIシステム(コンテンツパイプライン、インフラストラクチャエージェント、実際の問題を解決するツール)を構築し、学んだことを共有しています。ソーシャルメディアで彼とつながってください: X (@chuckconway) または YouTubeSubStack で彼を訪問してください。

↑ トップに戻る

こちらもおすすめ