codechrysalis’s blog

東京を拠点にした12週間の短期集中型ソフトウェアエンジニア養成学校です。

CircleCI を活用して生徒のコードレビューを自動化!

https://circleci.com/docs/2.0/hello-world/

コードクリサリスでは、生徒の進捗を確認するために、継続的インテグレーションユニットテストを活用し、教育プロセスの一部をオートメーション化することにしました。私たちのカリキュラムのテストカバレッジはほぼ100%であり、生徒には関わる全てのプロジェクトでテスト駆動開発(TDD)を実践することを強制しています。私たちは継続的インテグレーションを私たちの評価プロセスと統合し、迅速なコードレビューを生徒に提供し、インストラクターは生徒の状況を把握できるため、より良いフィードバックを提供することが可能になります。

継続的インテグレーションとは何でしょうか?なぜ必要なのでしょうか?

(https://aws.amazon.com/jp/devops/continuous-integration/)

継続的インテグレーションは、開発者が自分のコード変更を定期的にセントラルリポジトリにマージし、その後に自動化されたビルドとテストを実行する DevOps ソフトウェア開発の手法です。継続的インテグレーションという用語が最もよく使われるのは、ソフトウェアのリリースプロセスのビルド段階または統合段階を指す場合で、自動化の要素 (たとえば、CI やビルドサービス) と啓発の要素 (たとえば、頻繁に統合することを学習する) の両方が含まれます。

継続的インテグレーションの主な目的は、バグを早期に発見して対処すること、ソフトウェアの品質を高めること、そしてソフトウェアの更新を検証してリリースするためにかかる時間を短縮することです。つまり、

  • 長くて複雑な統合テストとはおさらば!
  • 問題の見える化
  • 問題の早期発見
  • デバッグの時間短縮と機能追加の時間拡大
  • 強固な基盤の構築
  • 自身のコードの動作確認のための時間軽減
  • 迅速に機能をリリース

現在2017年7月時点でよく知られている継続的インテグレーションは以下のサービスが挙げられます。簡単に良い点悪い点を挙げてみました。

良い点 悪い点
Jenkins 汎用性が高い
無料
全てコントロール可能
ラーニングコストが高い
サーバーと運用する人が必要
属人的になりやすい
CircleCI エンタープライズ版に無料版が有る
簡単に利用開始できる
Docker をサポート
バージョン 2.0 がまだベータ版
プレミアム版の料金プランが高い
TravisCI 対応しているプログラミング言語が豊富
Docker をサポート
プレミアム版の料金プランがCircleCIより高い
エンタープライズ版に無料版が無い

最終的に CircleCI を選択しました。主な理由は、

  1. 簡単に利用開始できる
  2. 料金が比較的安価(無料版も有る)

です。スタートアップには心強い味方です。

CircleCIの基本的なセットアップ

私たちの学生がプルリクエストを作成しそのコードに対してテストを自動的に実行します。

CircleCI の基本的な動作原理

f:id:codechrysalis:20170710195346p:plain

学生がGithub上でプルリクエストを作成するとGithubはWebhookを利用してプルリクエストの内容をCirleCIへPOSTします。CircleCIはDockerコンテナーを利用します。Dockerコンテナーを知りたい方はこちらを参照ください(https://www.docker.com/what-docker)。 端的に話をすると、Docker コンテナーはDockerイメージという環境のスナップショットを利用しており、実行すると独立した“コンテナー”という環境上でテストを行うことが出来ます。非常に多くの様々なコンフィグレーションがあり、Dockerを活用することでより簡単に、そして首尾一貫した開発プロセスにすることが可能になります。

チュートリアル(https://circleci.com/docs/2.0/hello-world/)にもある通りcircle.yml ファイルを用意して設定する方が一般的です。コンフィグレーションをファイルで管理でき、かつ設定がより柔軟に出来るためです。しかし、ファイルを利用せずにCircleCIの管理画面上で設定しました。その主な理由は学生に設定ファイルを見せないようにするためです。見せたくない理由は主に以下の通りです。

  • 設定を変更した場合fork/pull済みの学生に影響が出るため
  • プルリクエストに対応するテストと実行ツールは別のリポジトリに存在しており、学生になるべく意識させないため

CircleCI 上の設定

  1. CircleCI 上でプロジェクトを追加f:id:codechrysalis:20170710201252p:plain
  2. プルリクエストのみをビルド対象にするf:id:codechrysalis:20170710201236p:plain
  3. 環境変数を設定(セキュリティ上公開したくないため)
    • TEST_UTIL_REPO: git@github.com:codechrysalis/???.git
    • TEST_UTIL_PATH: utils
    • TEST_ID: exercise1 or else f:id:codechrysalis:20170710201339p:plain
  4. テストコマンドを設定
  5. 他のリポジトリをプルするためパーミッションを付与f:id:codechrysalis:20170710201243p:plain

Github の基本的なセットアップ

管理画面

  1. プルリクエストのみCirleCIへPOSTするように設定f:id:codechrysalis:20170710201015p:plain
  2. master ブランチへのマージを禁止f:id:codechrysalis:20170710201138p:plain
  3. テストが全て成功した場合のみ生徒のブランチのマージを許可f:id:codechrysalis:20170710201123p:plain

プルリクエストのサンプル画面

  1. プルリクエスト作成後f:id:codechrysalis:20170710200938p:plain
  2. テスト失敗時f:id:codechrysalis:20170710200927p:plain
  3. テスト成功時f:id:codechrysalis:20170710200847p:plain

うまくいかなかったこと

セットアップ自体はシンプルだったのですが以下の問題が出てきました。

  • CircleCI の詳細エラーを Github 上に表示することが出来なかった
  • 生徒がテストのエラーの詳細を知るには CircleCI へログインが必須

次回はこの問題をどのように対応したか記事にしたいと思います!

お問い合わせ

コードクリサリスに興味を持ちましたら是非こちらまでご連絡ください!hello@codechrysalis.io

プログラミングを学ぶことに興味を持ちましたら是非こちらでお申し込みをお待ちしております!

最後までお読み頂きありがとうございます。それではまた!!!