
GitlabのCI/CDをLaravelのEnvoyとともに試す
GitLabのプロジェクト直下でNew fileをして、Templateから
.gitlab-ci.yml > Laravel
と選択します。これを元に.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をデプロイします。
鍵の準備
話がややこしいのですが、鍵を下記の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が走り、デプロイが完了します。