- AWS アカウント作成
- Dockerインストール
- docker-composeインストール
- Gitインストール
- GitHub アカウント作成
- Windowsの場合、SSH接続ができる環境の用意(Tera Termなど) (Tera Termのインストールはこちら)
- Docker
- AWS(EC2インスタンス)
- CircleCI
- Git
- Github
- Laravel(PHP)
CI/CDとは高度な継続的自動化と継続的監視をアプリケーション開発に取り組むこと、また、そのプロセスのこと
継続的インテグレーションは、コードを共有リポジトリの master ブランチに常時頻繁に統合することを奨励する開発手法です。それぞれの機能を個別にビルドして、開発サイクルの最後に統合するのではなく、各開発者のコードが 1 日に何度も共有リポジトリに統合されます。 すべての開発者が共有メインラインに毎日コミットします。コミットされるたびに、自動化されたビルドとテストがトリガーされます。ビルドやテストが失敗しても、数分以内にすばやく修復できます。 チームの生産性、効率、満足度を向上させます。 問題をすばやく検出して解決できます。 より高品質で安定したプロダクトをリリースできます。
※ CircleCi公式ドキュメントより:https://circleci.com/docs/ja/2.0/about-circleci/#section=welcome
※ 技術評論社より:https://gihyo.jp/book/pickup/2015/0045
検証されたコードのリポジトリへのリリースを自動化します。継続的デリバリーの目標は、本番環境にデプロイできるコードベースを常に保持しておくことです。 継続的デリバリーでは、コード変更のマージから本番環境対応のビルドのデリバリーまで、すべてのステージでテストの自動化とコードリリースの自動化が実施されます。このプロセスの終了時には、運用チームはアプリケーションを本番環境にすばやく簡単にデプロイできます。
成熟した CI/CD パイプラインの最終ステージは、継続的デプロイメントです。本番環境対応のビルドをコードリポジトリへ自動的にリリースする継続的デリバリーの延長として、継続的デプロイメントはアプリケーションを本番環境に自動的にリリースします。本番環境に移す前のパイプラインのステージでは手動でのチェックはないので、継続的デプロイメントは主に、入念に設計されたテスト自動化を活用します。
これだけソフトウェアが普及していくと、品質に対する要求も高くなり、今まで手動でテストしていた分野でも積極的に自動化テストを取り入れるようになってきます。なぜならCI/CDを使うと、コードの変更が発生するたびに自動でテストが行われるので、テストの実行忘れや、環境依存のテストを失くすことでの品質を向上させることができるからです。
アジャイル開発で重要なことはスピードです。より小さな粒度の変更をいかに早くテスト/リリースしてフィードバックを得るかがアジャイル開発の成功の鍵となりますが、CI/CDを使うことでこれらを実現することができます。
- 拡張性が高い。プロジェクトに合わせてカスタマイズしやすい
- オンプレ上に構築するため、IPが固定される
- ドキュメントが豊富で調査しやすい
サーバを用意する必要があるため、費用がかかる、準備に時間がかかる 本番を含めワークフローに組み込むため、導入は計画的に行う必要がある 保守・運用が必要なため管理を怠ると属人化しやすい
- Cloudであるため、サーバの管理・運用は不要になる
- Githubとの親和性高い
- ドキュメントが豊富で調査しやすい
- コンテナにsshで入れないのでデバッグしにくい
- $129がかかるため、CIをはじめて導入する際には提案しにくい
- Cloudなのでビルドの度にIPが変わる
- Cloudであるため、サーバの管理・運用は不要
- 公式のサポートが手厚い
- ドキュメントが豊富で調査しやすい
- sshでコンテナに入れるので、デバッグしやすい
- 無料で使い始められる
- Clouldなのでビルドの度に毎回IPが変わる
- GitHubまたはBitbucketとの連携が前提
※ターミナル(コマンドプロンプト)を使用します。
例:Desktopにクローンする場合
~ $ cd ~/Desktop
~/Desktop $ git clone [コピーしたURL]
適宜、自分のリポジトリの場所に置き換えてコマンド実行してください。
例:
~/Desktop/meet-up_CI-CD $ [コマンド]
ローカル内のDockerコンテナにLaravelのライブラリパッケージ等をインストールする
// リポジトリに移動する
~/Desktop $ cd ~/Desktop/meet-up_CI-CD
// コンテナを立ち上げる
~/Desktop/meet-up_CI-CD $ docker-compose up -d
~/Desktop/meet-up_CI-CD $ docker-compose exec app bash
コンテナ内に入ると、[root@06e2xxxxxx:/var/www/html# ]のような表示に変わります。ローカルの環境によって差分が出ますが全く一緒じゃなくても問題ありません。 (コンテナを実行している箇所を表示しています)
cd my-laravel-app && composer install && cp ../docker/laravel/.env .env && chmod 777 -R storage/ && php artisan key:generate && php artisan config:cache && php artisan migrate
exit
~/Desktop/meet-up_CI-CD $ docker-compose down && docker-compose up
#!/bin/bash
# Dockerをインストール
sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo chkconfig docker on
sudo usermod -a -G docker ec2-user
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo yum install -y git
// EC2にログイン
~/Desktop/meet-up_CI-CD $ ssh -i ~/.ssh/{pem key名} {ユーザー名}@{IP}
[ec2-user@ip-{プライベートIP} ~]$ git clone https://github.com/{ユーザー名}/{リポジトリ}.git
[ec2-user@ip-{プライベートIP} ~]$ cd {リポジトリ名}
[ec2-user@ip-{プライベートIP} ~ {リポジトリ名}]$ docker-compose up -d
[ec2-user@ip-{プライベートIP} ~ {リポジトリ名}]$ docker-compose exec app bash
cd my-laravel-app && composer install && cp ../docker/laravel/.env .env && chmod 777 -R storage/ && php artisan key:generate && php artisan config:cache && php artisan migrate
exit
[ec2-user@ip-{プライベートIP} ~ {リポジトリ名}]$ docker-compose restart
http://{EC2パブリックIPアドレス}
// 秘密鍵・公開鍵の作成を行う
[ec2-user@ip-{プライベートIP} ~]$ssh-keygen -m pem
// 公開鍵をauthorized_keysに追記する
[ec2-user@ip-{プライベートIP} ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
https://circleci.com/ja/vcs-authorize/
テストが開始される(各種設定前なのでFAILDになるが問題ありません)
// EC2にログイン
$ ssh -i ~/.ssh/[pem key名] [ユーザー名]@[IP]
// SSH Keyが表示される
$ cat ~/.ssh/id_rsa
① Environment Variable Name : USER_NAME
Value : EC2インスタンスのユーザー名(例:ec2-user)
② Environment Variable Name : HOST_NAME
Value : EC2インスタンスのIPアドレス
~/Desktop/meet-up_CI-CD$ git add .
~/Desktop/meet-up_CI-CD$ git commit -m "fix"
~/Desktop/meet-up_CI-CD$ git push
~/Desktop/meet-up_CI-CD$ git add .<br>
~/Desktop/meet-up_CI-CD$ git commit -m "fix"<br>
~/Desktop/meet-up_CI-CD$ git push