281 Views
October 26, 12
スライド概要
CI Boot Camp ワークショップ1 今給黎 隆 http://www.slideshare.net/imagire/cibc-workshop-by-imagire 今回のワークショップには罠が仕掛けてあります。 この通り試しても失敗しますので注意してください。 ま、間違っていたのを直すのが面倒くさいからってわけじゃないんだから!
ワークショップ課題 • • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト アジャイル×チケット駆動×テスト駆動開発
ワークショップ課題 • • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト アジャイル×チケット駆動×テスト駆動開発
ALMiniumの設定 • ALMiniumにadminで入ります IPアドレスが変わっていたら、/opt/alminium/config/configuration.ymlを編集
プロジェクト作成 • 左上のプロジェクトを指定します • 新しいプロジェクトを作成します
プロジェクトの作成 • 名称、識別子を 設定 • SCMをGitに指定 – Gitのリモート リポジトリが 作成される
ユーザーの追加 • 管理のページへ飛ぶ • ユーザの「新しいユーザ」から、ユーザー作成
GitのSSHの無効化(1/2) • スタートメニューから、Git Bashを立ち上げる • SSHを使用しない設定を行う
GitのSSHの無効化(2/2) • 環境変数のシステム変数にも変数を追加 – Jenkinsの ユーザー用 1 4 5 3 2
Gitリポジトリをローカルにクローン • Git Extensionsで「リポジトリのクローン」 リモートのリポジトリ名 ローカルのプロジェクトルート プロジェクト名でフォルダ作成
Gitリポジトリをローカルにクローン • 成功するとその旨表示されます
Gitリポジトリをローカルにクローン • クローンし終えると、メニューの多くが使える ようになります
ワークショップ課題 • • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト アジャイル×チケット駆動×テスト駆動開発
Visual Studio プロジェクトの作成 • 目的:Makefileを用いたプロジェクトを作成 – 理由:将来的に他のOSでも動かせれば • 今回の範囲外
新規プロジェクトの作成 • ファイルメニューから新しいプロジェクトを作成
プロジェクト名の指定 • メイクファイルプロジェクトで作成する Gitのローカルリポジトリと同じことを確認
プロジェクトウィーザード (1/3) • 概要を確認
プロジェクトウィーザード (2/3) • Nmakeをビルドツールに指定
プロジェクトウィーザード (3/3) • リリースの構成は、一先ずデバッグと同じに する
ソースファイルの追加 • ソリューションエクスプローラーを右クリックし て、新しい項目を追加
メインファイルの追加 • C++ファイルとして追加
メイン関数の作成 • メイン関数を追加
makefileの作成 • C++のファイルと同じ場所に「Makefile」という 名前でテキストファイルを作成
Makefileの作成 • cppファイルからexeファイルが作成されるよう にmakefileを作成 – ネットなどからコピー • コンパイルする!
アプリらしくしてみる • Hello worldを表示してみる。
ワークショップ課題 • • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト アジャイル×チケット駆動×テスト駆動開発
Gitリポジトリにpush • 目的:最低限のファイルが出来たので、リ モートリポジトリで管理し始める
コミット • Git Extensionsで、コミットを押す
コミットするファイルの選択 • Exeファイルの生成に必要なファイルだけ選択
コミットメッセージの作成 • 今回の変更内容を記述してコミット
コミット! • ローカルのリポジトリでのコミットが行われる
リポジトリの確認 • コミットすると、そのことが画面に記される
Developブランチの作成 • 開発のマスターのdevelopブランチを作成して おきましょう
Developブランチの作成 • 派生元とブランチ名を決めて作成
Developブランチの作成 • 作成すると、結果がダイアログ表示されます
Developブランチの完成 • 完成すると、developブランチも表示されます
リモートリポジトリの設定 • コミットする際のパスワードを指定します – メニューの「リモート」-「リモートリポジトリの管理」 を選択 – URLに「https://ユーザー名:パスワード@gitサー バー名/git/プロジェクト名」を設定
リモートリポジトリにpush • ローカルの変更をリモートに反映させる
push確認 • 更新確認ダイアログを経て更新します – (図はdevelopのpush)
Push後 • だいぶ華やかになります
ワークショップ課題 • • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト アジャイル×チケット駆動×テスト駆動開発
Jenkinsによるビルド • 目的:gitに置かれたプロジェクトをjenkinsでビ ルドします
Git pluginのインストール • Jenkinsの管理から「プラグインの管理」を選択
Git pluginのインストール • Git pluginを選択してインストール
インストール画面 • 後は、インストールの進捗を待ちます
Git Pluginの設定 • システムの設定に入る、Gitの設定項目のプ ログラムパスを指定する必要があります
プロジェクトの作成 • 新規ジョブ作成から、フリースタイルでプロ ジェクトを作成します
プロジェクトの設定 (1/2) • ソースコード管理システムでgitを選択し、リポ ジトリとブランチを設定します http://ユーザー名:パスワード@サーバー/git/プロジェクト名
プロジェクトの設定 (2/2) • 設定項目の下の部分でビルドコマンドを指定 します vcvars32.bat: パスなどの指定
プロジェクト完成 • 画面にプロジェクトが表示されます
ビルド • 「ビルド実行」でビルドを行うことができます
ビルドの確認 • ビルドの履歴を選択すると、ビルド結果の画 面に飛びます
コンソール出力 • ビルドのページの「コンソール出力」で実行処 理を確認することができます
成果物 • プロジェクトページに戻り、「ワークスペース」 を見ると、ローカルのワークスペースの状態 が確認できます Jenkinsでの ビルド 完成です!
ワークショップ課題 • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ – – – – 生成されたファイルを配る 成功したビルドをマスターにコミット Gitのpushによりjenkinsを走らせる エラーをメールで通知する • Unit テスト • アジャイル×チケット駆動×テスト駆動開発
自動デプロイ • 目的:ビルドに成功した成果物を所定の場所 に配布します – 今回の配布場所はALMiniumからダウンロードで きる場所
SCPプラグインのインストール • ALMiniumのサーバーにSSHでアクセスするた めのプラグインをインストールします
Jenkinsの設定 • 「Jenkinsの管理」-「システムの設定」からSCP プラグインの設定をします
プロジェクトの設定 (1/2) • Jenkinsのプロジェクトページの「設定」から、 「ビルド後の処理の追加」で、「成果物をSCPリ ポジトリに公開」を選択します
プロジェクトの設定 (2/2) • 成果物(バイナリ)をALMiniumサーバーの 「/opt/alminium/public/test」以下に置く設定 をします
フォルダの作成 • ALMiniumサーバーの方では、その場所がな いので、ディレクトリを作成して、書き込めるよ うにします
ビルドの実行 • 以上で、ビルドを行うと、exeを作成した後に ファイルの転送が行われます
ALMiniumの設定 • ALMiniumのプロジェクトのwikiのページに リンクを追加します
ALMiniumから取得 • Wikiのページからダウンロードできるように なっているはずです! Jenkinsでの 自動デプロイ 完成です!
ワークショップ課題 • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ – – – – 生成されたファイルを配る 成功したビルドをマスターにコミット Gitのpushによりjenkinsを走らせる エラーをメールで通知する • Unit テスト • アジャイル×チケット駆動×テスト駆動開発
Jenkinsのビルド時にマージ • JenkinsのプロジェクトのGitの「高度な設定」 – Developから masterへ
ビルド後の処理の追加 • GitPublisherを追加 – 成功したら、masterをorigin(CentOSのリポジトリ)へpush
実験:プログラムの拡張 • キーが押されると終了するようにしてみよう
変更をコミット & プッシュ
プッシュ結果 • ローカルとオリジンのdevelopが更新
Jenkinsのビルドを実行 • ビルド前にマスターへのマージ • ビルド後にリモートへプッシュ
更新の確認 • Pullを実行
origin/masterの更新の確認 • リモートブランチが同じ場所にいる事を確認
ワークショップ課題 • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ – – – – 生成されたファイルを配る 成功したビルドをマスターにコミット Gitのpushによりjenkinsを走らせる エラーをメールで通知する • Unit テスト • アジャイル×チケット駆動×テスト駆動開発
Gitの変更を監視する • Jenkinsのプロジェクトの設定のからgitを監視 – 「SCMをポーリング」にチェック – Cronと同じ形式で時間を設定 • 「分 時 日 月 曜日」の指定 • 「*/5 * * * *」は5分おき
バックログを使ってみよう • ALMiniumにバックログを追加 – 「管理」-「設定」
ストーリーを追加 • プロジェクトの「バックログ」を選択 • プロダクトバックログから新しいストーリーを 追加
ストーリーの追加 • プロジェクトの「チケット」にも項目が追加 • メールも来る!
実装 • Gitで管理したくないファイルは、右クリックの 「このファイルを無視」から「.gitignoreに登録」 します – 自動生成されるファイル – 自分専用のファイル
作成された.gitignoreをプッシュ • コメントに「(ref #タスクの番号)」を付ける
Jenkinsの自動更新 • 5分以内にjenkinsがビルドを実行
チケットの確認 • 「リポジトリ」でマスターの更新を確認 • 「#1」のリンクからチケットに飛べる
チケットの終了 • チケットのステータスを 「終了」に変更 – メールも飛んでくる
ワークショップ課題 • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ – – – – 生成されたファイルを配る 成功したビルドをマスターにコミット Gitのpushによりjenkinsを走らせる エラーをメールで通知する • Unit テスト • アジャイル×チケット駆動×テスト駆動開発
エラー時の通知の設定 • Jenkinsの設定からE-mail通知の項目を設定 • 「設定を確認」から正しく送れるか確認
エラー時の通知の設定 • プロジェクトの「設定」の ビルド後の処理の追加 – E-mail通知 • 宛先を設定
エラー通知の検証 • わざとエラーを作成 エラー作成 コミット&プッシュ エラー通知 ビルド失敗
ワークショップ課題 • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト – Unitテスト導入計画 – Google Testの組み込み – Jenkinsでのテストの実行 • アジャイル×チケット駆動×テスト駆動開発
スクラム的なプロジェクト管理 • ALMinium のバックログから、要求のリストを をストーリーとして作成する 見積もりは今回は適当
スプリントバックログの作成 • 「新しいスプリント」を追加 – 名前は「Sprint #」と付ける – 本当は、固定期間の開始日、終了日を付ける • ストーリーをD&Dでスプリントに移動 – 本来は自分で出来ると信じられる限界量を移動
かんばんでタスクを追加 • かんばんを開く • ストーリーをタスクに分解
かんばん • タスクの進行に応じて移動させることで 進捗管理を行う – タスクの位置 – 残っているタスクの数 • 「スプリント障害事項」には、解決すべき問題 をストーリーとしてタスクを追加し管理する チケット番号
Git のブランチ作成 • 分岐したい場所から 右クリック • メニューから「ブランチの 作成」を選択 • 「story/#チケット番号」 でブランチ作成 • ブランチ作成と共に そのブランチに移動
ALMiniumとGitの連動 • ブランチ名をチケット番号に結び付けると チケットを見た時に、Gitのコミットが自動表示
Story ブランチでの開発 • 通常はストーリーブランチで開発を行う – タスク単位でコミットすると良い • ストーリーが完成した時にdevelopにマージする タスクが出来たらコミット
ワークショップ課題 • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト – Unitテスト導入計画 – Google Testの組み込み – Jenkinsでのテストの実行 • アジャイル×チケット駆動×テスト駆動開発
Google Testのダウンロード • Google code からgtest-1.6.0.zipをダウンロード
Google Testのインストール • Program Files等に展開
ファイルの属性の変更 • ライブラリを作成するので、「msvcフォルダ」の リードオンリー属性を外す
ライブラリの作成 • 実はそのままでは 上手くライブラリ ファイルが作れな いので、ヘッダファ イルを修正 http://srz-zumix.blogspot.jp/2012/03/visual-studio-11-beta-google-test.html
ライブラリ用のプロジェクトファイルの 読み込み • 「gtest-1.6.0/msvc/ gtest.sln 」を開く – VCのバージョンが古いもので作られているので、 ソリューションのアップグレードが行われる
ライブラリファイルのビルド • ビルドを行うと、「 gtest-1.6.0/msvc/gtest」以下 にターゲットごとにライブラリが作成される • 「lib」ディレクトリを適当に作って集約しておく
アプリケーションの設定 • アプリケーションのプロパティマネージャーを 開く
include、libフォルダの設定 • プロパティマネージャーのuserプロパティペー ジからインクルード、ライブラリディレクトリを 指定
ディレクトリの追加の結果 • これにより、ファイル名だけで呼び出しが可能 になる
テストプログラムの作成 テストを有効にするフラグ テストを動かすためのヘッダ • 「UNIT_TEST」というdefineで テスト関数か、普通の処理か 切り替える • 追加項目 – main関数でのおまじない – テスト関数 TEST ライブラリをリンクする テスト対象の関数 グループ名 個別のテスト名 テスト関数 等しい? • 呼び出しは、自動で行われる – 非テスト関数 – ヘッダとライブラリの読み込み Google testを呼び出す おまじない テストしないときは、その後を実行
実行結果 • わざとエラーを出すようにすると、このような 結果になる
正常時 • エラーを直して実行するとオールグリーンに
メイクファイルの作成 • 2つのexeが作れるように2つのターゲットを定義 Google test以外のインクルード、ライブラリの記述も必要 最初に通常アプリケーションを記述 Dオプションでフラグを定義
アプリケーションのビルド • プロジェクトディレクトリで引数なしでアプリが 作成
テストプログラムのビルド • test の引数のビルドでテストプログラム作成
ワークショップ課題 • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト – Unitテスト導入計画 – Google Testの組み込み – Jenkinsでのテストの実行 • アジャイル×チケット駆動×テスト駆動開発
マージ • Story ブランチのdevelopへの マージは、developブランチに 移動してから「ブランチのマージ」 を実行します – 今回のようにデプロイの構築を する際は、ストーリーが完了して いなくてもマージする場合もあります
マージ結果 • マージがoriginに正常にpushされると GitExtensionsと同じように、ALMiniumでも 「リビジョン」を見るとブランチがマージされた 事が確認できます 諸事情により、少し異なる履歴になっております
テストアプリの作成 • バッチコマンドで、testの引数を追加した ビルドを加えることで、テストアプリも作成でき ます
テストアプリの実行 • 作成したアプリを実行することもできます
テスト結果の出力 • Google testでは、「--gtest_output」で、XML ファイルで結果を出力できます。
テスト結果の集計 • 「JUnitテスト結果の集計」がgoogle testでも! – プロジェクトの「設定」から「ビルド後の処理の追 加」でJunitテスト結果の集計を選択 – 出力したxmlファイルを指定 – ビルド後に「テスト結果」をみて悦に浸る
ワークショップ課題 • • • • • • • Gitリポジトリの作成 Visual Studio プロジェクトの作成 Gitリポジトリにpush Jenkinsによるビルド 自動デプロイ Unit テスト アジャイル×チケット駆動×テスト駆動開発
アジャイルな開発 • 小さくリリース出来る単位で分解 – ストーリー:一日から数日:ブランチの単位 – タスク:数時間:コミットの単位 • ストーリーは依存性を排除 – UI、ビジネスロジック等の単位で作らずに成果物 を単位とする • ストーリー、タスクに見積もりを立てて、リリー ス計画が立てられるようにする • ストーリーに優先順位を付け、優先順位の高 いものから実装
チケット駆動開発 • チケットをプロジェクトの情報の中心とする • チケットによる作業の割り振りと進捗管理 • チケットなしのコミットは禁止とする – No Ticket, No Commit! • ワークフロー – – – – – – – – 大まかなリリース計画を作る 仕事を細かいタスクに分割し、チケットを発行する イテレーション単位でタスクをまとめて、イテレーション計画を作る タスクを一つ選び、実装する 差分をコミットし、完了する。(チケットのクローズ) イテレーションに紐づくタスクがすべて終了ステータスになるとリリースする。 リリース後、開発チームで作業をふりかえる。 次のイテレーション計画へ顧客の要望やふりかえりの内容を反映する。
テスト駆動開発 • 黄金の回転 – 失敗するテストを書く – テストに合格する実装を書く – リファクタリング き れ い 汚 い 動かない 動く
アジャイル×チケット駆動×テスト駆動開発 1. 2. 3. 4. 5. 6. 7. 8. ストーリーを書きだす ストーリーに優先順位を付ける ストーリーに見積もりを付ける スプリントで頑張れるストーリー量を推定する ストーリーをタスクに分解 タスクにかかる時間を付ける スプリントで頑張れるストーリー量を宣言する 毎日の最初は朝会 1. 2. 3. 9. 自分が行うタスクを宣言(と、したこと、気になる点の報告) 残りタスク時間をトラッキング 改善アクションの確認 タスクのチケットを上から順番に手を付ける 1. 2. 3. 4. テストを書く 実装を書く リファクタリングする チケットを閉じる 10. 最後に、完成済みのストーリーについてデモ 11. ふりかえりを行い、次のスプリントで実行する改善案を決める
お題 • カレンダーを作成しよう – ストーリー案 • • • • • • • 今月の日数を表示 入力した月の日数を表示 入力した月の曜日を表示 表示をマトリックスで出す 土日は色を変える 祝日も分かるように表示する (この後は自分達で考えよう!)
タスクの分解 • 今月の日数を表示 – 日数を表示する • 数自体はコードに埋め込む • テストは、期待値を文字列として比較 • 月の入力ができるようにする – – – – – キーボード入力を受け付ける 受け付けた値を数値として認識する 数値から、月の日数を計算する 年の入力がない時は今年と判定する 閏年も考慮する(グレゴリオ暦の範囲は気にしなくて いいか…)
ありがとうございました • 参考 – かんばん!~もし女子高生がRedmineで「スクラム」開発をしたら • http://www.atmarkit.co.jp/fjava/index/index_scrum.html – ブログズミ • http://srz-zumix.blogspot.jp/ – その他、各アプリケーションのページや先人の記録 で今回のワークは出来上がりました