[salesforce][DevOps][CI] Grunt(grunt-force)を使ってforce.comへデプロイ

By |8月 8, 2013|CI, DevOps, Javascript, Node.js, salesforce, |


Gruntはいわゆるデプロイツール(とかビルドツール)と呼ばれるツールです。デプロイツールとは端的に言いますとデプロイに必要な作業を自動化してくれるツールです。force.com開発では「デプロイ、デプロイ」良く言いますので言葉としてそんなに違和感ないと思います。

開発チームによっては「デプロイ=修正した内容のforce.comへの転送」と単純な場合はIDEからのデプロイで事足りますが、Javascriptの構文チェックやJSファイルの結合/圧縮、less/scss (sass) + compassでCSSを生成してみたり、デプロイの度にテストを実行したり、バージョン管理をしていたりするチームですとデプロイの度にやることいっぱい!ということになります。

そういう場合にGruntは役立ちます。使い方は簡単でGruntをインストールしてGruntfile.jsに作業(タスクと呼びます)を記載してコンソールからgruntと叩くだけです。具体的にはgrunt-forceのexampleで試してみます。

まず、Githubからgrunt-forceをcloneしてサンプルに入りnpm installします。

[html]
$ git clone git@github.com:couchand/grunt-force.git
$ cd grunt-force/example/
$ sudo npm install
[/html]

続いてデプロイ先情報を修正します。デプロイ先組織にマイドメイン設定と接続アプリケーションを追加してコンシューマキーとシークレットを取得してください。あとセキュリティトークンを必要としている設定の場合はセキュリティトークンも記述してください。

[html]
$ vi creds/staging.json
{
"login_url": "artsnet-developer-edition.ap0.force.com",
"resource_url": "artsnet-developer-edition.ap0.force.com",
"client_key": "Wj6h85o0D5rhCkkd3n42PddbpeBX1ZbilubTinAofWEeRJn3MVG9I1kFE5Iul2B5JUMej_eBlP.EgJu_QAgi9",
"client_secret": "2969405775672260368",
"username": "kojo@force.com",
"password": "password",
"token": "
}
[/html]

これで、おもむろにgruntすればsrc/classes/の中身がデプロイされテストが実行されます。

[html]
$ grunt
>> Local Npm module "grunt-force" not found. Is it installed?

Running "force:staging:deploy" (force) task
force plugin executing task deploy
loading credentials from creds/staging.json
logging in to artsnet2-developer-edition.ap0.force.com as kojo@force.com
logged in successfully
looking for container
created MetadataContainer with Id 1dc100000004DpOAAU
creating junction objects now…
adding class BazTest
adding class Foobar
adding class FoobarTest
added 3 classes
waiting for all adds to complete
creating apex class BazTest
creating apex class Foobar
creating apex class FoobarTest
successfully created new ApexClass BazTest 01p10000000aeK8AAI
successfully created new ApexClass FoobarTest 01p10000000aeKIAAY
searching for classmember
searching for classmember
successfully created new ApexClass Foobar 01p10000000aeKDAAY
searching for classmember
creating classmember
creating classmember
creating classmember
inserted acm for class FoobarTest new id is 40010000000PBpCAAW
inserted acm for class Foobar new id is 40010000000PBpHAAW
inserted acm for class BazTest new id is 40010000000PBpMAAW
added 3
all adds complete
submitting deployment request
deployment complete

Running "force:staging:test" (force) task
force plugin executing task test
loading credentials from creds/staging.json
logging in to artsnet-developer-edition.ap0.force.com as kojo@force.com
logged in successfully
running tests
BazTest.doesSomeThings: Fail – System.AssertException: Assertion Failed: It should do some things.
> Class.BazTest.doesSomeThings: line 6, column 1
FoobarTest.testCustom: Pass
FoobarTest.testDefault: Pass
FoobarTest.testSet: Pass
[/html]

なんかテスト落ちてますけど…こんな感じで動きます。開発者のコミットをトリガにしてgrunt動かしたり、各開発者がローカル環境でgrunt動かしたり、ケースバイケースで導入する感じです。

ちなみに、grunt-ant-sfdcというMigrationToolを利用したものもありますので開発状況を見て利用しましょう。