circleci 設定 書き方 学習メモ
【初心者向け】CircleCI 超入門
CircleCIとは何か?
CI/CDを実現するサービスのひとつです。
CI/CDとは何か?
「テストやビルド、本番へのデプロイなどを自動化してラクに効率よく開発を進めようぜ!」的な開発手法をまとめたものです。
CIとは、Continuous Integrationの略で「継続的な統合」という意味になります。
CDとは、Continuous Deliveryの略で、「継続的な配信」という意味になります。
CDの話になると、Continuous Deployment(継続的なデプロイメント) という考えも出てくるのですが、ここらへんの違いはあまり気にしなくていいです。この周辺用語の意味を深堀りするよりは、おおまかに理解して「CI/CD」という概念があるんだなーくらいに捉えるだけでOKです。
なぜCI/CDの概念が登場したのか?
では、なぜCI/CDという考えが広まってきたのでしょうか?どんな技術もそうですが、ある課題を解決するために生まれるのが新しい技術です。CI/CDはどんな課題を解決するために考えだされた技術なのでしょうか?
噛み砕いていうと、
「いろんなこと、手動でやるのめんどくね?自動化したくない?」
「変化の早い時代なんだからさ、開発速度をもっと速くしたくない?」
という需要が高まったために、それを解決するためにCI/CDという開発手法が広まってきたのです。
CI/CDを導入するメリット
いろんなことを自動化できる
開発速度を速めることができる
デプロイを自動化するとは?
デプロイを手動でやるとどうなるでしょうか?
たとえば、さくらVPSなどのサーバーにRailsアプリケーションをデプロイしているとします。新機能を実装して、Githubにプッシュしました。テストも通りました。では、どうやって本番環境に変更を反映させたらいいのでしょうか?
さくらVPSのサーバーにSSHなどで入って、git pull コマンドを実行して反映させなければなりません。
1日に何度も変更を加えるような開発だと、なんどもサーバーに接続して同じコマンドを叩かなければなりません。これは非常に面倒ですし、そもそもサーバーに直接接続するのもなんだか人的ミスが起きそうで怖いです。
デプロイを自動化したい、そんなときに活躍するのがCircleCIなどのCI/CDツールです。
CircleCIの解説
CircleCIを調べていると、ジョブ、ステップ、ワークフロー、エグゼキュータ、コマンド、オーブなど、わけわからん単語が一気にたくさん出てくるので混乱しがちです。
しかし、CircleCIの基本はジョブを自動で実行すること。これだけです。
なので、まずはジョブについて見ていきます。ステップやワークフローなどについては一旦無視して説明します。
CircleCIでは、一連のタスクをまとめたものを「Job」と呼んで定義しています。一連のタスクとは、例えばビルドをしたいとか、テストをしたいとか、デプロイをするなど。CircleCIとは、Jobを定義したら後は自動で実行してくれるツールなんですね。
「CircleCIさん、こういったこと(Job)をやってよ」と依頼したい場合は、./circleci/config.ymlファイルに依頼内容を書きます。設定をCircleCIが読み込んで、自動でJobを実行してくれる。CircleCIの役割は基本的にはこれだけ。
Jobとは、複数のstepをまとめたもの。複数のstepからJobは成り立ちます。
ジョブ
ステップ1
ステップ2
ステップ3
workflowとは、Jobをどんな順番で動かすかを定義する場所のことです。
ジョブを定義して、ワークフローでジョブの順番を定義する
ジョブを定義する
ワークフローでジョブの実行順序を定義する
基本的には以下の3つのことを書く
code:.circleci/config.yml
version: 2.1 # CircleCIのバージョンを指定する(バージョンによって書き方が変わるため)
jobs: ジョブを定義する場所
workflows: 上で定義したジョブをどんな流れで実行させるかを定義する場所
CircleCIの設定は.circleci/config.ymlに書くと決められています。
code:zsh
mkdir .circleci
touch .circleci/config.yml
まず、CircleCIのバージョンを書きます。現在の最新版である2.1を指定します。
code:.circleci/config.yml
version: 2.1
code:.circleci/config.yml
version: 2.1
jobs:
build:
docker:
- image: circleci/node:12
steps:
- checkout
name: install dependencies
command: yarn install
workflows:
version: 2
build_and_test:
jobs:
- build
- test
なぜDocker Imageを指定するのか?
stepsのrun以下はインデントを2つ入れないとエラーになるで要注意
steps以下ではcheckoutが定義されているが、これはCircleCIが用意している機能。他にもたくさんある。
ジョブの基本
code:rb
jobs: ジョブを定義する場所
environment: #
BUNDLE_PATH: vendor/bundle
- node_modules
- node_modules
name: Install npm dependencies
sudo npm install -g
imageの定義について
docker:dockerコンテナの中でジョブが実行されるということ
imageタグでどんなdockerイメージを使うかを指定できる。imageはCircleCIが提供しているものを使うのが一般的
machine
macos
iOSのアプリをビルドするとき
windows
ウィンドウズ用アプリをビルドするとき
の4つが選べる。Executorとも呼ばれる
「コードをリポジトリからチェックアウトする」とは
checkoutがやっていること:checks out source code for a job over SSH
workflowsの基本
code:rb
workflows: 上で定義したジョブをどんな流れで実行させるかを定義する場所
jobs:
設定ファイルにたくさんの重複が発生して、読みづらくなってくる
Executor
Commands
基本通りに書いていると、アプリケーションの規模が大きくなるにつれて問題が発生する
書き方が属人化してくる(CircleCI職人が必要になってくる)
Orb
よく使うCircleCIの機能
restore_cache
save_cache
store_test_results
add_ssh_keys
deploy
参考