Laravel + AWS
で
CI/CDしてみた話
Laravel/Vue.js勉強会#10
2019/07/18
自己紹介
名前 | 南島 康一 |
職種 | Webエンジニア(いろいろやる) |
所属 | 株式会社カラーズ |
得意 | AWS |
好き | IoT、スマートスピーカー、Rust、リクガメ、自転車(ロードバイク) |
Qiita | https://qiita.com/ikegam1 |
Text
Text
Text
Text
Text
私たちのパートナーである犬たちの「心と身体の健康」のための自然食フード、健康食品の販売を中心としたインターネット通販事業です。心と身体の健康のために大切な要素をしっかりとケアするための製品と情報を提供します。
GREEN DOG通販サイト
-
自己紹介とか
-
話したいこと
-
構成 -Before-
-
構成 -After-
-
Code Pipeline
-
PHP Unit
-
まとめ
目次
-
AWS化しました
-
CI/CDはじめました
-
CodePipeline使ってます
-
LavarelのUnit TestをCIしてます
話したいこと
-
AWS化したいひと
-
CI/CDはじめたいひと
-
CodePipeline使いたいひと
-
LavarelのUnit TestをCIしたいひと
聞いてほしいひと
構成 -Before-
構成 -After-
構成 -Container-
CI/CDって?
https://www.redhat.com/ja/topics/devops/what-is-ci-cd
具体的には、CI/CD によって、統合およびテストのフェーズからデリバリー、デプロイメントに至る、アプリケーションのライフサイクル全体を通じて、継続的な自動化と継続的な監視が導入されます。これらの連結した作業習慣はまとめて「CI/CD パイプライン」と呼ばれ、アジャイルな方法で共同作業する開発チームと運用チームが実施します。
CodePipelineって?
https://aws.amazon.com/jp/codepipeline/
AWS CodePipeline は完全マネージド型の継続的デリバリーサービスで、素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのための、パイプラインのリリースを自動化します。CodePipeline は、お客様が定義したリリースモデルに基づき、コードチェンジがあった場合のフェーズの構築、テスト、デプロイを自動化します。
Code Pipeline
CodeBuild
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html
ビルドの流れ
- gitにpushされたbuildspec.ymlが読み込まれる
- build、もしくはpost_buildフェーズにてコマンドが実行される
- コマンドとしてbuild.shを実行させる
※buildspec.yml、build.sh共にgitでpushされている
buildspec.yml
version: 0.2
run-as: Linux-user-name
env:
variables:
key: "value"
key: "value"
parameter-store:
key: "value"
key: "value"
phases:
install:
run-as: Linux-user-name
runtime-versions:
runtime: version
runtime: version
commands:
- command
- command
finally:
- command
- command
pre_build:
run-as: Linux-user-name
commands:
- command
- command
finally:
- command
- command
build:
run-as: Linux-user-name
commands:
- command
- command
finally:
- command
- command
post_build:
run-as: Linux-user-name
commands:
- command
- command
finally:
- command
- command
artifacts:
files:
- location
- location
name: artifact-name
discard-paths: yes
base-directory: location
secondary-artifacts:
artifactIdentifier:
files:
- location
- location
name: secondary-artifact-name
discard-paths: yes
base-directory: location
artifactIdentifier:
files:
- location
- location
discard-paths: yes
base-directory: location
cache:
paths:
- path
- path
build.sh
cp ./laravel/.env.example ./laravel/.env
if [ $stage = "Develop" ]; then
echo "T_DB_HOST=${D_EC_DATABASE_HOST}" >> ./laravel/.env
echo "T_DB_PASSWD=${D_EC_DATABASE_PASSWORD}" >> ./laravel/.env
...
else
echo "T_DB_HOST=${D_EC_DATABASE_HOST}" >> ./laravel/.env
echo "T_DB_PASSWD=${D_EC_DATABASE_PASSWORD}" >> ./laravel/.env
...
fi
docker build -f Dockerfile_Laravel -t $IMAGE_REPO_NAME .
docker tag $IMAGE_REPO_NAME:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/${IMAGE_REPO_NAME}:latest
docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/${IMAGE_REPO_NAME}:latest
docker build -f Dockerfile_Nginx -t $IMAGE_REPO_NAME2 .
docker tag $IMAGE_REPO_NAME2:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/${IMAGE_REPO_NAME2}:latest
docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/${IMAGE_REPO_NAME2}:latest
docker run --privileged --rm ${IMAGE_REPO_NAME} ./vendor/bin/phpunit
if [ $? = 0 ]; then
echo "正常終了"
return 0
else
imageDigest=$(aws ecr batch-delete-image --repository-name $IMAGE_REPO_NAME --image-ids imageTag=latest | jq '.failures[0].imageDigest')
echo $imageDigest
aws ecr batch-delete-image --repository-name $IMAGE_REPO_NAME --image-ids imageDigest=$imageDigest
return 1
fi
コンテナを指定してphpunitを実行
PHP Unit
- PHPでの単体テストをテストするツール
- テストをコード化する(=繰り返し実行できる)
- コマンドで実行できる(=自動化できる)
- Laravelでもすぐ使える
Lavavelで使う
https://readouble.com/laravel/5.5/ja/testing.html
// Featureディレクトリにテストを生成する
php artisan make:test UserTest
// Unitディレクトリにテストを生成する
php artisan make:test UserTest --unit
Lavavelで使う
https://readouble.com/laravel/5.5/ja/testing.html
<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ExampleTest extends TestCase
{
/**
* 基本的なテスト例
*
* @return void
*/
public function testBasicTest()
{
$this->assertTrue(true);
}
}
テスト正常時
CodePileline > CodeBuild
テスト失敗時
CodePileline > CodeBuild
今後
-
テストコード実装
-
pullreq driven
-
pipelineの管理ももっとコード化したい
-
EKS使いたい
まとめ
-
AWSだけで作ると楽
-
一度作ってしまえばあとは勝手に回る
-
テストコード大事。自分達のコードに詳しくなれる
ご清聴ありがとうございました。
Laravel + AWS で CI/CDしてみた話
By Koichi Minamijima
Laravel + AWS で CI/CDしてみた話
Laravel/Vue.js勉強会#10
- 5,583