AWS, PHP

Laravel+Docker+GitHub+CircleCIでユニットテスト

 

 

EC2側作業

 

# vi /etc/sysconfig/selinux

SELINUX=disabled

 

# reboot now

 

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 

yumのパッケージインデックスを更新(Dockerのインストールやアップデート前に推奨されている)

$ sudo yum makecache fast

 

# yum list docker-ce.x86_64 --showduplicates | sort -r

 * updates: ftp.iij.ad.jp
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
 * extras: ftp.iij.ad.jp
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
 * base: ftp.iij.ad.jp
Available Packages

 

 

sudo yum install -y docker-ce-17.12.1.ce-1.el7.centos
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker

 

curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > docker-compose
sudo mv docker-compose /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

 

$ sudo docker pull nginx:latest
$ sudo docker pull mysql:5.7

 

mkdir laravel_app
touch docker-compose.yml
mkdir php nginx src
cd php

 

# vi /home/centos/docker-compose.yml


version: '2'

services:
  php: 
    build: ./php
    volumes:
      - ./src:/var/www
  
  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: testdb

 

 

$ vi /home/centos/php/Dockerfile


FROM php:7.1-fpm
COPY php.ini /usr/local/etc/php/

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

WORKDIR /var/www

RUN chown -R apache:apache /var/www/ && \
chmod -R 775 /var/www/

 

$ vi /home/centos/php/php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

 

$ vi /home/centos/nginx/default.conf


server {
    index index.php index.html;
    root /var/www;
}

 

 

$ vi /home/centos/src/index.html


Hello Laravel!

 

$ pwd
/home/centos

$ ls
docker-compose.yml  laravel_app  nginx  php  src

 

$ sudo systemctl start docker
$ sudo systemctl enable docker

 

[centos@ip-172-31-36-81 ~]$ which docker-compose
/usr/local/bin/docker-compose

 

$ sudo /usr/local/bin/docker-compose up -d --build

 

http://IPアドレス/

 

Hello Laravel!

表示された

 

 

$ vi /home/centos/src/index.php

<?php
  phpinfo();
?>

 

$ vi /home/centos/nginx/default.conf


server {
  index index.php index.html;
  root /var/www/;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

 

$ sudo /usr/local/bin/docker-compose restart

Restarting centos_nginx_1 ... done
Restarting centos_mysql_1 ... done
Restarting centos_php_1 ... done

 

# vi /home/centos/docker-compose.yml


version: '2'

services:
  php:
    build: ./php
    volumes:
      - ./src/my-app/my-app:/var/www

  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./src/my-app/my-app:/var/www
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: testdb

 

 

$ vi /home/centos/nginx/default.conf


server {
  index index.php index.html;
  root /var/www/public;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

 

実行とビルド

$ /usr/local/bin/docker-compose run php composer create-project laravel/laravel --prefer-dist /home/${USER}/src/myapp
$ sudo /usr/local/bin/docker-compose up -d --build
$ sudo /usr/local/bin/docker-compose restart

 

$ sudo chmod 744 -R /home/centos/src/my-app/my-app/storage
$ sudo chmod 744 -R /home/centos/src/my-app/my-app//bootstrap/cache

 

$ sudo yum install git
$ sudo git clone https://github.com/hoge/circleciDemo.git

—————————————————–

新規でLaravelをインストール場合

$ sudo yum install epel-release
$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum -y install --enablerepo=remi-php71 php php-cli php-devel php-common php-mbstring php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-gd php-pdo php-xml php-mcrypt  php-fpm php-opcache php-pecl-apcu


$ cd
$ sudo php -r "readfile('https://getcomposer.org/installer');" | php
$ sudo mv composer.phar /usr/local/bin/composer

—————————————————–

 

CircleCI

CircleCIにサインアップしてGitHubと連携を行っておきます。

 

version: 2 # use CircleCI 2.0

jobs: # a collection of steps
  build: # runs not using Workflows must have a `build` job as entry point
    docker: # run the steps with Docker 
      - image: circleci/php:7.1-node-browsers # ...with this image as the primary container; this is where all `steps` will run
    working_directory: ~/laravel # directory where steps will run
    steps: # a set of executable commands
      - checkout # special step to check out source code to working directory
      - run: sudo apt install -y libsqlite3-dev zlib1g-dev
      - run: sudo docker-php-ext-install zip
      - run: sudo composer self-update
      - restore_cache: # special step to restore the dependency cache if `composer.lock` does not change
          keys:
            - composer-v1-{{ checksum "composer.lock" }}
            # fallback to using the latest cache if no exact match is found (See https://circleci.com/docs/2.0/caching/)
            - composer-v1-
      - run: composer install -n --prefer-dist
      - save_cache: # special step to save the dependency cache with the `composer.lock` cache key template
          key: composer-v1-{{ checksum "composer.lock" }}
          paths:
            - vendor
      - restore_cache: # special step to restore the dependency cache if `package.json` does not change
          keys:
            - node-v1-{{ checksum "package.json" }}
            # fallback to using the latest cache if no exact match is found (See https://circleci.com/docs/2.0/caching/)
            - node-v1-
      - run: yarn install
      - save_cache: # special step to save the dependency cache with the `package.json` cache key template
          key: node-v1-{{ checksum "package.json" }}
          paths:
            - node_modules
            
      - run: vendor/phpunit/phpunit/phpunit tests/
      
      - run: touch storage/testing.sqlite 
      - run: php artisan migrate --env=testing --database=sqlite_testing --force
      - run: ./vendor/bin/codecept build
      - run: ./vendor/bin/codecept run

 

$ cd /home/centos/src/my-app/my-app

$ vendor/bin/phpunit
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 146 ms, Memory: 14.00MB

 

Laravel側作業

Laravel側で下記でアクセス出来るようにルーティングを行っていて下さい。

  • http://IPアドレス/
  • http://IPアドレス/hello

今回は触れません。

 

 

PHPUnit用テストコード

$ vi /home/centos/src/my-app/my-app/tests/Feature/HelloTest.php

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class HelloTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testHello()
    {
        $this->assertTrue(true);

        //$response = $this->get('/');
        //$response->assertStatus(404);

        $response = $this->get('/hello');
        $response->assertStatus(200);

        //$msg = "Hello";
        //$this->assertEquals('Hello', $msg);
    }
}

/helloにルーティング出来るか確かめるものです。

 

GitHubにプッシュすると

$ sudo git add . --ignore-removal
$ sudo git commit -m "testv3-badrouting"
$ sudo git push origin master

 

流れ

  • EC2 → GitHub → CircleCI
    CircleCIでテストが走ってテストが単体出来る

 

更にAWS CodeDeployとも携すればCI/CDとなる
EC2 → GitHub → CircleCI → AWS CodeDeploy

 

 

参考サイト

@see https://tanaken.me/web/199

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)