Jenkinsを使用して自動デプロイする

目次

やりたいこと

  • 自前のローカルパソコンでNode.jsを動かす
  • ソースコードはGithubにあげており、定期的にチェックして、変更があれば自動的に再デプロイする

使用する環境

以下マシンを使用した。安い時だと2.5万円ぐらいで買える。OSもついているので安い。 Amazon.co.jp: Beelink Mini S12 Pro ミニ Pc 、16GB DDR4 500GB SSD 第12世代プロセッサ N100 4C 4T Up to 3.4Ghz

環境構築

Githubのレポジトリを定期的にチェックして、変更があれば再デプロイするのにはJenkinsを使用する。jenkinsは自動テスト実行ツールだと思っていたので、この使いたがあっているのかわからないが、目的にあっているのであれば利用する。あと、自前でPowerhsellを利用してアプリを作成しようかと思ったが、こういうのは自分で作るよりも既存のを使用したほうが早いと考えた。

  • OepnJDKには色々とバージョンがあるけど、無償でログインせずにダウンロードできるAdoptiumを使用した。

  • jenkinsは公式サイトから直接DLしてインストールした。

GithubでSSHする

このあとjenkinsでSSHでGithubにログインするのだが、そのために必要な設定を先にする

  1. SSHキーの生成(まだ作成していない場合)

    • ターミナルで以下のコマンドを実行:
      ssh-keygen -t ed25519 -C "[email protected]"
      
    • [email protected] の部分には、GitHubアカウントに紐付いているメールアドレスを入力してください。
    • ファイルの保存場所はデフォルトのままにし、パスフレーズは任意で設定。
  2. SSHキーをGitHubに登録

    • 公開鍵を表示するコマンドを実行:
      cat ~/.ssh/id_ed25519.pub
      
    • GitHubの「Settings > SSH and GPG keys」で「New SSH key」を選択し、公開鍵を登録。
  3. GitHubにSSH接続ができるか確認

    • 以下のコマンドを実行して接続を確認:
    • ログインに成功したら以下のメッセージが出力されます。
      Hi {username}! You've successfully authenticated, but GitHub does not provide shell access.
      

PM2で永続稼働させる

PM2を使用すると、Node.jsアプリケーションをバックグラウンドで常時実行させたり、アプリケーションがクラッシュした際に自動的に再起動させたりすることができます。これにより、アプリがデプロイ後も常に安定して稼働するようになります。jenkisをサービスとして稼働させるので、スタートアップへの登録はもしかするといらないが、念ため設定しておく。

  1. インストール

    npm install pm2 -g
    
  2. 起動後に立ち上がるようにする pm2 startupを使えば、LinuxやmacOSなどのUnix系OSで使う起動管理システム(SystemdやUpstartなど)を基にしていますが、Windows環境ではこれに対応していないため、以下のアプリをインストールする。 pm2-windows-startupのインストール

    npm install pm2-windows-startup -g
    

    インストールが完了したら、PM2をWindowsのスタートアップに登録します。

    pm2-startup install
    
  3. 現在のPM2プロセスを保存 すでに動作しているPM2のアプリケーションを再起動後に復元するためには、以下のコマンドで現在のPM2プロセスリストを保存します。現在のアプリケーションは以下PM2 listで確認できます。

    C:\Windows\System32>pm2 list
    ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
    │ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
    ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
    1  │ discordbot         │ fork     │ 1    │ online    │ 0%       │ 120.8mb  │
    └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
    

環境変数の設定

Jenkinsがシステムユーザー(SYSTEMユーザー)として実行されているため、デプロイする時にnpmで入れたコマンドを見つける事ができない問題を解決します。PM2のパスを確認するには、コマンドプロンプトで以下を実行します。

  C:\Windows\System32>where pm2
  C:\Users\{username}\AppData\Roaming\npm\pm2
  C:\Users\{username}\AppData\Roaming\npm\pm2.cmd
  • Windowsで「ファイルを指定して実行」
  • 「sysdm.cpl」→「詳細設定」→「環境変数」→「システム環境変数」の「Path」を選択して編集→そこに先ほどだしたC:\Users\{username}\AppData\Roaming\npm\pm2パスを加える
  • パソコンの再起動

Jenkins設定

  1. Jenkinsのダッシュボードから「新規ジョブ」を選び、「フリースタイルプロジェクト」を作成します。

  2. ソースコード管理に「Git」を選び、リポジトリURLにはGithubのレポジトリURLを指定します。プライベートレポジトリでもOKです。私の場合は[email protected]:{github_username}/DiscordBot.gitとなった。

  3. 認証情報には追加→Jenkinsから

    • スコープ グローバル
    • ID 適宜お好みで
    • 説明 わかりやすいのでOK。私はgithub use ssh keyにした
    • ユーザ名 これはgithubなら[email protected]にすること。
    • 秘密鍵 これは先程作成したSSH鍵の秘密鍵を貼り付ける
    • パスフレーズ SSH鍵を作成する時に入れてるならそれを入力
  4. ビルド・トリガ SCMをポーリングにチェックをいれて、スケジュールを5分間隔でGithubのレポジトリをチェックするならH/5 * * * *とかく。cronの書き方ですね。

  5. ビルド環境 Build Stepsに以下を書いた。私の場合にはアプリのコードが書いてあるのがindex.jsなので、以下の書き方にした。

    pm2 start index.js --name "discordbot" || pm2 restart "discordbot"
    pm2 list
    
  6. 保存 これで保存して、ビルドを実行してみる。すると、Verifying host key using known hosts fileとコンソール出力に出てくるだろう。その場合には以下のように対処する

  7. Git Host Key Verificationの設定 「Jenkinsの管理」→「Security」に移動します。一番下に「Git Host Key Verification Configuration」という項目があるのでHost Key Verification StrategyをAccept first connection(最初の接続を許可)とします。これで再度ためして、ビルドがうまくいくか確認する

  8. 環境変数を変えたい Jenkinsで動かしているBOTだけ違うチャンネルに発言させたくなったので、以下のようにしました。.envをで書いているDISCORD_CHANNEL_IDを上書きしています。念の為、設定されているか確認するため、出力しています。

      set DISCORD_CHANNEL_ID=1263232323232323223
      echo DISCORD_CHANNEL_ID=%DISCORD_CHANNEL_ID%
    

PM2の使い方

PM2はNode.jsアプリケーションをプロセスマネージャとして管理するためのツールです。アプリケーションの自動再起動や、リアルタイムのプロセス監視が可能です。ここではPM2を使用してアプリを監視・管理する方法を説明します。

1. アプリの起動

Node.jsアプリケーションをPM2で管理するには、以下のコマンドを使用します。

pm2 start app.js --name "my-app"
  • app.js はアプリケーションのエントリーポイント。
  • –name オプションでアプリケーションに名前を付けて管理できます。

2. アプリのリスト表示

現在PM2で管理されているアプリケーションの一覧を表示するには、以下のコマンドを使用します。

pm2 list

3. アプリの停止

特定のアプリケーションを停止するには、アプリ名またはIDを指定して以下のコマンドを実行します。

pm2 stop my-app

または、アプリのIDがわかっている場合:

pm stop 0

4. アプリの再起動

アプリケーションを再起動するには、以下のコマンドを使います。

pm2 restart my-app

または、アプリのIDがわかっている場合:

pm restart 0

5. アプリの削除

PM2のプロセスリストからアプリを完全に削除するには、以下のコマンドを使用します。

pm2 restart my-app

または、アプリのIDがわかっている場合:

pm restart 0

6. リアルタイムログの確認

PM2はアプリケーションの標準出力とエラーログを自動的に保存します。これにより、デプロイ後の問題やエラーログを簡単に確認できます。

pm2 logs

特定のアプリケーションのログを確認したい場合は、アプリ名やIDを指定して次のように実行します。

pm2 logs my-app

または、IDを使って確認する場合:

pm2 logs 0

7. ログのクリア

PM2で管理しているアプリケーションのログが大きくなった場合、次のコマンドでログをクリアできます。

pm2 flush

ああ