Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

EC2へ自動テスト、デプロイをCircleCIで実現する(Django)

More than 1 year has passed since last update.

はじめに

AWSのEC2インスタンスにSSH接続→git pullして手動でデプロイしていたのですが、CircleCIを使用して自動デプロイする手順をまとめました。

実現したいこと

GitHubにmasterブランチをpushした際に、CircleCIを動かしてDjangoのUnittestを実施。
テストにパスした際は、そのままEC2インスタンスにSSH接続してgit pullして最新のコードを反映させる。
なお、Djangoのアプリはdocker上で動かしています(docker-compose up -d)。
下記リンクがdockerの環境構成です。
Django+Nginx+MySQLの開発環境をDockerで構築する

EC2インスタンス

事前にgit docker docker-composeをインストールしておきます。
さらに、後述しますCircleCI用の公開鍵も記述します。
手順は下記にまとめました。
EC2インスタンスにgit,docker,docker-composeを導入、公開鍵の登録(CircleCI用)

CircleCI

対象のGitHubリポジトリをCircleCIに登録しておきます。
以下を実行します。
1. 秘密鍵の登録
2. EC2インスタンスのホスト名、ドメイン名の登録
参照記事:Circle CIでwebサイトを自動デプロイ

秘密鍵の登録

CircleCIに使用できる鍵認証は形式が決まっていますので、それに従い作成します。
フォルダを作成し、そこに作成します。
参照:Adding an SSH Key to CircleCI

# 鍵の作成
$ mkdir ssh
$ ssh-keygen -m pem
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/kenkono/.ssh/id_rsa): ssh

CircleCIのコンソール画面で作成した秘密鍵を登録します。
Hostnameには任意の文字を記入します。
Screen Shot 2019-06-07 at 11.37.05 AM.png

EC2インスタンスのホスト名、ドメイン名の登録

環境変数として登録します。
EC2の場合、ec2-user@ドメイン名かと思いますので、以下登録します。
HOST_NAME = ドメイン名
USER_NAME = ec2-user
Screen Shot 2019-06-07 at 11.40.15 AM.png

CircleCIの実行コード

.circleci/config.ymlに記載したコードが、対象のGitHubレポジトリにpushされた際に実行されます。
以下記述内容です。
docker-composeを実行したいので、CircleCIでは仮想マシンであるcircleci/classic:edgeを指定します。

config.yml
# circleCIのバージョン指定
version: 2
jobs:
  build:
    machine:
      image: circleci/classic:edge
    steps:
# Djangoのテストを実行
      - checkout
      - run:
          name: docker-compose up
          command: docker-compose up -d
      - run:
          name: sleep for launch db to migrate at Django
          command: sleep 10
      - run:
          name: migrate
          command: docker-compose run python ./manage.py migrate
      - run:
          name: test
          command: docker-compose run python ./manage.py test
      - run:
          name: docker-compose down
          command: docker-compose down
# EC2にSSH接続し、デプロイを実行
  deploy:
    machine:
      image: circleci/classic:edge
    steps:
      - checkout
      # CircleCIに登録した秘密鍵を呼び出す。
      - add_ssh_keys:
      - run: ssh ${USER_NAME}@${HOST_NAME} 'cd todoList && git pull && docker-compose run python ./manage.py migrate'

# テストが成功した場合のみ、deployを実行するようにします。
workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          # masterブランチがpushされた場合のみdeployするようにする。
          filters:
            branches:
              only: master

実行

git pushで一連の記述が動作します。

参照元

docker-composeでRailsを開発しCircleCI 2.0でテストしてHerokuにdeployする

kenkono
渋谷で働くマーケター兼エンジニア 市役所職員→外資系企業にて営業→タイで駐在経験→エンジニア(カンボジア、フィリピン、マレーシア) →東京に戻る(現在) 言語: python(Django), php(Laravel), javascript(ReactNative) ツール: Docker, Fastlane, Bitrise
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away