こんにちは。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 によるデプロイ自動化ですが、基本はこのやり方です。
あとは自分で設定ファイルをいじって色々と拡張してみてください。
関連記事
お仕事ください!
僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。 なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。
カテゴリ「AWS」の最新記事
はじめまして。優良記事ありがとうございます。
質問可能でしたら質問させていただきたいのですが、
こちらの記事どおり試したところ、これまでSSH接続できていた
EC2で接続できなくなり、接続しようとすると、Permission denied (publickey). と表示されてしまうのですが、何か上記の記事と関係はありますでしょうか。
こんにちは。コメントありがとうございます!
詳しい状況はわからないのですが、とりあえず以下を確認してみてください。
・pem ファイルの場所、パスが正しいか確認する
・pem ファイルに正しい権限を設定する: chmod 400 <証明書.pemのパス>
・ユーザ名が正しいか確認する
– Amazon Linux AMIの場合 → ec2-user
– Centos AMIの場合 → centos
– Debian AMIの場合 → admin または root
はじめまして!
割と、シンプルな見本がなかったので、SSH デプロイって多分需要あるのに、なかなかわかりやすい記事がないなかで大変助かりました! 有料の本にも載っていなかった(り、バージョンが微妙に違うので UI は config.yml が変わっているなど)ので、本当に助かりました!ありがとうございます。
コメントありがとうございます!
もともと僕も CI/CD ツールの知見がなくて、yml ファイルの読解すら出来ないレベルだったので気持ちわかります。。。
今後もわかりやすい技術記事を増やしていこうと思っているのでよろしくお願いします〜
はじめてまして。
わかりやすい記事をありがとうございます。
記事通りに作成してみたのですが、
deployのsshする段階で
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
とエラーがでてしまいます。
直前のinstalling additional ssh keysでは
There are no configured ssh keys to install
と出ていたのですが、この時点でおかしいのでしょうか。
良かったら回答お願いします。