Skip to content

CI 継続的インテグレーション

Tatsuya Kawano edited this page Jun 6, 2016 · 5 revisions

CIの用途

CircleCI プロジェクトページhttps://circleci.com/gh/rust-lang-ja/the-rust-programming-language-ja

本リポジトリでは、CI(継続的なインテグレーション)を、以下の用途に使用している。

  • PR(プルリクエスト)のCI
    • PRがオープンされた時と、その後、PR元のブランチに追加コミットがあった時に、都度、実行される
    • レビュー用のHTMLが自動生成される
  • masterブランチのCIと、gh-pagesへの自動push
    • PRがmasterブランチにマージされたらCIが実行され、成功したら、生成されたHTMLがgh-pagesブランチへpushされる
  • その他のブランチのCI
    • gh-pages以外のブランチならどれでも、commitがpushされる毎にCIが実行される
    • レビュー用のHTMLが自動生成される

なお、rustbookは、2016年6月現在、マークアップの問題やリンク切れなどについて、警告やエラーを出してくれない。そのため、品質の確認には使えず、単に、HTMLの自動生成と自動公開に使っている。

生成されたHTMLの閲覧や、ダウンロードの方法

  1. ウェブブラウザーでPRを開く
  2. 下の方にCIの結果が表示されているので「Show all checks」をクリックする
  3. 「ci/circleci」の右側にある「Details」のリンクをクリックするとレポートページが開く。しかし、このプロジェクトの編集権限がない人には Artifacts(成果物)のタブが表示されない
  4. そこで慌てず、URLの後ろに #artifacts を追加して、https://circleci.com/gh/rust-lang-ja/the-rust-programming-language-ja/03#artifacts のように開き直すと、成果物のリストが表示される
  5. このリストで、例えば、1.9/book/getting-started.html を クリックすると、生成されたHTMLを閲覧できる

なお、標準ライブラリのドキュメントなどは、非圧縮だとサイズが大きく、また、現状は翻訳していないため、圧縮ファイル(例:public-1.9.txz)だけに入れるようにしている。

管理者/開発者向け情報

CircleCIを利用

CircleCIの無料プランを利用している。

2016年6月時点の無料プランの内容

  • ビルド時間の上限は1,500分/月
    • 本リポジトリでは1回の実行は3から5分程度なので、月間300回くらいはビルド可能と思われる
    • 上限に達した場合でも、gh-pagesへpushするHTMLの生成などをローカルのMac/PCで行えばよいので、それほど不便ではない
  • 1コンテナ
  • 多重実行は最大4ジョブまで可能
    • 現在の設定値はデフォルトの1ジョブのまま(特に変える必要もないため)

CIの全体像

CIの設定は、circle.yml に書かれている。

CIの流れ

  • 環境変数を設定する。その中には以下のようなものがある。
    • RUST_NIGHTLY_RELEASE_DATE - rustbookがnightly版を使用するので、そのビルド日付(例:"2016-06-01"
    • RUSTBOOK_GIT_URL - rustbookソースコードのダウンロード元のgitリポジトリ(例:https://github.com/tatsuya6502/rustbook.git
    • RUSTBOOK_GIT_BRANCH - 同リポジトリのブランチ(例:rust-1.11.0-nightly
  • 依存ツールやライブラリをセットアップする
    • curl, gcc, git, make といったツール類。毎回、インストール
    • Rust nightly版、cargo、rustbook。これらはみな、CircleCIにキャッシュされるので、同じバージョンを使い続ける間は、インストール時間を節約できる。シェルスクリプト tools/circleci/setup-rust.sh でセットアップしている
  • HTMLを生成する
  • 成果物(HTML)を保存する
  • (masterブランチのみ)生成したHTMLをリポジトリへ自動push
    • masterブランチへpush
    • gh-pagesへpush
    • 詳細については次のセクションを参照

GitHubへの自動pushについて

masterブランチのCIでは、生成したHTMLを、以下のブランチへ自動pushする。

重要:自動commit時のCIのスキップ

CIからgit commit + pushする際、そのcommitによって次のCIが起動しないようスキップさせる必要がある。

それをしないと、以下のような問題が起こる。

  • masterブランチでは、CIが無限ループしてしまう
  • gh-pagesブランチでは、CIが不要なのに実行され、利用時間を無駄に消費してしまう

そこで、ブランチ毎に、以下の方法でCIをスキップしている。

  • masterブランチでは、commitメッセージに [ci skip] と書くことで、CIをスキップしている。(詳細
  • gh-pagesブランチは、circle.ymlのignore branch設定で、CIの対象外に設定している。(詳細

GitHub User Key について

GitHubのリポジトリにpushするためには、GitHub user keyの登録が必要。このキーは、指定したリポジトリの指定したGitHubアカウントに紐付けられ、そのリポジトリに対するwriteを許可する。現在は、@tatsuya6502に紐付けたキーを使用している。

設定方法

  1. CircleCIのプロジェクトページ https://circleci.com/gh/rust-lang-ja/the-rust-programming-language-ja を開く
  2. Project Settingsリンクをクリックする
  3. メニューから、Permissions → Checkout SSH Keysを選択する
  4. (初回のみ)Add user keyのところにあるAuthorize w/GitHubボタンを押す。すると、GitHubのページに遷移し、自分のGitHubアカウントのPublic SSH KeysへのAdminアクセスを追加することについて、承認を求められる。Authorize applicationボタンを押して承認する。成功すると、CircleCIのページに戻る
  5. Add user keyのところにあるCreate and add <ユーザー名> user keyボタンを押す。すると、ページ一番上のキーの一覧に、<ユーザー名> user keyが追加され、選択された状態になる。これで設定OK

参考:他のCIサービスなど

wercker

2016年6月時点で wercker も試用したが、不便な点があり、採用を見送った(詳細

良い点

  • 指定したDockerイメージ上でCIを実行できるので、環境の制御がしやすい
  • 無料プランで、事実上、無制限に使える、など

悪い点

  • 成果物(生成されたHTML)の閲覧が不便。オンラインでの閲覧ができず、tarballをローカルにダウンロードする必要がある

Travis CI

Travis CI

  • gh-pagesへの自動pushに使うGitHubトークンといった、センシティブな情報の管理が不便