で
CI/CDしてみた話
Laravel/Vue.js勉強会#10
2019/07/18
名前 | 南島 康一 |
職種 | Webエンジニア(いろいろやる) |
所属 | 株式会社カラーズ |
得意 | AWS |
好き | IoT、スマートスピーカー、Rust、リクガメ、自転車(ロードバイク) |
Qiita | https://qiita.com/ikegam1 |
Text
Text
Text
Text
Text
私たちのパートナーである犬たちの「心と身体の健康」のための自然食フード、健康食品の販売を中心としたインターネット通販事業です。心と身体の健康のために大切な要素をしっかりとケアするための製品と情報を提供します。
自己紹介とか
話したいこと
構成 -Before-
構成 -After-
Code Pipeline
PHP Unit
まとめ
AWS化しました
CI/CDはじめました
CodePipeline使ってます
LavarelのUnit TestをCIしてます
AWS化したいひと
CI/CDはじめたいひと
CodePipeline使いたいひと
LavarelのUnit TestをCIしたいひと
https://www.redhat.com/ja/topics/devops/what-is-ci-cd
具体的には、CI/CD によって、統合およびテストのフェーズからデリバリー、デプロイメントに至る、アプリケーションのライフサイクル全体を通じて、継続的な自動化と継続的な監視が導入されます。これらの連結した作業習慣はまとめて「CI/CD パイプライン」と呼ばれ、アジャイルな方法で共同作業する開発チームと運用チームが実施します。
https://aws.amazon.com/jp/codepipeline/
AWS CodePipeline は完全マネージド型の継続的デリバリーサービスで、素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのための、パイプラインのリリースを自動化します。CodePipeline は、お客様が定義したリリースモデルに基づき、コードチェンジがあった場合のフェーズの構築、テスト、デプロイを自動化します。
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html
ビルドの流れ
※buildspec.yml、build.sh共にgitでpushされている
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
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を実行
https://readouble.com/laravel/5.5/ja/testing.html
// Featureディレクトリにテストを生成する
php artisan make:test UserTest
// Unitディレクトリにテストを生成する
php artisan make:test UserTest --unit
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だけで作ると楽
一度作ってしまえばあとは勝手に回る
テストコード大事。自分達のコードに詳しくなれる