-
Notifications
You must be signed in to change notification settings - Fork 73
CI 継続的インテグレーション
プロジェクトページ: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の自動生成と自動公開に使っている。
- ウェブブラウザーでPRを開く
- 下の方にCIの結果が表示されているので「Show all checks」をクリックする
- 「ci/circleci」の右側にある「Details」のリンクをクリックするとレポートページが開く。しかし、このプロジェクトの編集権限がない人には Artifacts(成果物)のタブが表示されない
- そこで慌てず、URLの後ろに
#artifacts
を追加して、https://circleci.com/gh/rust-lang-ja/the-rust-programming-language-ja/03#artifacts のように開き直すと、成果物のリストが表示される - このリストで、例えば、1.9/book/getting-started.html を クリックすると、生成されたHTMLを閲覧できる
なお、標準ライブラリのドキュメントなどは、非圧縮だとサイズが大きく、また、現状は翻訳していないため、圧縮ファイル(例:public-1.9.txz)だけに入れるようにしている。
CircleCIの無料プランを利用している。
2016年6月時点の無料プランの内容
- ビルド時間の上限は1,500分/月
- 本リポジトリでは1回の実行は3から5分程度なので、月間300回くらいはビルド可能と思われる
- 上限に達した場合でも、gh-pagesへpushするHTMLの生成などをローカルのMac/PCで行えばよいので、それほど不便ではない
- 1コンテナ
- 多重実行は最大4ジョブまで可能
- 現在の設定値はデフォルトの1ジョブのまま(特に変える必要もないため)
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
- 詳細については次のセクションを参照
masterブランチのCIでは、生成したHTMLを、以下のブランチへ自動pushする。
- masterブランチ自身 -- シェルスクリプト tools/circleci/push-to-master.sh を使用
- gh-pagesブランチ -- シェルスクリプト tools/circleci/publish-to-gh-pages.sh を使用
重要:自動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のリポジトリにpushするためには、GitHub user keyの登録が必要。このキーは、指定したリポジトリの指定したGitHubアカウントに紐付けられ、そのリポジトリに対するwriteを許可する。現在は、@tatsuya6502に紐付けたキーを使用している。
設定方法
- CircleCIのプロジェクトページ https://circleci.com/gh/rust-lang-ja/the-rust-programming-language-ja を開く
- Project Settingsリンクをクリックする
- メニューから、Permissions → Checkout SSH Keysを選択する
- (初回のみ)Add user keyのところにあるAuthorize w/GitHubボタンを押す。すると、GitHubのページに遷移し、自分のGitHubアカウントのPublic SSH KeysへのAdminアクセスを追加することについて、承認を求められる。Authorize applicationボタンを押して承認する。成功すると、CircleCIのページに戻る
- Add user keyのところにあるCreate and add <ユーザー名> user keyボタンを押す。すると、ページ一番上のキーの一覧に、<ユーザー名> user keyが追加され、選択された状態になる。これで設定OK
2016年6月時点で wercker も試用したが、不便な点があり、採用を見送った(詳細)
良い点:
- 指定したDockerイメージ上でCIを実行できるので、環境の制御がしやすい
- 無料プランで、事実上、無制限に使える、など
悪い点:
- 成果物(生成されたHTML)の閲覧が不便。オンラインでの閲覧ができず、tarballをローカルにダウンロードする必要がある
- gh-pagesへの自動pushに使うGitHubトークンといった、センシティブな情報の管理が不便