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通販サイト

  1. 自己紹介とか

  2. 話したいこと

  3. 構成 -Before-

  4. 構成 -After-

  5. ​Code Pipeline

  6. PHP Unit

  7. まとめ

目次

  • 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

ビルドの流れ

  1. gitにpushされたbuildspec.ymlが読み込まれる
  2. build、もしくはpost_buildフェーズにてコマンドが実行される
  3. コマンドとしてbuild.shを実行させる

 

buildspec.ymlbuild.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

  1. PHPでの単体テストをテストするツール
  2. テストをコード化する(=繰り返し実行できる)
  3. コマンドで実行できる(=自動化できる)
  4. 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