こんにちは。iQeda [@iQeeeda] です。
CI/CD ツールって有名どころだと Jenkins とか CircleCI がありますが、そこで質問です。
...僕はぶっちゃけありませんでした。
なぜかというと、開発プロジェクトに途中からジョインすることが多くて、
この手の設定って大体もう終わってるんですよね。
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 サーバ上では以下のことが行われます。
- GitHub の master ブランチに push されたら CircleCI サーバ上で
config.ymlが読み込まれる - 最初に
workflowsブロック内のbuild_and_deployジョブを実行する 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 ジョブでは、以下を定義しています。
- EC2 インスタンスに ssh する
- プロジェクトのあるディレクトリに cd 移動する
- 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の値 (秘密鍵)
- EC2 にある
プッシュしてジョブを確認する
CircleCI が上手く動作するか master ブランチにプッシュして確認してみてください。
サイドメニューの「JOBS」を選ぶと CircleCI の実行結果を見ることができます。
「build」ジョブ「deploy」ジョブ、それぞれ成功したか失敗したか表示されます。
両方 SUCCESS と表示されていたら、念のため EC2 インスンスに ssh して、git log を叩いて、ちゃんとプルできているか確認してみてください。
シンプルな CircleCI によるデプロイ自動化ですが、基本はこのやり方です。
あとは自分で設定ファイルをいじって色々と拡張してみてください。
No comments yet