著者は、 Write for DOnations プログラムの一環として、 International MedicalCorpsを選択して寄付を受け取りました。

序章

継続的インテグレーション/継続的展開(CI / CD)は、ソフトウェアチームが複数のプラットフォームでアプリケーションをより簡単かつ迅速に構築、テスト、および展開できるようにする開発手法です。 CircleCI は、プロジェクトのCI/CDワークフローを構築および維持できる人気のある自動化プラットフォームです。

継続的な展開を行うことは、多くの点で有益です。 これは、アプリケーションのデプロイメント手順を標準化し、記録されていない変更からアプリケーションを保護するのに役立ちます。 また、繰り返しの手順を実行することを回避し、開発に集中することができます。 CircleCIを使用すると、開発、テスト、および本番環境のさまざまなデプロイメントプロセスすべてにわたって単一のビューを表示できます。

このチュートリアルでは、 Node.js アプリをローカルでビルドし、GitHubにプッシュします。 続いて、 Ubuntu 18.04 を実行している仮想プライベートサーバー(VPS)に接続するようにCircleCIを構成し、VPSに自動展開するためのコードを設定する手順を実行します。 記事の終わりまでに、CircleCIがローカル環境からGitHubリポジトリにプッシュしたコードを取得してVPSにデプロイするCI/CDパイプラインが機能するようになります。

前提条件

始める前に、次のものが必要です。

ステップ1—ローカルノードプロジェクトの作成

このステップでは、サンプルアプリケーションとしてこのチュートリアルで使用するNode.jsプロジェクトをローカルに作成します。 後でこれをGitHubのリポジトリにプッシュします。

先に進み、ローカル端末でこれらのコマンドを実行して、迅速なノード開発環境をセットアップできるようにします。

まず、テストプロジェクト用のディレクトリを作成します。

  1. mkdir circleci-test

新しいディレクトリに移動します。

  1. cd circleci-test

npm 環境を初期化して、依存関係がある場合はそれをプルすることで、これをフォローアップします。 -yフラグは、npm initによってスローされたすべてのプロンプトを自動的に受け入れます。

  1. npm init -y

npmの詳細については、npmおよびpackage.jsonチュートリアルでNode.jsモジュールを使用する方法を確認してください。

次に、誰かがルートにアクセスしたときにHello World!を提供する基本サーバーを作成します。 テキストエディタを使用して、プロジェクトのルートディレクトリにapp.jsというファイルを作成します。 このチュートリアルでは、nanoを使用します。

  1. nano app.js

app.jsファイルに次のコードを追加します。

circleci-test / app.js
const http = require('http');

http.createServer(function (req, res) {
  res.write('Hello World!'); 
  res.end(); 
}).listen(8080, '0.0.0.0'); 

このサンプルサーバーは、httpパッケージを使用して、ポート8080で着信要求をリッスンし、 string Hello Worldで応答する要求リスナー関数を起動します。

ファイルを保存して閉じます。

ターミナルの同じディレクトリから次のコマンドを実行することにより、ローカルマシンでこれをテストできます。 これにより、サーバー(app.js)を実行するノードプロセスが作成されます。

  1. node app.js

次に、ブラウザで http:// localhost:8080URLにアクセスします。 ブラウザは文字列Hello World!をレンダリングします。 アプリをテストしたら、ノードプロセスを開始したのと同じ端末でCTRL+Cを押してサーバーを停止します。

これで、サンプルアプリケーションがセットアップされました。 次のステップでは、CircleCIがデプロイメントに使用できるように、プロジェクトに構成ファイルを追加します。

ステップ2—プロジェクトに構成ファイルを追加する

CircleCIは、プロジェクトフォルダー内の構成ファイルに従ってワークフローを実行します。 このステップでは、そのファイルを作成して展開ワークフローを定義します。

プロジェクトのルートディレクトリに.circleciというフォルダを作成します。

  1. mkdir .circleci

config.ymlという名前の新しいファイルを追加します。

  1. nano .circleci/config.yml

これにより、YAMLファイル拡張子のファイルが開きます。 YAMLは、構成管理によく使用される言語です。

次の構成を新しいconfig.ymlファイルに追加します。

circleci-test / .circleci / config.yml
version: 2.1

# Define the jobs we want to run for this project
jobs:
  pull-and-build:
    docker:
      - image: arvindr226/alpine-ssh
    steps:
      - checkout
      - run: ssh -oStrictHostKeyChecking=no -v $USER@$IP "./deploy.sh"

# Orchestrate our job run sequence
workflows:
  version: 2
  build-project:
    jobs:
      - pull-and-build:
          filters:
            branches:
              only:
                - main

このファイルを保存して、テキストエディタを終了します。

このファイルは、CircleCIパイプラインに次のことを伝えます。

  • pull-and-buildというジョブがあり、その手順では、 Dockerコンテナを起動し、そこからVPSにSSHで接続してから、deploy.shファイルを実行します。
  • Dockerコンテナーは、構成のstepsセクションに記載されているコマンドを実行するための一時的な環境を作成するという目的を果たします。 この場合、必要なのはVPSにSSHで接続し、sh deploy.shコマンドを実行することだけです。したがって、環境は軽量である必要がありますが、SSHコマンドは許可されます。 Dockerイメージarvindr226/ alpine-ssh は、SSHをサポートする AlpineLinuxイメージです。
  • deploy.shは、VPSで作成するファイルです。 展開プロセスの一部として毎回実行され、プロジェクトに固有の手順が含まれます。
  • workflowsセクションで、いくつかのフィルターに基づいてこのジョブを実行する必要があることをCircleCIに通知します。この場合、メインブランチへの変更のみがこのジョブをトリガーします。

次に、これらのファイルをコミットしてGitHubリポジトリにプッシュします。 これを行うには、プロジェクトディレクトリから次のコマンドを実行します。

まず、Node.jsプロジェクトディレクトリをgitリポジトリとして初期化します。

  1. git init

先に進み、gitリポジトリに新しい変更を追加します。

  1. git add .

次に、変更をコミットします。

  1. git commit -m "initial commit"

初めてコミットする場合、gitはあなたを識別するためにいくつかのgit configコマンドを実行するように促します。

ブラウザからGitHubに移動し、GitHubアカウントでログインします。 READMEまたはライセンスファイルなしでcircleci-testという名前の新しいリポジトリを作成します。 リポジトリを作成したら、コマンドラインに戻ってローカルファイルをGitHubにプッシュします。

GitHubプロトコルに従うには、次のコマンドを使用してブランチの名前をmainに変更します。

  1. git branch -M main

初めてファイルをプッシュする前に、GitHubをリモートリポジトリとして追加する必要があります。 実行してそれを行います:

  1. git remote add origin https://github.com/GitHub_username/circleci-test

これに続いてpushコマンドを実行します。これにより、ファイルがGitHubに転送されます。

  1. git push -u origin main

これで、コードがGitHubにプッシュされました。 次のステップでは、pull-and-build部分のstepsを実行する新しいユーザーをVPSに作成します。

ステップ3—展開用の新しいユーザーを作成する

プロジェクトの準備ができたので、VPSにデプロイメントユーザーを作成します。

sudoユーザーとしてVPSに接続します

  1. ssh your_username@your_server_ip

次に、useraddコマンドを使用して、ログインにパスワードを使用しない新しいユーザーを作成します。

  1. sudo useradd -m -d /home/circleci -s /bin/bash circleci

このコマンドは、システム上に新しいユーザーを作成します。 -mフラグは、-dフラグで指定されたホームディレクトリを作成するようにコマンドに指示します。

この場合、circleciが新しい展開ユーザーになります。 このユーザーの唯一の仕事はVPSからCircleCIネットワークへのSSH接続を作成し、deploy.shを実行することであるため、セキュリティ上の理由から、このユーザーをsudoグループに追加することはありません。 ] 脚本。

VPSのファイアウォールがポート8080に対して開いていることを確認してください。

  1. sudo ufw allow 8080

次に、新しいユーザーがログインに使用できるSSHキーを作成する必要があります。 パスフレーズなしでSSHキーを作成しようとしています。そうしないと、CircleCIはそれを復号化できません。 詳細については、公式CircleCIドキュメントを参照してください。 また、CircleCIはSSHキーの形式がPEM形式であることを想定しているため、キーペアを作成するときにそれを適用します。

ローカルシステムに戻り、ホームフォルダに移動します。

  1. cd

次に、次のコマンドを実行します。

  1. ssh-keygen -m PEM -t rsa -f .ssh/circleci

このコマンドは、-mフラグで指定されたPEM形式と-tフラグで指定されたキータイプのRSAキーを作成します。 また、-fを指定して、circleciおよびcircleci.pubという新しいキーペアを作成します。 名前を指定すると、既存のid_rsaファイルが上書きされなくなります。

新しい公開鍵を印刷します。

  1. cat ~/.ssh/circleci.pub

これにより、生成した公開鍵が出力されます。 この公開鍵をVPSに登録する必要があります。 これをクリップボードにコピーします。

VPSに戻り、circleciユーザー用に.sshディレクトリを作成します。

  1. sudo mkdir /home/circleci/.ssh

ここで、ローカルマシンからコピーした公開鍵をauthorized_keysというファイルに追加します。

  1. sudo nano /home/circleci/.ssh/authorized_keys

コピーした公開鍵をここに追加し、ファイルを保存して、テキストエディタを終了します。

circleciユーザーにディレクトリのアクセス許可を与えて、展開中にアクセス許可の問題が発生しないようにします。

  1. sudo chown -R circleci:circleci /home/circleci

秘密鍵を使用して、新しいユーザーとしてログインできるかどうかを確認します。 ローカルシステムで新しいターミナルを開き、次を実行します。

  1. ssh circleci@your_server_ip -i ~/.ssh/circleci

これで、circleciユーザーとしてVPSにログインします。 これは、SSH接続が成功したことを示しています。 次に、GitHubリポジトリをCircleCIに接続します。

ステップ4—GitHubプロジェクトをCircleCIに追加する

このステップでは、GitHubアカウントをCircleCIアカウントに接続し、CI/CD用のcircleci-testプロジェクトを追加します。 GitHubアカウントでサインアップした場合、GitHubはCircleCIアカウントに自動的にリンクされます。 そうでない場合は、https://circleci.com/accountに移動して接続します。

circleci-testプロジェクトを追加するには、https://app.circleci.com/projects/project-dashboard/github/your_usernameにあるCircleCIプロジェクトダッシュボードに移動します。

ここに、GitHubのすべてのプロジェクトが一覧表示されます。 プロジェクトcircleci-testセットアッププロジェクトをクリックします。 これにより、プロジェクト設定ページが表示されます。

これで、プロジェクトの構成を設定するオプションが表示されます。これは、リポジトリで既に設定されています。 これはすでに設定されているので、既存の構成を使用オプションを選択します。 これにより、パイプラインを構築することを確認するポップアップボックスが表示されます。

ここから先に進み、ビルド開始をクリックします。 これにより、circleci-testパイプラインページが表示されます。 今のところ、このパイプラインは失敗します。 これは、最初にプロジェクトのSSHキーを更新する必要があるためです。

https://app.circleci.com/settings/project/github/your_username/circleci-testのプロジェクト設定に移動し、左側のSSHキーセクションを選択します。

次のコマンドを実行して、ローカルマシンから以前に作成したcircleciという名前の秘密鍵を取得します。

  1. cat ~/.ssh/circleci

このコマンドからの出力をコピーします。

追加のSSHキーセクションで、SSHキーの追加ボタンをクリックします。

これにより、ホスト名とSSHキーの入力を求めるウィンドウが開きます。 選択したホスト名を入力し、ローカル環境からコピーした秘密SSHキーを追加します。

CircleCIは、このキーを使用して、新しいcircleciユーザーとしてVPSにログインできるようになります。

最後のステップは、VPSのユーザー名とIPをCircleCIに提供することです。 同じプロジェクト設定ページで、左側の環境変数タブに移動します。

circleciの値を持つUSERという名前の環境変数と、VPSのIPアドレス(またはVPSのドメイン名の場合はVPSのドメイン名)の値を持つIPを追加します。 DNSレコードを持っている)。

これらの変数を作成したら、CircleCIに必要なセットアップを完了します。 次に、circleciユーザーにSSH経由でGitHubへのアクセスを許可します。

ステップ5—SSHキーをGitHubに追加する

ここで、circleciユーザーがGitHubで認証して、git pullのようなgit操作を実行できるようにする方法を提供する必要があります。

これを行うには、このユーザーがGitHubに対して認証するためのSSHキーを作成します。

circleciユーザーとしてVPSに接続します。

  1. ssh circleci@your_server_ip -i ~/.ssh/circleci

パスフレーズなしで新しいSSHキーペアを作成します。

  1. ssh-keygen -t rsa

次に、公開鍵を出力します。

  1. cat ~/.ssh/id_rsa.pub

出力をコピーしてから、circleci-testGitHubリポジトリのhttps://github.com/your_username/circleci-test/settings/keysにあるデプロイキー設定に移動します。

展開キーの追加をクリックして、コピーした公開キーを追加します。 Title フィールドにキーの希望の名前を入力し、コピーした公開キーをKeyフィールドに追加します。 最後に、キーの追加ボタンをクリックして、アカウントにキーを追加します。

circleciユーザーがGitHubアカウントにアクセスできるようになったので、このSSH認証を使用してプロジェクトを設定します。

ステップ6—VPSでプロジェクトを設定する

次に、プロジェクトを設定するために、リポジトリのクローンを作成し、circleciユーザーとしてVPSでプロジェクトの初期設定を行います。

VPSで、次のコマンドを実行します。

  1. git clone [email protected]:your_username/circleci-test.git

そこに移動します:

  1. cd circleci-test

まず、依存関係をインストールします。

  1. npm install

次に、構築したサーバーを実行してアプリをテストします。

  1. node app.js

ブラウザにアクセスして、アドレスhttp://your_vps_ip:8080を試してください。 出力Hello World!を受け取ります。

CTRL+Cでこのプロセスを停止し、pm2を使用して、このアプリをバックグラウンドプロセスとして実行します。

pm2 をインストールして、Nodeアプリを独立したプロセスとして実行できるようにします。 pm2は、Node.jsで記述された用途の広いプロセスマネージャーです。 ここでは、サーバーからログアウトした後でも、サンプルのNode.jsプロジェクトをアクティブなプロセスとして実行し続けるのに役立ちます。 これについては、 Ubuntu18.04チュートリアルで本番用にNode.jsアプリケーションをセットアップする方法でもう少し読むことができます。

  1. npm install -g pm2

注: Ubuntu 18.04などの一部のシステムでは、npmパッケージをグローバルにインストールすると、アクセス許可エラーが発生し、インストールが中断される可能性があります。 sudonpm installと一緒に使用しないことはセキュリティのベストプラクティスであるため、代わりにnpmのデフォルトディレクトリを変更することでこれを解決できます。 EACCESエラーが発生した場合は、公式のnpmドキュメントの指示に従ってください。

pm2 startコマンドを使用して、app.jsファイルをノードプロセスとして実行できます。 --nameフラグを使用して、appという名前を付けて、後で識別することができます。

  1. pm2 start app.js --name "app"

また、展開手順を提供する必要があります。 これらのコマンドは、circleciユーザーがコードをデプロイするたびに実行されます。

ログイン試行が成功したときにcircleciユーザーが到達するパスになるため、ホームディレクトリに戻ります。

  1. cd ~

先に進み、deploy.shファイルを作成します。このファイルにはデプロイ手順が含まれています。

  1. nano deploy.sh

ここで、Bashスクリプトを使用して展開を自動化します。

deploy.sh
#!/bin/bash

#replace this with the path of your project on the VPS
cd ~/circleci-test

#pull from the branch
git pull origin main

# followed by instructions specific to your project that you used to do manually
npm install
export PATH=~/.npm-global/bin:$PATH
source ~/.profile

pm2 restart app

これにより、作業ディレクトリがプロジェクトルートに自動的に変更され、GitHubからコードがプルされ、依存関係がインストールされてから、アプリが再起動されます。 ファイルを保存して終了します。

次のコマンドを実行して、このファイルを実行可能にします。

  1. chmod u+x deploy.sh

次に、ローカルマシンに戻り、すばやく変更してテストします。 プロジェクトディレクトリに移動します。

  1. cd circleci-test

app.jsファイルを開きます。

  1. nano circleci-test/app.js

次に、次の強調表示された行を追加します。

circleci-test / app.js
const http = require('http');

http.createServer(function (req, res) {
  res.write('Foo Bar!');
  res.end();
}).listen(8080, '0.0.0.0');

ファイルを保存して、テキストエディタを終了します。

この変更を追加してコミットします。

  1. git add .
  2. git commit -m "modify app.js"

次に、これをメインブランチにプッシュします。

  1. git push origin main

これにより、展開用の新しいパイプラインがトリガーされます。 https://app.circleci.com/pipelines/github/your_usernameに移動して、動作中のパイプラインを表示します。

成功したら、http://your_vps_ip:8080でブラウザを更新します。 Foo Bar!がブラウザに表示されます。

結論

これらは、CircleCIをGitHubリポジトリおよびLinuxベースのVPSと統合するための手順です。 deploy.shを変更して、プロジェクトに関連するより具体的な手順を確認できます。

CI / CDの詳細については、 CI/CDトピックページをご覧ください。 CircleCIを使用したワークフローの設定の詳細については、CircleCIドキュメントにアクセスしてください。