CircleCI×Laravelでのテスト×AWSを試してみた②~自動デプロイ~

はじめに

前回の続きで、今回は自動デプロイを試していこうと思います。

CircleCI×Laravelでのテスト×AWSを試してみた

✅ゴール
・CircleCI/CDの理解を深める

✅環境
Windows

✅参考教材
💻Laravel × CircleCI × AWSで学ぶCI/CD

💻いまさらだけどCircleCIに入門したので分かりやすくまとめてみた

かなり細かく記載してくれている。

💻CircleCI で入門する Docker

自動デプロイ

✅EC2上で秘密鍵と公開鍵の作成

EC2へのSSH接続

ssh ec2-user@EC2のパブリックIPアドレス -i ~/.ssh/laravel-ci-ec2-user.pem

ユーザー切替

sudo su - webapp

webappユーザーの秘密鍵と公開鍵の作成

ssh-keygen -m pem -C ""

※-m pemは、鍵をpemという形式で作成するオプション。CircleCIに登録する際.pemにする必要があるため。

✅公開鍵をGitHubに登録

リポジトリ⇒Settings⇒Deploy keys⇒Add deploy key⇒id_rsa.pub(EC2で作成)の内容を貼り付け

cat ~/.ssh/id_rsa.pub 
>> ssh-rsa ~~~~~ // 表示された内容をコピぺする。

EC2からGitHubへのSSH接続

ssh git@github.com
>> ~~~~ // yes

HTTPS接続からSSH接続に変更

cd ~/laravel-ci
git remote -v
>> origin  https://github.com/chobi1125/laravel-ci.git (fetch)
   origin  https://github.com/chobi1125/laravel-ci.git (push)
git remote set-url origin git@github.com:chobi1125/laravel-ci.git
git remote -v
>> origin  git@github.com:chobi1125/laravel-ci.git (fetch)
   origin  git@github.com:chobi1125/laravel-ci.git (push)

※個人のGitHubアカウントに紐付くユーザーではない、システムとしてのユーザーであるwebappユーザーの鍵を発行し使用することで、個人に依存しない仕組みにしている

✅デプロイ用の秘密鍵をCircleCIに登録

CircleCIへ移動⇒Project Settings⇒SSH Keys⇒Add SSH Keysで登録

cat ~/.ssh/id_rsa // 以下全てコピペ
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
略
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-----END RSA PRIVATE KEY-----

✅デプロイ用の公開鍵で公開鍵認証可能にする(CiecleCIからSSH接続を可能にする。)

authorized_keysの作成

※webappユーザーを公開鍵で認証させるには、EC2の/home/webapp/.sshディレクトリにauthorized_keysというファイルを作成

sudo su - webapp
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys // 権限変更
ls -l ~/.ssh // 確認
>> -rw------- 1 webapp webapp  764 May 24 04:06 authorized_keys

✅CircleCIの環境変数とdeployジョブの追加

環境変数の追加

Project Settings⇒Environment Variables⇒Add Environment Variables(ValueにIPアドレス)

※リモートでmasterブランチへのマージとローカルのmasterブランチをリモートのmasterブランチの内容に反映しておく。

git branch -a //確認
>> * feature/ci_test
  master
  remotes/origin/feature/ci_test
git checkout master // masterブランチへ変更

.circleci/config.ymlが古い状態であることを確認

version: 2.1
jobs:
  build:
    docker:
      - image: circleci/php:7.3-node-browsers
    steps:
      - run: echo "Hello World"

更新

git remote -v // 更新基のリモートリポジトリの確認
>> origin  https://github.com/chobi1125/laravel-ci.git (fetch)
   origin  https://github.com/chobi1125/laravel-ci.git (push)
git fetch
git merge origin/master// config.ymlが更新されていればOK
git branch -a // 念のためブランチも確認
>>  feature/ci_test
  * master
    remotes/origin/circleci-project-setup
    remotes/origin/feature/ci_test
    remotes/origin/master

開発ブランチを新たに作成

git checkout -b feature/ssh_deploy

config.ymlの編集

※コードは割愛。教材5-6

変更をプッシュ⇒プルリクを立ててCircleCIのページ遷移のためdetailsをクリック。

git remote rm origin
git add .
git commit -m"circleci/config.ymlの編集で自動デプロイ"
git remote add origin https://github.com/chobi1125/laravel-ci.git
git push -u origin feature/ssh_deploy

CircleCIのページ上でbuild_deployをクリック。

buildジョブのみの実行で、deployジョブは実行されていないことがわかる。

GitHub上でmasterブランチへマージすると、deployジョブが実行されているのが確認できる。

僕の場合はここでエラー発生。

訳:ssh:ホスト名を解決できませんでした******************:名前またはサービスが不明です

👉環境変数の登録でIPアドレスの登録にhttp://~~~で登録してしまったことが原因でした。~~~のみ登録で解決。

以下でEC2上のファイルが変更されていることも確認

cat laravel-ci/.circleci/config.yml

✅アプリの機能を変更してデプロイチェック

ブランチを変更して試すのでGitの更新

git branch -a //確認
git checkout master // masterブランチへ変更

※.circleci/config.ymlが古い状態であることを確認

更新

git pull origin master

開発ブランチを新たに作成

git checkout -b feature/ninja

resources/views/articles/card.blade.phpを編集

<div class="card mt-3">
  <div class="card-body d-flex flex-row">
    <a href="{{ route('users.show', ['name' => $article->user->name]) }}" class="text-dark">
      <i class="fas fa-user-ninja fa-3x mr-1"></i> {{-- この行を変更(circleをninjaに変更) --}}
    </a>
{{-- 略 --}}

Dockerを停止していたら再起動する

docker-compose up -d workspace php-fpm nginx postgres

確認

プッシュ

git remote rm origin
git add .
git commit -m"circleci/config.ymlの編集とテンプレート更新でユーザーアイコンを忍者アイコンにする"
git remote add origin https://github.com/chobi1125/laravel-ci.git
git push -u origin feature/ninja

確認

おわりに

この教材を続けると6章でAWSの自動デプロイサービスCode Deployを使った別パターンのデプロイ方法を学んでいくっぽい。

7章はAWSのCodeCommit, CodeBuild, CodePipelineというサービスも組み合わせるとのこと。

5章までの内容で結構おなか一杯なのにすごい。。。

とりあえずここまでの内容を活かして自身のWebアプリをAWSにデプロイして運用してみたい。

備忘録

💻【初心者向け】git fetch、git merge、git pullの違いについて

コメントを残す