【使い方】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 を使いますが、どのサーバを使っていてもやる作業は (多分) 同じと思います。

そもそも CI/CD ツールとは?

  • CI
    • 継続的インテグレーション(Continuous Integration)
  • CD
    • 継続的デリバリー(Continuous Delivery)
    • 継続的デプロイ(Continuous Deployment)

言葉としてはこういう意味ですが覚えなくていいです。
CI と CD の説明・区別があやふやだったりするので。

CI/CD ツールの目的は「リリースのたびに、手動でサーバに SSH ログインして Linux コマンド叩いてビルド・デプロイ・テスト実行するのアホらしくない?自動化しようよ」です。

自動化すると単純にラクですし、コマンドの実行漏れ・間違いもなくなります。
CircleCI の場合は GitHub にプッシュすれば後は勝手にやってくれます!

CircleCI 前提知識: GitHub・サーバ SSH が可能

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

  • 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 サイトからお気軽にご相談ください。

カテゴリ「AWS」の最新記事

最新記事

コメント

  1. Djan より:

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

    1. タクマ™ より:

      こんにちは。コメントありがとうございます!
      詳しい状況はわからないのですが、とりあえず以下を確認してみてください。

      ・pem ファイルの場所、パスが正しいか確認する
      ・pem ファイルに正しい権限を設定する: chmod 400 <証明書.pemのパス>
      ・ユーザ名が正しいか確認する
      – Amazon Linux AMIの場合 → ec2-user
      – Centos AMIの場合 → centos
      – Debian AMIの場合 → admin または root

  2. 佐藤 裕介 より:

    はじめまして!

    割と、シンプルな見本がなかったので、SSH デプロイって多分需要あるのに、なかなかわかりやすい記事がないなかで大変助かりました! 有料の本にも載っていなかった(り、バージョンが微妙に違うので UI は config.yml が変わっているなど)ので、本当に助かりました!ありがとうございます。

    1. タクマ™ より:

      コメントありがとうございます!
      もともと僕も CI/CD ツールの知見がなくて、yml ファイルの読解すら出来ないレベルだったので気持ちわかります。。。
      今後もわかりやすい技術記事を増やしていこうと思っているのでよろしくお願いします〜

  3. sho より:

    はじめてまして。
    わかりやすい記事をありがとうございます。

    記事通りに作成してみたのですが、
    deployのsshする段階で
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    とエラーがでてしまいます。

    直前のinstalling additional ssh keysでは
    There are no configured ssh keys to install
    と出ていたのですが、この時点でおかしいのでしょうか。

    良かったら回答お願いします。

タクマ™ へ返信する コメントをキャンセル

*