チュートリアル: Jenkins と Azure DevOps Services を使用して Linux 仮想マシンにデプロイする
継続的インテグレーション (CI) と継続的デプロイ (CD) は、コードのビルド、リリース、デプロイに使用できるパイプラインを生成します。 Azure DevOps Services には、Azure へのデプロイに使用できる機能が一式そろった CI/CD 自動化ツールが用意されています。 Jenkins は、よく使われているサードパーティの CI/CD サーバーベースのツールであり、CI/CD 自動化機能も備えています。 Azure DevOps Services と Jenkins を一緒に使用して、クラウド アプリまたはサービスの提供方法をカスタマイズできます。
このチュートリアルでは、Jenkins を使用して Node.js Web アプリをビルドします。 次に、Azure DevOps を使用して、
Linux 仮想マシン (VM) を含む配置グループにアプリをデプロイします。 学習内容は次のとおりです。
- サンプル アプリを入手する。
- Jenkins プラグインを構成する。
- Node.js の Jenkins フリースタイル プロジェクトを構成する。
- Azure DevOps Services との統合のために Jenkins を構成する。
- Jenkins サービス エンドポイントを作成する。
- Azure 仮想マシンのデプロイ グループを作成する。
- Azure Pipelines のリリース パイプラインを作成する。
- 手動デプロイおよび CI によってトリガーされるデプロイを実行する。
前提条件
Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料の Azure アカウントを作成してください。
Jenkins サーバー: Jenkins サーバーがインストールされていない場合は、Azure に Jenkins サーバーを作成します。
Note
詳細については、Azure DevOps Services への接続に関する記事をご覧ください。
デプロイ ターゲットの Linux 仮想マシンが必要です。 詳細については、「Azure CLI を使用した Linux VM の作成と管理」をご覧ください。
仮想マシンの受信ポート 80 を開きます。 詳細については、「Azure Portal を使用したネットワーク セキュリティ グループの作成」をご覧ください。
サンプル アプリを入手する
デプロイするアプリを Git リポジトリに格納する必要があります。 このチュートリアルでは、GitHub で入手できるこのサンプル アプリを使用することをお勧めします。 このチュートリアルには、Node.js のインストールに使用するサンプル スクリプトとアプリケーションが含まれています。 独自のリポジトリで作業する場合は、同様のサンプルを構成する必要があります。
このアプリのフォークを作成し、このチュートリアルの後の手順で使用できるように場所 (URL) のメモを取ります。 詳細については、「Fork a repo (リポジトリのフォーク)」を参照してください。
Note
アプリは Yeoman でビルドされました。 Express、bower、および Grunt を使用します。 また、依存関係として複数の npm パッケージを保持しています。 このサンプルには、Nginx を設定し、アプリを配置するスクリプトも含まれています。 これは仮想マシンで実行します。 スクリプトによって、具体的には次の処理が行われます。
- Node、Nginx、および PM2 をインストールします。
- Nginx と PM2 を構成します。
- Node アプリを開始します。
Jenkins プラグインを構成する
まず NodeJS 用と VS Team Services Continuous Deployment 用の 2 つの Jenkins プラグインを構成する必要があります。
- Jenkins アカウントを開き、[Jenkins の管理] を選択します。
- [Jenkins の管理] ページで、[プラグインの管理] を選択します。
- 一覧を絞り込んで [NodeJS] プラグインを探し、[Install without restart] \(再起動せずにインストール) オプションを選択します。
- 一覧を絞り込んで [VS Team Services Continuous Deployment] プラグインを探し、[[Install without restart] \(再起動せずにインストール) オプションを選択します。
- Jenkins ダッシュボードに戻り、[Jenkins の管理] を選択します。
- [Global Tool Configuration]\(ツールのグローバル構成) を選択します。 [NodeJS] を検索して [NodeJS installations] \(NodeJS のインストール) を選択します。
- [Install automatically] \(自動的にインストールする) オプションを選択して、[名前] の値を入力します。
- [保存] を選択します。
Node.js の Jenkins フリースタイル プロジェクトを構成する
- [新しい項目] を選択します。 項目名を入力します。
- [Freestyle project] \(フリースタイル プロジェクト) を選択します。 [OK] を選択します。
- [Source Code Management] \(ソース コードの管理) タブで [Git] を選択し、アプリ コードを保存するリポジトリとブランチの詳細情報を入力します。
- [Build Triggers] \(ビルド トリガー) タブで [Poll SCM] \(SCM のポーリング) を選択し、スケジュール「
H/03 * * * *
」を入力して Git リポジトリの変更を 3 分間隔でポーリングします。 - [ビルド環境] タブで、[ノードの指定] & [npm bin/ folder PATH] を選択し、[NodeJS Installation]\(NodeJS インストール\) の値を選択します。 [npmrc file] \(npmrc ファイル) は [use system default] \(システムの既定値を使用する) のままにします。
- [ビルド] タブで [Execute shell] \(シェルの実行) を選択して
npm install
コマンドを入力し、すべての依存関係が更新されるようにします。
Azure DevOps Services との統合のために Jenkins を構成する
Note
次の手順で使用する個人用アクセス トークン (PAT) に Azure DevOps Services のリリース (読み取り、書き込み、実行、管理) アクセス許可が含まれるようにします。
Azure DevOps Services 組織で PAT を作成します (まだない場合)。 Jenkins から Azure DevOps Services 組織にアクセスするには、この情報が必要です。 必ず、このセクションの以降の手順で必要なトークンの情報を保存します。
トークンの生成方法については、Azure DevOps Services の個人用アクセス トークンを作成する方法に関する記事をご覧ください。
[Post-build Actions]\(ビルド後のアクション) タブで [Add post-build action]\(ビルド後のアクションを追加する) を選択します。 [Archive the artifacts] \(成果物のアーカイブ) を選択します。
[Files to archive]\(アーカイブするファイル\) に
**/*
と入力してすべてのファイルが含まれるようにします。別のアクションを作成するには [Add post-build action] \(ビルド後のアクションを追加する) をクリックします。
[Trigger release in TFS/Team Services]\(TFS/Team Services でリリースをトリガーする) を選択します。 Azure DevOps Services 組織の URI を入力します (例: https://{your-organization-name}.visualstudio.com)。
プロジェクト名を入力します。
リリース パイプラインの名前を選択します (このリリース パイプラインは、後で Azure DevOps Services で作成します)。
Azure DevOps Services 環境または Azure DevOps Server 環境に接続するための資格情報を選択します。
- Azure DevOps Services を使用している場合は、[ユーザー名] を空白のままにしておきます。
- オンプレミス版の Azure DevOps Server を使用している場合は、ユーザー名とパスワードを入力します。
Jenkins プロジェクトを保存します。
Jenkins サービス エンドポイントを作成する
サービス エンドポイントを使用して、Azure DevOps Services から Jenkins に接続できます。
- Azure DevOps Services の [サービス] ページを開き、[新しいサービス エンドポイント] 一覧を開いて、[Jenkins] を選択します。
- 接続名を入力します。
- Jenkins サーバーの URL を入力し、[信頼されていない SSL 証明書を受け入れる] オプションを選択します。 URL は、たとえば http://{YourJenkinsURL}.westcentralus.cloudapp.azure.com です。
- Jenkins アカウントのユーザー名とパスワードを入力します。
- [接続の確認] を選択して情報が正しいことを確認します。
- [OK] を選択してサービス エンドポイントを作成します。
Azure 仮想マシンのデプロイ グループを作成する
リリース パイプラインを仮想マシンにデプロイできるように、Azure DevOps Services エージェントを登録する配置グループが必要です。 デプロイ グループを使用すると、デプロイ用にターゲット マシンの論理グループを定義し、各コンピューターに必要なエージェントをインストールするのが簡単になります。
Note
次の手順では前提条件となるものをインストールしますが、スクリプトは sudo 権限で実行しないようにします。
- [ビルドとリリース] ハブの [リリース] タブを開き、[デプロイ グループ] を開き、[+ 新規] を選択します。
- 配置グループの名前と、説明 (省略可能) を入力します。 [作成] を選択します。
- デプロイ ターゲットの仮想マシンのオペレーティング システムを選択します。 たとえば、[Ubuntu 16.04+] を選択します。
- [認証用にスクリプト内の個人用アクセス トークンを使用する] を選択します。
- [システムの前提条件] を選択します。 お使いのオペレーティング システムの前提条件となるものをインストールします。
- [スクリプトをクリップボードにコピー] を選択してスクリプトをコピーします。
- デプロイ ターゲットの仮想マシンにログインして、スクリプトを実行します。 スクリプトは sudo 権限で実行しないでください。
- インストール後、デプロイ グループのタグを求められます。 既定値を受け入れます。
- Azure DevOps Services の [配置グループ] の [ターゲット] で、新たに登録された仮想マシンを確認します。
Azure Pipelines のリリース パイプラインを作成する
リリース パイプラインでは、Azure Pipelines でアプリをデプロイするときに使用するプロセスを指定します。 この例ではシェル スクリプトを実行します。
Azure Pipelines でリリース パイプラインを作成するには、次の手順に従います。
- ビルド & リリース ハブの [リリース] タブを開き、[リリース パイプラインの作成] を選択します。
- [空のプロセス] で開始することを選択して [空] のテンプレートを選択します。
- [成果物] セクションで[+ 成果物の追加] を選択し、[ソースの種類] に [Jenkins] を選択します。 Jenkins サービス エンドポイントの接続を選択します。 Jenkins ソース ジョブを選択し、[追加] を選択します。
- [環境 1] の横にある省略記号を選択します。 [Add deployment group phase]\(デプロイ グループ フェーズを追加) をクリックします。
- ご利用のデプロイ グループを選択します。
- [+] を選択して [Deployment group phase]\(デプロイ グループ フェーズ) にタスクを追加します。
- [シェル スクリプト] タスクを選択して [追加] を選択します。 [シェル スクリプト] タスクは、Node.js をインストールし、アプリを起動するために各サーバーで実行されるスクリプトの構成を指定します。
- [スクリプト パス] については、$(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh を入力します。
- [詳細] を選択して、[作業ディレクトリを指定する] を有効にします。
- [作業ディレクトリ] については、$(System.DefaultWorkingDirectory)/Fabrikam-Node を入力します。
- リリース パイプラインの名前を、Jenkins のビルドの [Post-build Actions] \(ビルド後のアクション) タブで指定した名前に変更します。 ソース アーティファクトが更新されたときに、Jenkins から新しいリリースをトリガーするには、この名前を指定する必要があります。
- [保存] を選択し、[OK] をクリックしてリリース パイプラインを保存します。
手動デプロイおよび CI によってトリガーされるデプロイを実行する
- [+ リリース] を選択し、[リリースの作成] を選択します。
- 強調表示されているドロップダウン リストから完了したビルドを選択し、[キュー] を選択します。
- ポップアップ メッセージでリリース リンクを選択します。 たとえば、"リリース Release-1 が作成されました" と表示されます。
- [ログ] タブを開いて、リリース コンソールの出力を確認します。
- ブラウザーで、デプロイ グループに追加したサーバーのいずれかについて URL を開きます。 たとえば、http://{your-server-ip-address} と入力します。
- ソース Git リポジトリに移動し、app/views/index.jade ファイル内の [h1] 見出しの内容を、変更を行ったテキストで変更します。
- 変更を [コミット] します。
- 数分後、Azure DevOps の [リリース] ページに、作成された新しいリリースが表示されます。 リリースを開き、実行された配置を確認します。 お疲れさまでした。
Jenkins プラグインのトラブルシューティング
Jenkins プラグインでバグが発生した場合は、Jenkins JIRA で特定のコンポーネントについて問題を報告してください。
次のステップ
このチュートリアルでは、ビルドに Jenkins を、リリースに Azure DevOps Services を使用して、Azure へのアプリのデプロイを自動化しました。 以下の方法を学習しました。
- Jenkins でアプリをビルドする。
- Azure DevOps Services との統合のために Jenkins を構成する。
- Azure 仮想マシンのデプロイ グループを作成する。
- VM を構成し、アプリをデプロイする Azure パイプラインを作成する。
ビルドとリリースの両方のステップで Azure Pipelines を使用する方法については、こちらを参照してください。
VM へのデプロイを行う YAML ベースの CI/CD パイプラインを作成する方法については、次のチュートリアルに進んでください。