Circleciを使ってEC2へ自動デプロイ

完成したymlファイル(testは容量がかかるので、コメントアウトにしている)

version: 2
jobs:
  # test:
  #   machine:
  #     image: circleci/classic:edge
  #   steps:
  #     - checkout
  #     - run:
  #         name: docker-compose build
  #         command: docker-compose build
  #     - run:
  #         name: docker-compose up
  #         command: docker-compose up -d
  #     - run:
  #         name: sleep for waiting db
  #         command: sleep 120
  #     - run:
  #         name: rails db:create
  #         command: docker-compose run app bin/rails db:create
  #     - run:
  #         name: rails db:migrate (skip db:seed)
  #         command: docker-compose run app bin/rails db:migrate
  #     - run:
  #         name: rails db:test:prepare
  #         command: docker-compose run app bin/rails db:test:prepare
  #     - run:
  #         name: rails webpacker:install
  #         command: docker-compose run app bin/rails webpacker:install
  #     - run:
  #         name: rspec
  #         command: docker-compose run app rspec
  #     - run:
  #         name: docker-compose down
  #         command: docker-compose down
  # deploy ジョブ: EC2 に SSH 接続して、デプロイを実行する
  deploy:
    machine:
      image: circleci/classic:edge
    steps:
      - checkout
      # CircleCIに登録した秘密鍵を呼び出す。
      - add_ssh_keys:
          fingerprints: #sshの暗号化されたもの。
            - 19:a4:94:21:15:c9:5c:c6:75:8a:94:4a:9c:1f:37:da
      - run: ssh ${USER_NAME}@${HOST_NAME} 'cd myapp && git pull'
    #   - run: ssh ${USER_NAME}@${HOST_NAME} 'cd myapp && git pull && docker-compose run python ./manage.py migrate'
workflows:
  version: 2
  test_and_deploy:
    jobs:
      # - test
      # requiresなどが必要ない時は、:はいらない。今はdeployのみを行っているので、
      # - deploy:
      - deploy
        # requires:
        #   - test
          filters:
                    branches:
                        only: main

一番時間がかかったところはいつもssh周り

  • EC2とGHを、EC2で作成したpem形式のkeyでssh接続する。その鍵をcircleciのsshにも登録する。 

f:id:kaz08:20210329174252j:plain

その他に、

  • circleci>project>環境変数(Environment Variables)に、HOST_NAME, USER_NAMEにそれぞれipアドレス、ec2-user名を記入して、上の.ymlに格納している。

  • また、circleci>project>set sshで、deploy key, user keyもセットしておく。
    参考:

circleci.com

qiita.com

suwaru.tokyo