【使い方】CircleCIとは?EC2にsshしてデプロイ自動化

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。タクマ™ [@suwaru_blog] です。

CI/CD ツールって有名どころだと Jenkins とか CircleCI がありますが、そこで質問です。

あなたは現場で CI/CD ツールの設定をしたことがありますか?

…僕はぶっちゃけありませんでした。

なぜかというと、開発プロジェクトに途中からジョインすることが多くて、
この手の設定って大体もう終わってるんですよね。

CI/CD ツールの敷居が高い問題

実際、仕事であんまり CI/CD ツールを触ったことがないけど「興味だけはある!」
そんな駆け出しエンジニアの方って多いと思います。

でも実際、何ができるか分からない…ちょっとググったけど難しそう…

そんな印象もあると思うんですよね。

CircleCI の使い方・設定を徹底解説!

今回は実践的に CircleCI という CI/CD ツールで何ができるか解説しようと思います。

具体的にいうと GitHub の master ブランチにプッシュしたら、CircleCI が勝手に EC2 インスタンスにログインして master ブランチをプルする方法を実践します!
いわゆるデプロイの自動化です!

AWS の EC2 を使いますが、どのサーバを使っていてもやる作業は (多分) 同じと思います。

前提知識: GitHub が使える・サーバに SSH できる

「出来るだけ分かりやすく」…とは書きましたが、前提知識が必要です。
以下の準備をしておいてください。

  • GitHub 上にリモートリポジトリを作っておく
  • EC2 インスタンスに ssh ログインできるようにしておく
  • CircleCI のアカウントを作成してGitHub アカウントと紐付けておく

CircleCI 設定ファイルを作成して GitHub にプッシュする

config.yml の書き方

早速ですが CircleCI の設定ファイルを書いてみましょう。

対象のプロジェクトファイルの直下に .circleci という隠しフォルダを作成して、
中に config.yml という設定ファイルを置きます。

[プロジェクト]/.circleci/config.yml

version: 2

jobs:
    # build ジョブ: CircleCI 上で Docker コンテナを作成してテストする
    build:
        docker:
            - image: alpine
        steps:
            - checkout
            - run:
                name: Echo Test
                command: echo "CircleCI Test"
    # deploy ジョブ: EC2 に SSH 接続して、デプロイを実行する
    deploy:
        machine:
            image: circleci/classic:edge
        steps:
            - checkout
            # CircleCI に登録した秘密鍵を呼び出す
            - add_ssh_keys:
            # CircleCI に登録した環境変数を使って SSH
            - run: ssh ${USER_NAME}@${HOST_NAME} 'cd [あなたのプロジェクトへのパス] && git pull'

workflows:
    version: 2
    # build_and_deploy ジョブ: 一番最初に呼ばれるジョブ
    build_and_deploy:
        # build ジョブと deploy ジョブを呼び出す
        jobs:
            - build
            - deploy:
                requires:
                    # deploy ジョブより先に build ジョブを実行しろ!
                    - build
                # master ブランチに push された場合のみ deploy ジョブを実行する
                filters:
                    branches:
                        only: master

設定ファイル内の [あなたのプロジェクトへのパス] 箇所は修正してください。
ssh してからプロジェクトにたどり着くまでのパスです。

完成したら、このファイルを GitHub リポジトリにプッシュしておいてください。

この config.yml が行うこと

この config.yml ファイルによって CircleCI サーバ上では以下のことが行われます。

  1. GitHub の master ブランチに push されたら CircleCI サーバ上で config.yml が読み込まれる
  2. 最初に workflows ブロック内の build_and_deploy ジョブを実行する
  3. build_and_deploy ジョブは「小さいジョブの実行」を定義しています
    • jobs ブロック内に定義した build ジョブを実行する
    • jobs ブロック内に定義した deploy ジョブを実行する

build ジョブと deploy ジョブがなにをしているのか?…を詳しくみていきます。

build ジョブ

CircleCI サーバ上で Docker コンテナを起動する

CircleCI サーバ上では Docker のコンテナを起動することができます。
そのコンテナで GitHub のコード (今回は master ブランチのコード) を動かせるのです。

① Docker コンテナ内にテスト環境を構築して、コードのテストを行う
② Docker コンテナを終了する
③ テスト結果に問題がなければ、CircleCI が SSH してプルする ( = デプロイする)
…という自動化が一般的に多いです。

今回は話を簡単にするため alpine という Docker イメージファイルでコンテナを作成して、
echo "CircleCI Test" するだけ…ということを build ジョブ内でやりました。

興味がある人はこのタイミングで、本当にテストする Linux コマンドを書いてみましょう。

deploy ジョブ

deploy ジョブでは、以下を定義しています。

  1. EC2 インスタンスに ssh する
  2. プロジェクトのあるディレクトリに cd 移動する
  3. master ブランチをプルする

CircleCI サーバが EC2 インスタンスに ssh するには

EC2 インスタンス上で秘密鍵 (pem ファイル) を作成して CircleCI に登録する必要があります。

また、どのサーバアドレスに、どのユーザでログインするか?
…も環境変数 (HOST_NAME / USER_NAME) として CircleCI に登録しておく必要があります。

その設定方法については後述します。

EC2 インスタンス上で GitHub を使えるようにするには?

こちらの記事で詳しく解説しているのでご覧ください。

秘密鍵と公開鍵

秘密鍵・公開鍵は必要なので、サーバに存在するか確認してください。
そして秘密鍵の文字列をコピーしておいてください。

cd ~/.ssh

# id_rsa.pub と id_rsa があるか確認する
ls

# 秘密鍵を表示して、文字列をコピーしておく
cat ~/.ssh/id_rsa

CircleCI にログインしてからの作業

利用する GitHub リポジトリをフォローする

CircleCI にログインして、利用する GitHub リポジトリをフォローします。

サイドメニューの「ADD PROJECTS」を選び、
リポジトリ名の横にある「Follow Project」ボタンを押してください。

GitHub リポジトリ master ブランチに .circleci/config.yml をプッシュしていないと、
「Set Up Project」ボタンが表示されてしまうので注意してください。

環境変数と SSH パーミッションを設定する

サイドメニューの「WORKFLOWS」を選択して、歯車アイコンを選択してください。

環境変数を設定する

「Environment Variables」を選択してください。

「Add Variable」ボタンから環境変数を追加します。

以下の環境変数を追加してください。

  • HOST_NAME
    • EC2 に ssh するときの IP アドレス
  • USER_NAME
    • EC2 に ssh するときのユーザ名
    • たとえば ec2-user など

SSH パーミッションを設定する

「SSH Permissions」を選択してください。

「Add SSH Key」ボタンからパーミッションを追加します。

以下の値を追加してください。

  • Hostname
    • EC2 に ssh するときの IP アドレス
  • Fingerprint
    • EC2 にある ~/.ssh/id_rsa の値 (秘密鍵)

プッシュしてジョブを確認する

CircleCI が上手く動作するか master ブランチにプッシュして確認してみてください。
サイドメニューの「JOBS」を選ぶと CircleCI の実行結果を見ることができます。

「build」ジョブ「deploy」ジョブ、それぞれ成功したか失敗したか表示されます。

両方 SUCCESS と表示されていたら、念のため EC2 インスンスに ssh して、
git log を叩いて、ちゃんとプルできているか確認してみてください。

シンプルな CircleCI によるデプロイ自動化ですが、基本はこのやり方です。
あとは自分で設定ファイルをいじって色々と拡張してみてください。

お仕事ください!

僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。
なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。

コメント

  1. Djan より:

    はじめまして。優良記事ありがとうございます。
    質問可能でしたら質問させていただきたいのですが、
    こちらの記事どおり試したところ、これまでSSH接続できていた
    EC2で接続できなくなり、接続しようとすると、Permission denied (publickey). と表示されてしまうのですが、何か上記の記事と関係はありますでしょうか。

コメントを残す

*