Force.com開発でGitを使ったデプロイツールを導入して得たメリット

こんにちは、川口です。

Dreamforceから無事に帰ってきました。色々な経験ができて本当に楽しめたイベントでした。それから現場復帰して、今は、Lightning Compornentフレームワークを使用した社内ツールの開発をメインに頑張っています。

さて、当社では要件や、障害の管理にBacklogを使用しています。Backlogの便利なところは、課題(要件・障害)やファイル、バージョン管理されたソースを紐づけて一元管理することや、課題を使ったチーム内のコミュニケーション、バーンダウンチャートやガントチャートで進捗を一目で確認できることで、プロジェクトの状況を一か所で簡単に把握できるところが便利ですね。

そして、Backlogを使った品質向上の試みの一つとして、以前から私の参加するプロジェクトでは、メタデータのバージョン管理や、課題とソースを紐づけをすることで、課題の要件や障害とソースの変更履歴を双方向で追跡できる環境を構築しています。また、最近では、Java開発などでは一般的なGitを使ったリリース管理(Gitのメタデータをデプロイする機能は調整中)をForce.com開発で試し始めています。Backlog上でさらに管理する範囲が広がり品質や生産性が向上できたと感じてきています。

今回は、Gitのデプロイ管理について、簡単ですが実際のプロジェクトで得た操作手順やメリットについてご紹介したいと考えています。

システム概要図

システム構成図

開発環境

開発環境は3つの組織で構成しています。左上から順に本番組織、左中段が総合テストで使用するDeveloperSandbox組織、一番下が開発者がForce.com開発で使用するDeveloperEdition組織(以降、DE組織と表記)です。図ではDE組織だけ本番組織の接続組織以外の組織なので色をオレンジにしました。

DE組織はSandbox組織の接続組織でないので、変更セットでデプロイできませんがMetadataAPIを使用するとデプロイすることができます。

開発者環境

アプリケーションの開発は、MavensMateとSublimeTextを使用しました。Git操作はSourceTreeを使用し、GitへメタデータのマージはWinMergeを使用しました。SourceTreeとWinMergeは操作が簡単で分かりやすいのでお勧めです。

組織間のデプロイ

Gitにバージョン番号のタグ付け(例:release/v.0.0.1)を行い、デプロイツールでタグのコミットIDからデプロイするメタデータファイル名をまとめたマニフェストファイル(Package.xml)を作成します。

デプロイ先がSandboxの場合、オレンジの矢印の順にDEの組織からメタデータを取得し、Sandboxにデプロイします。本番組織のデプロイは、青の矢印の順にSandboxからメタデータを取得して本番組織にデプロイしています。

システム構成図については以上です。

デプロイツール

概要

Gitを使ってデプロイできるようにツールを作成しました。下記の4つの機能が実装されてます。

  • Gitの変更履歴からマニュフェストファイルの作成
  • マニュフェストファイルを使用して組織からメタデータの取得
  • 取得したメタデータを組織にデプロイ
  • Gitのメタデータからデプロイ(現在調整中)

メリット

  • バージョン番号で課題やソースを管理
  • 過去デプロイしたバージョンの追跡可能
  • 各環境のデプロイ状態をバージョン番号で管理
  • 接続組織以外の組織に環境構築可能
  • デプロイ対象のメタデータを自動抽出することにより、デプロイの作業が軽減
  • マニュフェストファイルをコピーして別のデプロイで再利用
  • プロジェクトの反復フェーズでマニュフェストファイルを繰り返し再利用できます
  • デプロイ漏れの抑止
  • Gitの運用の定着

デメリット

  • 現在調整中の機能が使えないためGitのメタデータをデプロイできません。組織のメタデータを取得してデプロイします。なので、タイミングによって開発途中のソースがデプロイされることがあります
  • オブジェクトや画面、Apexクラス間の依存関係の影響でデプロイを分ける場合があります

その他のメリット

  • コマンドで実行可能なので、夜間バッチ実行で検証後、クイックリリースが可能
  • CIサーバでの実行が可能

以上がデプロイツールについてでした。

課題対応のフロー

  1. Backlogで課題、障害の登録
  2. 対応の優先順位付け Backlog-優先順位付け
  3. Force.com開発
  4. 変更ソースをWinMergeでGitにマージ
      WinMergeのお勧めの機能
    • 階層構造に格納されたファイルを展開して一覧表示するのでファイルが見やすい
    • 変更ファイルや行の色付けで分かりやすい
    • 変更を探す操作は[alt]+[↑↓]ボタン、マージ操作は[alt]+[←→]ボタンのみで操作が簡単です

    WinMerge001-一覧 WinMerge002-ファイルマージ

  5. 課題と紐づけて変更をコミット
    • コミットコメントで課題と紐づけるフォーマット(一行目:{課題番号}{件名}{課題の状態<#fix | #close>})を記入することで課題と紐づけられます。ここでは紐づけについて詳しい話は割愛します
  6. SourceTree001 Backlog-課題と紐づけ

  7. コミュニケーション以外にもバージョン番号や、テストの実施状況も登録 Backlog-コミュニケーション

デプロイフロー

  1. デプロイバージョン番号のタグ付け
    • 上の赤枠のようにコミットにバージョン番号のタグ(例:release/v.1.0.1)をつけます。
  2. Git-タグ付け

  3. デプロイツールを使ってコミットIDからマニュフェストファイルの作成
    • 上の図の下側の赤枠にコミットのIDが記載されています。これを下のfromTree変数と、toTree変数の値に設定します。
    • プログラムからの実行で見難くてすいません。当初、時間がなく画面を作らなかったのですが、これはこれで便利なので使い続けてます。
  4. /**
    * Package.xml作成機能テスト * @throws ModuleException モジュール例外 */ @Test public void test_createPackageXml() throws Exception { String fromTree = "ab674396012074d519d86b5dc1a1df8564681d2e"; String toTree = "cdc308618cdb3256308b89f87450107d0e61dbe5"; CMN_FileUtil.createFile(gUtil.createPackageXml(fromTree, toTree), CMN_Const.MANIFEST_FILE); }
  5. マニュフェストファイルを使用してデプロイ先から切り戻しバックアップ用のメタデータを取得
  6. /**
    * メタデータ取得機能テスト
    * @throws DAOException DAO例外
    */
    @Test
    public void test_retrieveZip() throws DAOException {
        RetrieveRequest request = metaUtil.createRetrieveRequest();
        RetrieveResult result = metaUtil.retrieveZip(request);
        metaUtil.errorhandler(result);
    }
  7. マニュフェストファイルを使用してデプロイするメタデータを取得
  8. デプロイ(サンドボックスの場合)
  9. /**
    * サンドボックスメタデータデプロイ機能テスト
    * @throws DAOException DAO例外
    */
    @Test
    public void test_deployZip002() throws DAOException {
    
        DeployOptions deployOptions = new DeployOptions();
        deployOptions.setPerformRetrieve(false);
        deployOptions.setRollbackOnError(true);
        deployOptions.setIgnoreWarnings(true);
        deployOptions.setTestLevel(TestLevel.NoTestRun);
        metaUtil.deployZip(deployOptions);
    }
  10. 検証(本番組織へデプロイの場合)
    /**
    * 本番組織メタデータ事前検証・クイックリリース機能テスト
    * @throws DAOException DAO例外
    */
    @Test
    public void test_deployZip001() throws DAOException {
    
        DeployOptions deployOptions = new DeployOptions();
        deployOptions.setPerformRetrieve(false);
        deployOptions.setRollbackOnError(true);
        deployOptions.setCheckOnly(true);
        deployOptions.setTestLevel(TestLevel.RunLocalTests);
        metaUtil.deployZip(deployOptions);
    }
    Deploy-検証
  11. クイックリリース(本番組織へデプロイの場合)
    • 検証でエラーなく成功すると、[リリース状況]の[成功]のレコードの左に[クイックリリース]というリンクが表示されます。
    • クリックリリースを実行するとテスト実行なしにリリースすることができます。

Deploy-クイックリリース

まとめ

いかがだったでしょうか?簡単な説明ですいません。私が説明したメリットは伝わって来たでしょうか?「実際に動かしてみないとわからない!」等のご意見もあると思います。

この方法を使えば、デプロイ時の要望でよく聞くデプロイ漏れの抑止や、デプロイ内容の履歴管理できるようになります。また、開発の要望の多い、複数のSandbox間の同期もこのツールを使えばできそうだと考えています。もし、興味を持っていただけたら是非試してみてください。

これからもGit関連の開発環境を充実させていきます。それでは、また