クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

Composerの実行速度が遅い

概要

phpenvで開発環境を構成して使っていて、いつからか分からないがComposerのパッケージのダウンロードを含めて動作が遅くなりました。色々資料を調べた内容を纏めてみました。

Composerのアップデート

バージョンが1.2.X系であれば1.3.X系にバージョンアップする事をオススメします。composer自体の更新は下記のコマンドで実行出来ます。

$ composer self-update

packagistのミラーサーバを日本国内のサーバに変更

原因としては以下の三つだようです。

  • packagist.orgが日本から遠い
  • composerのアーキテクチャ的に、小さなjsonファイルを少しずつダウンロードするため、ネットワークの遅延がもろに影響する
  • composerがfile_get_contentsでjsonをダウンロードしていて、どうやらKeep-Aliveを使っていないし、並列ダウンロードもしていない

日本国内のサーバに変更する事でダウンロードの高速化を図ります。

% composer config -g repos.packagist composer https://packagist.jp

戻すときは以下のコンマンドを実行します。

% composer config -g --unset repos.packagist

Composerプラグインによる高速化

prestissimoというcomposerプラグインを利用する方法です。これは「packagistのミラーサーバを日本国内のサーバに変更」に記載した下記の問題を解消する為のプラグインのようです。

% composer global require hirak/prestissimo

9.改善された開発環境を作成

こちらで公開しております。

https://bitbucket.org/FattyRabbit/docker-local-server/src/44ef00fc746dd683f8e42827300a533b2b3ad751/?at=releases%2Fphp-fpm_out_centos

bitbucket.org

前回の問題点

公開した「8.開発環境の完成」で複数のphp-fpmが一個のCentosに入ることで以下の問題点がありました。

  • 複数のphp-fpmのphpenvを利用したBuildが時間が掛かるし、Build設定などを調査して対応しないと行けない
  • 複数のphp-fpmをインストールするために色んなライブラリーやモジュールをインストールが必要でCentosが重くなる
  • 複数のphp-fpmで必要なライブラリーやモジュールのバージョンの違いでエラーが出る場合があって対応する必要がある
  • 必要がなくなったバージョンや新しくバージョンのインストールでウェブサーバーのDockerfileを修正・ビルドする場合がある

解決案

複数のphp-fpmを各自コンテイナーで動かしてサービスをしてCentosのbuild時間や負荷を減らしました。

ウェブ(Centos

php-fpmを複数インストールするためにanyenvやライブラリー部分を全部削除して最小限でDockerfileを作りました。

FROM centos:7
MAINTAINER kugyon.i <fatty.rabbit.75@gmail.com>

# Declare Arguments
ARG SERVER_NAME=local

# TimeZoneの設定
RUN rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo "LC_ALL=ja_JP.UTF-8" >> /etc/environment && \
    echo "LC_CTYPE=ja_JP.UTF-8" >> /etc/environment && \
    echo "LANG=ja_JP.UTF-8" >> /etc/environment
RUN localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP

# yumアップデート
RUN yum -y update
RUN yum -y remove httpd httpd.x86_64 httpd-tools.x86_64

# install leatest apache2.4.*
RUN yum install -y epel-release && \
    yum -y install https://repo.ius.io/ius-release-el7.rpm && \
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/ius.repo && \
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/epel.repo
RUN yum --enablerepo=epel -y install nghttp2 && \
    yum -y install epel-release && \
    yum -y install mailcap system-logos && \
    yum -y install openssl wget && \
    # Installing packages required for httpd 2.4.41
    wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/b/brotli-1.0.7-5.el7.x86_64.rpm && \
    rpm -Uvh brotli-1.0.7-5.el7.x86_64.rpm && \
    yum -y install brotli && \
    yum -y --disablerepo=base,extras,updates --enablerepo=ius install httpd mod_ssl && \
    yum clean all
RUN sed -i -e "s|LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|" /etc/httpd/conf.modules.d/00-mpm.conf && \
    sed -i -e "s|#LoadModule mpm_event_module modules/mod_mpm_event.so|LoadModule mpm_event_module modules/mod_mpm_event.so|" /etc/httpd/conf.modules.d/00-mpm.conf
RUN sed -i -e "s|LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|" /etc/httpd/conf/httpd.conf && \
    sed -i -e "s|#LoadModule mpm_event_module modules/mod_mpm_event.so|LoadModule mpm_event_module modules/mod_mpm_event.so|" /etc/httpd/conf/httpd.conf
# make SSL server certificate
RUN mkdir -p /etc/ssl/private && \
    openssl req -new -newkey rsa:2048 -nodes -out /etc/ssl/private/server.csr -keyout /etc/ssl/private/server.key -subj "/C=JP/ST=TOKYO/L=SHIBUYA/O=Wiz Inc./OU=/CN=*.${SERVER_NAME}" && \
    openssl x509 -days 36500 -req -signkey /etc/ssl/private/server.key -in /etc/ssl/private/server.csr -out /etc/ssl/private/server.crt

COPY conf.d/vhosts.conf /etc/httpd/conf.d/vhosts.conf

RUN systemctl enable httpd

追加コンテイナー

複数php-fpm

出来ればdockerhubであるイメージをそのまま利用したかったですが、使用するモジュールによって設定が必要なのでDockerfileを作成しました。以下の7.1のDockerfileです。

FROM php:7.1-fpm

ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes

RUN apt-get update
RUN apt-get install -y wget libjpeg-dev libfreetype6-dev
RUN apt-get install -y gcc make libjpeg-dev zlib1g-dev mariadb-client libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev libzip-dev \
  && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install -j$(nproc) gd zip mysqli pdo_mysql bcmath

RUN pecl install xdebug \
  && docker-php-ext-enable xdebug

#Composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

COPY php.ini /usr/local/etc/php/

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

busybox

速度の改善で入れました。実際どのくらい影響されているかは計測しておりません。

mailhog

メールsmtpのコンテイナーです。テスト環境でテストメールの確認で便利です。

完成docker-compose.yml

version: "3"
services:
  datastore:
    image: busybox
    container_name: datastore
    volumes:
      - ../web_root:/var/www:rw
      - ./dba/mysql:/var/lib/mysql
  web:
    image: web
    build:
      context: ./web
      dockerfile: Dockerfile
    container_name: web
    ports:
      - "80:80"
      - "443:443"
    command: /sbin/init
    volumes:
      - ../web_root:/var/www:rw
      - ./web/conf.d/extra:/etc/httpd/conf.d/extra:ro
    tty: true
    stdin_open: true
    privileged: true
    restart: always
    external_links:
      - "php7.1-fpm"
      - "php7.2-fpm"
      - "php7.3-fpm"
      - "php7.4-fpm"
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.2

  dba:
    image: dba-mariadb
    build:
      context: ./dba
      dockerfile: Dockerfile
    container_name: dba
    ports:
      - "3306:3306"
    volumes:
      - ./dba/my.cnf:/etc/my.cnf
      - ./dba/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_ROOT_HOST: "172.16.0.%"
      TZ: Asia/Tokyo
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.3

  dns:
    image: andyshinn/dnsmasq
    container_name: dns
    ports:
      - "53:53/udp"
      - "53:53/tcp"
    volumes:
      - ./dns/dnsmasq.conf:/etc/dnsmasq.conf
      - ./dns/hosts-dnsmasq:/etc/hosts-dnsmasq
    restart: always
    cap_add:
      - NET_ADMIN
    networks:
      local-server-net:
        ipv4_address: 172.16.0.4

  mailhog:
    image: mailhog/mailhog:latest
    container_name: mailhog
    ports:
      - "1025:1025"
      - "8025:8025"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.5

  php7.1:
    image: fpm-php:7.1
    build:
      context: ./php-fpm
      dockerfile: 7.1_Dockerfile
    container_name: php7.1-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.6

  php7.2:
    image: fpm-php:7.2
    build:
      context: ./php-fpm
      dockerfile: 7.2_Dockerfile
    container_name: php7.2-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.7

  php7.3:
    image: fpm-php:7.3
    build:
      context: ./php-fpm
      dockerfile: 7.3_Dockerfile
    container_name: php7.3-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.8

  php7.4:
    image: fpm-php:7.4
    build:
      context: ./php-fpm
      dockerfile: 7.4_Dockerfile
    container_name: php7.4-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.9

networks:
  local-server-net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.0.0/24

GithubのActionsでRsyncを利用したデプロイ

前提条件

  • 簡単なPhpやHtmlで構成されたプロジェクト
  • composerを利用してないプロジェクト
  • Rsyncが利用出来るサーバー

要求内容

  • Rsyncでgitのソースをサーバーにアップ
  • ソースのデプロイした後に簡単にサーバーでコンマンドを実行
  • Staging・本番環境の関係なくデプロイはbranchのpushで自動デプロイ

事前設定

Githubの設定

利用するレポジトリの「Settings > Secrets」に入って、サーバーへ接続情報を登録します。

f:id:FattyRabbit:20201230130350p:plain

SSH用の鍵を登録

  • Name:SSH_PRIVATE_KEY
  • Value:ローカルのDeployerで使用している鍵(.pubでない方)の中身をコピーして入れる

SSH用のユーザー名を登録

  • Name:SSH_USERNAME
  • Value:ログインID

SSH用のHostを登録

Actionsのworkflowを作成

対象リポジトリの「Actions」に入って新しくTempleteを利用して作成しても良いです。

トリガー

要求内容にも書いてますが、簡単なプロジェクトを想定しているのでStaging・本番環境の関係なくデプロイはbranchのpushで自動デプロイします。

name: deploy dev

on:
  push:
    branches:
      - deploy/*

もし本番を手動でしたい場合は「GithubのActionsでLaravelのデプロイ」をご参考してください。

fatty-rabbit.hatenablog.com

環境変数の定義

二つのブランチ(Staging、Production)についての変数を設定します。

  steps:
      - uses: actions/checkout@v2
      - name: Set staging env
        if: github.ref == 'refs/heads/deploy/staging'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::Staging用のDirecotry

      - name: Set production env
        if: github.ref == 'refs/heads/deploy/pro'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::本番用のDirecotry

Rsyncでソースのアップ

今回は「trendyminds/github-actions-rsync」を利用しますが、「ubuntu-latest」を利用するので直接に書いても大丈夫です。

      - name: Deploy by rsync
        uses: trendyminds/github-actions-rsync@master
        with:
          RSYNC_OPTIONS: -avzr --delete --exclude-from=.rsyncignore
          RSYNC_TARGET: $RSYNC_TARGET
          RSYNC_SOURCE: $RSYNC_SOURCE
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
          SSH_HOSTNAME: ${{ secrets.SSH_HOSTNAME }}

「.rsyncignore」のファイルで対象外のファイルを定義して利用しています。

SSH接続情報の設定

速度の改善するためにCacheをする方法を入れました。情報の設定はCacheがない場合のみに作成する感じです。

      - name: Cache ssh config
        id: cache-ssh-config
        uses: actions/cache@v1
        with:
          path: /home/runner/.ssh
          key: ${{ runner.os }}-ssh-config-${{ hashFiles('/home/runner/.ssh/private-key-for-deploy') }}
          restore-keys: |
            ${{ runner.os }}-ssh-config-

      - name: Make ssh config
        if: steps.cache-ssh-config.outputs.cache-hit != 'true'
        run: |
          mkdir -p /home/runner/.ssh
          touch /home/runner/.ssh/private-key-for-deploy
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > /home/runner/.ssh/private-key-for-deploy
          chmod 600 /home/runner/.ssh/private-key-for-deploy
          ssh-keyscan ${{ secrets.SSH_HOSTNAME }} >> ~/.ssh/known_hosts

SSHを利用してサーバーでコマンドを実行

こちらについては「appleboy/ssh-action」を使うかと思いましたが、Actionsの環境変数をscript設定に反映するのが上手く行かなかったので直接書くことにしました。

上手く行かなかった定義です。

      - name: Multiple command
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOSTNAME }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          envs: RSYNC_TARGET
          script_stop: false
          script: |
            cd $RSYNC_TARGET

こちらが直接書いた内容です。

      - name: Make shell
        run: |
          touch ./ssh-script.sh
          echo "cd $RSYNC_TARGET" >> ssh-script.sh
          echo "ls -al" >> ssh-script.sh
          cat ssh-script.sh

      - name: Excute shell
        run: |
          ssh -i ~/.ssh/private-key-for-deploy ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOSTNAME }} 'bash -s' < ./ssh-script.sh

完成された定義

name: deploy dev

on:
  push:
    branches:
      - deploy/*

jobs:

  deploy:
    name: deploy
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set staging env
        if: github.ref == 'refs/heads/deploy/staging'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::Staging用のDirectory

      - name: Set production env
        if: github.ref == 'refs/heads/deploy/pro'
        run: |
          echo ::set-env name=RSYNC_SOURCE::/
          echo ::set-env name=RSYNC_TARGET::本番用のDirectory

      - name: Deploy by rsync
        uses: trendyminds/github-actions-rsync@master
        with:
          RSYNC_OPTIONS: -avzr --delete --exclude-from=.rsyncignore
          RSYNC_TARGET: $RSYNC_TARGET
          RSYNC_SOURCE: $RSYNC_SOURCE
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
          SSH_HOSTNAME: ${{ secrets.SSH_HOSTNAME }}

      - name: Cache ssh config
        id: cache-ssh-config
        uses: actions/cache@v1
        with:
          path: /home/runner/.ssh
          key: ${{ runner.os }}-ssh-config-${{ hashFiles('/home/runner/.ssh/private-key-for-deploy') }}
          restore-keys: |
            ${{ runner.os }}-ssh-config-

      - name: Make ssh config
        if: steps.cache-ssh-config.outputs.cache-hit != 'true'
        run: |
          mkdir -p /home/runner/.ssh
          touch /home/runner/.ssh/private-key-for-deploy
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > /home/runner/.ssh/private-key-for-deploy
          chmod 600 /home/runner/.ssh/private-key-for-deploy
          ssh-keyscan ${{ secrets.SSH_HOSTNAME }} >> ~/.ssh/known_hosts

      - name: Make shell
        run: |
          touch ./ssh-script.sh
          echo "cd $RSYNC_TARGET" >> ssh-script.sh
          echo "ls -al" >> ssh-script.sh
          cat ssh-script.sh

      - name: Excute shell
        run: |
          ssh -i ~/.ssh/private-key-for-deploy ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOSTNAME }} 'bash -s' < ./ssh-script.sh

8.開発環境の完成

完成しました。こちらで公開しております。

https://bitbucket.org/FattyRabbit/docker-local-server/src/45851c668f59982511278d4cf98a0184eb9d668e/?at=releases%2Fphp-fpm_in_centos

bitbucket.org

当初考えていた内容との差

DNSのコンテイナー

最初書いていた内容からhost情報を設定ファイルにまとめて定義する方法に変更。hosts-dnsmasq.sampleをコピーしてhosts-dnsmasqを作成します。

127.0.0.1  local
127.0.0.1  73.local

プライベートIPアドレスの逆引を上位のDNSへ問い合わせしない。

# Do not use /etc/hosts as nameserver
no-resolv

# Use this file as a hosts file
addn-hosts=/etc/hosts-dnsmasq

# プライベートIPアドレスの逆引を上位のDNSへ問い合わせしない(無駄なので)
bogus-priv

# Log all dns queries
log-queries

ウェブサーバー

DockfileがphpenvでインストールするVersionの変更や実行位置を変更して効率よくしました。

vhosts.conf.sampleをコピーしてvhosts.confを作成します。

Include conf.d/extra/7.3_virtual.conf

phpenvの新しいVersionのインストール用のShellをshellsフォールドを作成して入れました。

まだまだ改善します。

GithubのActionsでLaravelのデプロイ

背景

既にBitbucketのpipelineを使用してLaravelのアプリをデプロイしていましたが、Githubではどのように実装したら良いか試してみました。

前提条件

  • Laravelをローカルでデプロイヤーとしてdeployerを利用している(公開鍵を利用)

要求内容

  • ローカルでのdeployerを利用するデプロイはそのまま使用可能
  • Actionsを利用したデプロイもdeployerを利用
  • Staging環境のデプロイはbranchのpushで自動デプロイ
  • 本番環境のデプロイは手動デプロイ

事前設定

Githubの設定

利用するレポジトリの「Settings > Secrets」に入って、「New secret」クリックし公開鍵を登録します。

f:id:FattyRabbit:20201230124617p:plain

  • Name:SSH_DEPLOY_KEY
  • Value:ローカルのDeployerで使用している鍵(.pubでない方)の中身をコピーして入れる

f:id:FattyRabbit:20201230124708p:plain

サーバー(対象)

CIで実装されるので、前提条件で書いた公開鍵を利用したsshの接続することと同様にDeployerの実行の中でGithubからのソースのcloneする際にもパスワードが入力しなくても可能にする必要が有ります。

サーバーで以下の作業が必要です。

公開鍵の作成

鍵を入れるフォルダに移動しましょう。

$cd ~/.ssh

はじめて鍵を生成するときは何もないはずです。次のコマンドで鍵を生成します。

$ssh-keygen -t rsa

他のオプションを利用しても良いですが、ここでは一番簡単な感じでやります。

$ ssh-keygen -t rsa 
Generating public/private rsa key pair. 
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

鍵のファイル名やパスワードを聞かれますが、3回エンターを押して飛ばします。 id_rsaとid_rsa.pubの2つの鍵が生成されます。既にid_rsaが存在する人は上書きされてしまうので注意です。

鍵の登録

Githubに入って上記で作成した鍵を登録します。https://github.com/settings/sshで公開鍵の設定が出来ます。

ローカルのデプロイでも使用していれば既に登録されている物があると思います。画面右上の「Add SSH key」のボタンを押します。

f:id:FattyRabbit:20201230125126p:plain

  • Title:公開鍵名(任意)
  • Key:公開鍵の中身

なお、鍵の中身のクリップボードへのコピーは以下の感じです。鍵の名前は自分の作成したもの

$ pbcopy < ~/.ssh/id_rsa.pub (Mac)
$ clip < ~/.ssh/id_rsa.pub (Windows)

接続のテスト

サーバーで以下を実行してみます。

$ ssh -T git@github.com
Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.

で返ってきたら接続が可能とことです。

しかし、鍵を作るときに名前を指定していれば、うまくいかないかもしれません。それは、ssh接続の際「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」しかデフォルトでは見にいかないからです。 それに対応するためには~/.ssh/configを作成し、以下の内容を追記します。

Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa #ここに自分の鍵のファイル名
  User git

テスト

$ ssh -T github

Actionsのworkflowを作成

対象リポジトリの「Actions」に入って新しくTempleteを利用して作成しても良いです。

トリガー

Staging

Stagingは要求内容にも書いてますが、特にエンジニアーが管理する必要がないかと思いましてgitにPushするタイミングでデプロイが動くと良いかと思いました。

name: deploy dev

on:
  push:
    branches:
      - deploy/dev

production

本番の場合はGitのPushミス等の可能性でエンジニアーが手動でする必要があるかと思いましたので、以下のトリガーにしました。

name: deploy pro

on:
  workflow_dispatch:
    branches:
      - deploy/pro

テスト

他の記事や資料、Githubのテンプレートではphpunitを利用する例が多です。

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit

でも今回はウェブの状態を確認するように構成してみました。以下のように書きました。

jobs:
  test:
    name: serve test
    runs-on: ubuntu-latest

    services:
      mysql:
        image: mariadb:10.4.11
        ports:
          - 3306:3306
        options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10
        env:
          MYSQL_ROOT_PASSWORD: pass
          MYSQL_DATABASE: db_sample

    env:
      DB_CONNECTION: mysql
      DB_HOST: 127.0.0.1
      DB_PORT: 3306
      DB_DATABASE: db_sample
      DB_USERNAME: root
      DB_PASSWORD: pass

    steps:
      - uses: actions/checkout@v2
      - name: cache vendor
        id: cache
        uses: actions/cache@v1
        with:
          path: ./vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-
      - name: composer install
        if: steps.cache.outputs.cache-hit != 'true'
        run: composer install -n --prefer-dist
      - name: copy .env
        run: cp .env.ci .env
      - name: generate key
        run: php artisan key:generate
      - name: Directory Permissions
        run: chmod -R 777 storage bootstrap/cache
      - name: migrate
        run: php artisan migrate
      - name: run serve
        run: |
          php artisan serve &
          sleep 5
      - name: test
        run: curl -vk http://localhost:8000

.env.ciファイルは既存のローカル環境で使用している物を再利用しました。

デプロイ

jobかstepに以下のような条件で分けることで共通化も可能でしたが、今回トリガーで分けるのでファイル次第が別にするしかなかったです。

if: github.ref == 'refs/heads/deploy/staging' <- ブランチが「deploy/staging」の場合

以下になりました。

  deploy:
    name: deploy
    runs-on: ubuntu-latest
    needs: test

    steps:
      - uses: actions/checkout@v2
      - name: cache vendor
        id: cache
        uses: actions/cache@v1
        with:
          path: ./vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-
      - name: composer install
        if: steps.cache.outputs.cache-hit != 'true'
        run: composer install -n --prefer-dist
      - name: ssh_key copy
        run: |
          mkdir -p /home/runner/.ssh
          touch /home/runner/.ssh/deployerで設定されているファイル名
          echo "${{ secrets.SSH_DEPLOY_KEY }}" > /home/runner/.ssh/deployerで設定されているファイル名
          chmod 600 /home/runner/.ssh/deployerで設定されているファイル名
      - name: add known hosts
        run: ssh-keyscan サーバーIP >> ~/.ssh/known_hosts
      - name: install deploy
        run: |
          curl -LO https://deployer.org/deployer.phar
          mv deployer.phar ./deployer/dep
          chmod +x ./deployer/dep
      - name: deploy dev
        run: cd ./deployer && ./dep deploy dev -vvv
  • .deployer:deployerの設定が入っているフォルダーで、laravelプロジェクト/deployerの感じで設定されている状況です。
  • dep deploy dev:deployerで設定されているstage名「->stage('dev')」です。

課題

本番のデプロイをトリガーで手動でしているのでファイルが別々になって共通的な部分が再利用されない状況です。手動でデプロイする他の方があるかとjob等を他のymlファイルをインクルード等出来れば良いかと思いました。