LaravelアプリをCircleCIを利用してGithubからHerokuに自動デプロイする
今回は、CircleCIを利用してGithubにpushした際に、Herokuへ自動デプロイできるようにしたいと思います。
[ 目次 ]
はじめに
こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。
今回は、CircleCIを利用してGithubにpushした際に、Herokuへ自動デプロイできるようにしたいと思います。
以前投稿した「HerokuにLaravelをデプロイする方法」の続きにとしてLaravelアプリをデプロイします。
※ Herokuについては過去の記事をご確認ください。
【前提】
- Laravelアプリが既にHerokuにデプロイできる状態になっていること
- CircleCIにアカウントを作成し、github連携ができていること
- CircleCI 2.0を利用する
CircleCIとは
CircleCIとは、継続的インテグレーション(デリバリー)サービスです。
コミットからデプロイまでのパイプラインを作成し、継続的な統合/配信を使用してソフトウェア開発プロセスを自動化できます。
上記は、クラウドサービス/CircleCIとは からの引用
githubやbitbucketへのpushをトリガーにして、インテグレーションやデプロイを行うことができるクラウドサービスです。今回はこの機能を利用して、Herokuにデプロイしてみたいと思います。
CircleCIにてプロジェクトを追加&セットアップ
CircleCIのダッシュボードから"ADD PROJECTS"を選択し、プロジェクトを追加します。
プロジェクト追加ページには、連携しているgithubのリポジトリ一覧が表示されています。対象リポジトリの"Set Up Project"ボタンを押下してください。
続いてプロジェクトをセットアップしていきます。
- Operating System: Linux
- Language: PHP(今回は、Laravelアプリを利用する為)
を設定してください。
続けてgithubのリポジトリにCircleCIのファイルを用意します。
以下のコマンドから.circleci/config.yml
を用意しましょう。
$ mkdir -p .circleci
$ touch .circleci/config.yml
.circleci/config.yml
の内容は、プロジェクトのセットアップページに表示されているものを参考にしつつご自身のアプリの環境に合わせて修正してください。
今回作成したファイルは以下になります。
version: 2
jobs:
build:
docker:
- image: circleci/php:7.2-node-browsers
steps:
- checkout
- run: sudo apt update
- run: sudo docker-php-ext-install zip
- run: sudo pecl channel-update pecl.php.net
- run: sudo pecl install mongodb
- run: echo 'extension=mongodb.so' | sudo tee /usr/local/etc/php/conf.d/mongodb.ini
- restore_cache:
keys:
- v1-dependencies-{{ checksum "composer.json" }}
- v1-dependencies-
- run: composer install -n --prefer-dist
- save_cache:
key: v1-dependencies-{{ checksum "composer.json" }}
paths:
- ./vendor
- restore_cache:
keys:
- node-v1-{{ checksum "package.json" }}
- node-v1-
- run: yarn install
- save_cache:
key: node-v1-{{ checksum "package.json" }}
paths:
- node_modules
# prepare the database
# - run: touch storage/testing.sqlite
# - run: php artisan migrate --env=testing --database=sqlite_testing --force
- run: cp .env.testing .env
- run: ./vendor/bin/phpunit
# - run: ./vendor/bin/codecept build
# - run: ./vendor/bin/codecept run
deploy-prod:
machine:
image: circleci/classic:edge
steps:
- checkout
- run:
name: heroku maintenance on
command: heroku maintenance:on --app ${HEROKU_APP_NAME_PROD}
- run:
name: heroku deploy
command: |
git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME_PROD.git master
- run:
name: heroku maintenance off
command: heroku maintenance:off --app ${HEROKU_APP_NAME_PROD}
workflows:
version: 2
build_and_deploy:
jobs:
- build
- deploy-prod:
requires:
- build
filters:
branches:
only: master
※ 環境変数 "HEROKU_APP_KEY"、"HEROKU_APP_NAME_PROD"が定義されています。こちらは後述します。
.circleci/config.yml
が作成できたらgithubにpushしてください。
その後、ブラウザに戻り"Start Building"を押下することでビルドが開始します。
CircleCIの環境変数を設定する
Herokuのアクセス情報をCircleCIの環境変数に設定します。
まずは、Herokuのダッシュボードから"Account Setting"を開きAPI Keyを確認しましょう。
API Keyはメモしてください。
続いて、CircleCIのダッシュボードから対象プロジェクトの"Setting"画面に遷移します。
サイドメニューの"Environment Variables"から環境変数の設定画面が開けます。
以下の2つの環境変数を設定してください。
環境変数名 | 説明 |
---|---|
HEROKU_APP_KEY | Herokuのダッシュボードから取得したAPI Key |
HEROKU_APP_NAME_PROD | Herokuの対象プロジェクト名 |
.circleci/config.ymlのデプロイ設定について
.circleci/config.yml
のHerokuへのデプロイ部分は以下になります。
HerokuのAPI Keyを利用してHerokuにpushすることでデプロイを実行しています。
deploy-prod:
machine:
image: circleci/classic:edge
steps:
- checkout
- run:
name: heroku maintenance on
command: heroku maintenance:on --app ${HEROKU_APP_NAME_PROD}
- run:
name: heroku deploy
command: |
# Herokuにpushすることでデプロイを開始
git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME_PROD.git master
- run:
name: heroku maintenance off
command: heroku maintenance:off --app ${HEROKU_APP_NAME_PROD}
ここまで完了するとmasterブランチへのpushやmergeでHerokuに自動デプロイが行われます。
最後に
個人的にCircleCIは経験が浅いのでこれから色々試していきたいと思っています。