Published on

CircleCIでEC2にテスト後デプロイ[Django]

Authors
  • avatar
    Name
    Kikusan
    Twitter

ビルド

  • CircleCIにGitHubアカウントでログイン
  • リポジトリを選ぶ。
  • config.ymlを記入する(保存した瞬間にGitHubに公開鍵が追加される)
  • いろいろエラーが出るので解決する
    • githubにcircleci-project-setupというブランチでconfig.ymlを追加してエラーになっている
    • ローカルにこのブランチを持ってきて編集、解決。

error computing cache key: template: cacheKey:1:7: executing "cacheKey" at <checksum "requirements.txt">

⇒プロジェクト直下でpip freeze > requirements.txt

私の場合は以下。

Django==2.2.7
django-filter==2.4.0
django-widget-tweaks==1.4.8
djangorestframework==3.11.0
Pillow==7.1.2
Markdown==3.3.1

デフォルトの設定ではrequirements.txtがコンテナで読めないので、読めるようにconfig.ymlを変更。

version: 2.1

jobs:
  build-and-test:
    # working_directory: ~/
    docker:
        - image: circleci/python:3.7.5
    
    steps:
      - checkout
      - restore_cache:
          keys:
              - pip -- {{ checksum "requirements.txt"}}
      - run:
          name: Install dependencies
          command: pip install --user -r requirements.txt
      - save_cache:
          key: pip -- {{ checksum "requirements.txt"}}
          paths: /home/circleci/.local/bin/
      - run:
          command: python manage.py test
          name: Test

workflows:
  main:
    jobs:
      - build-and-test

pythonの仮想環境を使っていないが、コンテナなのでいいか、、、

これでcommit⇒pushするとビルドが走り、無事Successと表示された。

デプロイ(EC2)

  1. circleCIにEC2を作った時の秘密鍵を登録する。
    • Project Settings > SSH Keys > Additional SSH Keys > Add SSH Key
      • Hostname : EC2のIPアドレス
      • Private Key : 秘密鍵の中身全選択

pem形式の鍵ならなんでもいい。

自分の鍵を使うならEC2の ~/.ssh/authorized_keys ファイルに公開鍵として登録する。

  1. CircleCIの環境変数を設定する
    • Project Settings > Environment Variables
      • SSH_PORT : SSHのポート
      • HOST_NAME : EC2のIPアドレス
      • USER_NAME : EC2のユーザ名

大体デフォルトユーザ名はec2-userだが、UbuntuAMIはubuntu

  1. config.ymlの編集
version: 2.1

jobs:
  build-and-test:
    # working_directory: ~/
    docker:
      - image: circleci/python:3.7.5
    steps:
      - checkout
      - restore_cache:
          keys:
            - pip -- {{ checksum "requirements.txt"}}
      - run:
          name: Install dependencies
          command: pip install --user -r requirements.txt
      - save_cache:
          key: pip -- {{ checksum "requirements.txt"}}
          paths: /home/circleci/.local/bin/
      - run:
          command: python manage.py test
          name: Test
  deploy:
    machine:
      image: circleci/classic:edge # 必要最小限コンテナ
    steps:
      - checkout
      - add_ssh_keys # 秘密鍵を読み込む
      - run: ssh -p ${SSH_PORT} ${USER_NAME}@${HOST_NAME} 'cd my-django && git pull origin main && sudo systemctl restart gunicorn.socket'
      
workflows:
  main:
    jobs:
      - build-and-test
      - deploy:
          requires:
            - build-and-test # テストが通ったらデプロイ
          filters:
            branches:
              only: main # mainブランチのみデプロイ

この設定でmainブランチに変更があった場合のみ、デプロイができた。