AWSのEC2に構築したLaravelプロジェクトに対して、CircleCIを利用して自動テスト・デプロイをしてみます。
デプロイまでの手順・自動化の大まかな流れは下記のようになります。
1. ローカル環境からGitHubへpush。
2. GitHubのmusterブランチに問題なくマージされると、
3. CircleCI上の仮想環境から、SSHによってEC2のサーバーに接続。
4. 接続されたらLaravelプロジェクト内に移動し、GitHubからpullしてデプロイ完了。
上記自動化のためには、CircleCI上の仮想環境からSSHによってEC2のインスタンスサーバーと接続する必要があります。そのために、SSH鍵の作成、公開鍵・秘密鍵をGitHubおよびCircleCIに登録する必要があります。
Laravel環境の構築、CircleCIによるテスト自動化自体の説明は下記の関連ページをご覧下さい。
関連ページ
EC2とRDS(MySQL)でLaravel 構築 チュートリアル
CircleCIでLaravel[MySQL]とPHPUnitの自動化
EC2
まずEC2上のサーバーに接続したら、SSH鍵の有無(id_rsaやid_rsa.pubといった名前のキーペアとしてのファイル)を調べます。
1 |
$ ls -al ~/.ssh |
存在しない場合(もしくは既存の鍵と分けて利用したい場合)は、SSH鍵を新規作成します。今回途中の質問は、何も入力せずに進みます。
1 |
$ ssh-keygen -t rsa -b 4096 -m pem -C "hoge@hoge.co.jp" |
上記コマンドによって、デフォルトでは id_rsa (秘密鍵)とid_rsa.pub (公開鍵)ファイルが生成されます。このファイルの内容をGitHubおよびCircleCIに設定する必要があります(後述)。
生成されたid_rsa.pubの内容を、リダイレクトによってauthorized_keysに追記しておきます。
1 |
$ cat id_rsa.pub >> authorized_keys |
GitHub
GitHubにおいて、構築したLaravelプロジェクトであるリポジトリの「Settings」>「Deploy keys」画面を開きます。「Add deploy key」ボタンをクリックして表示されるTitleとKeyのフォームに、それぞれ以下の説明のように値を設定します。
Title:後で見て分かりやすいように適当なタイトルを付ける。
Key:公開鍵の内容をコピーして貼り付ける。
1 |
$ cat ~/.ssh/id_rsa.pub |
Deploy key生成後に確認できる、Fingerprintの値はconfig.ymlで利用します。
CircleCI
まず設定画面の「SSH Permissions」画面に移動し、「Add SSH Key」ボタンをクリックして表示されるHostnameとPrivate Keyのフォームに、それぞれ以下の説明のように値を設定します。
Hostname:後で見て分かりやすいように適当な名前を入力する。
Private Key:秘密鍵の内容をコピーして貼り付ける。
1 |
$ cat ~/.ssh/id_rsa |
次にSSH接続する際に必要な環境変数(config.ymlで後述)を設定します。設定画面の「Environment Variables」画面に移動し、「Add Variable」ボタンをクリックして表示されるNameとValueのフォームに、それぞれ以下のように項目を設定します。
HOST_NAME:EC2で立ち上げたインスタンスのIPアドレス
USER_NAME:ユーザー名(今回はec2-user)
.circleci/config.yml
config.ymlファイルを編集します。
Laravelのプロジェクト/.circleci/config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
version: 2 jobs: build: docker: - image: circleci/php:7.3-node-browsers environment: - APP_DEBUG: true - APP_ENV: testing - DB_CONNECTION: mysql - DB_DATABASE: laravel - DB_USERNAME: root - image: circleci/mysql:5.7-ram environment: - MYSQL_ALLOW_EMPTY_PASSWORD: true - MYSQL_DATABASE: laravel steps: - checkout - run: sudo apt update - run: sudo docker-php-ext-install pdo_mysql - restore_cache: keys: - v1-dependencies-{{ checksum "composer.json" }} - v1-dependencies- - run: composer install -n --prefer-dist - save_cache: key: v1-dependencies-{{ checksum "composer.json" }} paths: - ./vendor - run: echo "APP_KEY=" > .env - run: php artisan key:generate - run: php artisan migrate - run: ./vendor/bin/phpunit deploy: machine: image: circleci/classic:edge steps: - add_ssh_keys: fingerprints: - "84:○:○:○:○:○:○:○:○:○:○:○:○:○:○:bf" - run: ssh ${USER_NAME}@${HOST_NAME} 'cd /var/www/aws-laravel/ && git pull origin master' workflows: version: 2 build_and_deploy: jobs: - build - deploy: requires: - build filters: branches: only: master |
3〜40行目
テストを実行するためのジョブをbuildという名前で定義しています。本記事では説明しませんので下記関連ページをご覧下さい。
CircleCIでLaravel[MySQL]とPHPUnitの自動化
42〜49行目
デプロイを実行するためのジョブをdeployという名前で定義しています。登録した環境変数によってEC2のインスタンスサーバに対してSSH接続しています。
51〜61行目
workflowsでは、各ジョブ(上記コードではbuildとdeployという名前のジョブ)の自動化のための手順の設定をしていきます。deployジョブはrequiresにbuildを指定しています。requiresは依存関係を示し、この場合buildが成功した場合にのみdeployが実行されます。またfiltersのbranchesキーにmasterブランチを指定することによって、masterブランチにマージされた場合にのみdeployジョブが実行されます。
以上でGitHubへpushし、テストにパスしGitHubのmasterにマージされると、CircleCIでは下記のような表示が確認できます。
より正確に手順を言うならば、ローカルにおいてmasterブランチ以外のブランチで作業し、GitHubでプルリクエストをします。もし自動化テストに失敗しているとプルリク自体は認証できません(masterへマージできない)。テストに成功しプルリクが認証され、なおかつmasterブランチにマージされると、上記で説明したdeployジョブが実行されます。
関連ページ
Github ActionsでLaravel(EC2)のデプロイ(deploy)自動化
参照ページ
GitHub および Bitbucket のインテグレーション