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

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

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

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

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

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

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

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

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

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

そんな印象もあると思うんですよね。
なので CircleCI の実践を交えて CI/CD ツールで何ができるか解説してみようと思います。

具体的にいうと GitHub の master ブランチにプッシュしたら、
EC2 インスタンス上でその変更を自動的にプルする ( = デプロイする) 方法を実践します!

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

前提知識: GitHub が使える・ssh できる

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

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

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

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

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

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

version: 2

jobs:
    build:
        docker:
            - image: alpine
        steps:
            - checkout
            - run:
                name: Echo Test
                command: echo "CircleCI Test"
    # 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:
        jobs:
            - build
            - deploy:
                requires:
                    # build ジョブに依存してるので、先に build ジョブを実行しろ!
                    - build
                # master ブランチに push された場合のみ deploy
                filters:
                    branches:
                        only: master

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

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

この設定ファイルによって 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 ブランチのコード) を動かせるのです。

① コンテナ内にテスト環境を構築して、コードがちゃんと動くかテスト
② テスト結果に問題がなければプルする ( = デプロイする)
…という自動化をすることが一般に多いです。

今回は話を簡単にするため 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 を使うには

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

秘密鍵を作成する → GitHub に秘密鍵を登録する

すでに EC2 上で GitHub リポジトリと通信できているなら、以下の手順は不要です。

EC2 に ssh ログインする
# 以下ディレクトリがないなら作成しておく
cd ~/.ssh

# 既に id_rsa.pub と id_rsa がないか確認
ls

# 秘密鍵・公開鍵の作成を行う
# 既に存在している場合は上書きしてしまうので注意してください
ssh-keygen -m pem

# 公開鍵を表示して、文字列をコピーする
cat .ssh/id_rsa.pub

# 以下ファイルに公開鍵をペーストする (これをしないと git pull するときに失敗する)
vi .ssh/authorized_keys

# 秘密鍵を表示して、文字列をコピーする
cat ~/.ssh/id_rsa
GitHub にログインする

以下の画像に従って GitHub に秘密鍵を登録してください。

Settings 選択
SSH and GPG key → New SSH key

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 による自動デプロイですが、基本はこのやり方です。
あとは自分で設定ファイルをいじって色々と拡張してみてください。

コメントを残す

*