GitlabのCI/CDをLaravelのEnvoyとともに試す

GitLabのプロジェクト直下でNew fileをして、Templateから
.gitlab-ci.yml > Laravel
と選択します。これを元に.gitlab-ci.ymlを作成していきます。

gitlab-ci.yml

ざっとコマンドを眺めると注意してみておく箇所は下記ですかね

  • MYSQL_DATABASE: project_name
  • MYSQL_ROOT_PASSWORD: secret
  • cp .env.testing .env

.env.testingが必要なことがわかります。DBの内容を.gitlab-ci.ymlと合わせて変更します。今回は単純に「ci-cd」というプロジェクト名にしました。

編集ファイル: .gitlab-ci.yml

  • 主な変更箇所
    • php:latest → php:7.2
    • mysql:latest → mysql:5.7

編集ファイル: .env.testing

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=ci-cd
DB_USERNAME=root
DB_PASSWORD=secret

とりあえずこれをプッシュしてgitlabのメニューよりPipelinesを覗いてみましょう。

形だけですが、CIが完成しました。

デプロイする

今回はGitlabからssh経由でEnvoyを使用してLaravelをデプロイします。

鍵の準備

CI-CD-schematic-diagram

話がややこしいのですが、鍵を下記の2つ用意しないといけません。

  • GitLab→サーバー
    • デプロイコマンドをEnvoyで叩くため
  • サーバー→Gitlab
    • サーバー側からgit pullのため

GitLabに鍵を置くのは下記のように登録します。

  • 秘密鍵→設定のCI/CDからvariablesで
  • 公開鍵→設定のリポジトリからdeploy keyとして

鍵の作成

RSAでもいいのですが、最近は ED25519 というアルゴリズムを使うのがセキュリティ的に良いみたいなので下記のようにしました。

mkdir ~/.ssh
chmod 700 .ssh
ssh-keygen -t ed25519 -C "gitlab-key@project.com"
chmod 600 id_ed25519

参考:
GitLab and SSH keys | GitLab

.gitlab-ci.ymlの設定

gitlab-ci.ymlを書いていきます。下記のような設定です。

  • gitをインストール(composer installとかで怒られるので)
  • comopserのインストール
  • ssh-addで秘密鍵を登録、秘密鍵はgitlabのCI/CD設定の変数より
  • envoyを実行

編集ファイル: .gitlab-ci.yml

deploy_staging:
  only: 
    - master
  stage: deploy
  before_script:
    # Update packages
    - apt-get update -yqq

    # install git
    - apt-get install git -yqq # gitがないとenvoyのrequireで怒られたので
    
    # install composer
    - curl -sS https://getcomposer.org/installer | php
    - php composer.phar install 
  script:
    # Add the private SSH key to the build environment 
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

    # run envoy
    - php composer.phar global require laravel/envoy
    - ~/.composer/vendor/bin/envoy run deploy # deployはEnvoy.blade.phpに記述したタスク名

  environment:
    name: production
    url: http://product-url.com

Laravelのデプロイ設定(Envoy.blade.php)

今回はサーバー側でdeployerユーザーを作成して、sshで接続できるようにしてEnvoyを実行しました。

編集ファイル: Envoy.blade.php

{{-- -p [port番号]はsshのport番号を変更してなければ不要 --}}
@servers(['web' => 'deployer@[ipアドレス] -p [port番号]'])
@task('deploy', ['on' => 'web'])
	cd /var/www/app

	{{-- git --}}
    git pull origin master

    {{-- composer --}}
    composer install --optimize-autoloader --no-dev

    {{-- artisan --}}
    php artisan config:cache
	php artisan migrate
	php artisan db:seed

	{{-- node --}}
	npm run production
@endtask

これらを設定することでGitLabのmasterにプッシュすると自動でCI/CDが走り、デプロイが完了します。

参考リンク