世界を旅して暮らしたい放浪エンジニアブログ

LaravelアプリをCircleCIを利用してGithubからHerokuに自動デプロイする

今回は、CircleCIを利用してGithubにpushした際に、Herokuへ自動デプロイできるようにしたいと思います。

[ 目次 ]

はじめに

こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。

今回は、CircleCIを利用してGithubにpushした際に、Herokuへ自動デプロイできるようにしたいと思います。
以前投稿した「HerokuにLaravelをデプロイする方法」の続きにとしてLaravelアプリをデプロイします。

HerokuにLaravelをデプロイする方法

※ Herokuについては過去の記事をご確認ください。

【前提】

  • Laravelアプリが既にHerokuにデプロイできる状態になっていること
  • CircleCIにアカウントを作成し、github連携ができていること
  • CircleCI 2.0を利用する

CircleCIとは

CircleCIとは、継続的インテグレーション(デリバリー)サービスです。
コミットからデプロイまでのパイプラインを作成し、継続的な統合/配信を使用してソフトウェア開発プロセスを自動化できます。

上記は、クラウドサービス/CircleCIとは からの引用

githubやbitbucketへのpushをトリガーにして、インテグレーションやデプロイを行うことができるクラウドサービスです。今回はこの機能を利用して、Herokuにデプロイしてみたいと思います。

CircleCIにてプロジェクトを追加&セットアップ

CircleCIのダッシュボードから"ADD PROJECTS"を選択し、プロジェクトを追加します。
プロジェクト追加ページには、連携しているgithubのリポジトリ一覧が表示されています。対象リポジトリの"Set Up Project"ボタンを押下してください。

CircleCI プロジェクト追加1

続いてプロジェクトをセットアップしていきます。

CircleCI プロジェクトセットアップ

  • 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はメモしてください。

Heroku Account Setting API KEY

続いて、CircleCIのダッシュボードから対象プロジェクトの"Setting"画面に遷移します。
サイドメニューの"Environment Variables"から環境変数の設定画面が開けます。

スクリーンショット 2019-03-08 17.39.07

以下の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は経験が浅いのでこれから色々試していきたいと思っています。

前のページ

次のページ

Profile

なかむ🇭🇰Webデベロッパー

なかむ🇭🇰Webデベロッパー

香港在住4年目になるWEBエンジニアのなかむです。 現在は、LaravelやRailsを利用したWEB開発を中心にエンジニアをしています。 顧客は全て日本の企業になります。リモート開発にて各企業様の支援を行なっております

プロフィール詳細はこちら

Latest Posts