あるいはForce.com Security Source Code Scannerの自動化
Force.com Advent Calendar 2013 2日目のブログ記事です。
早速ですが、ISV/OEM パートナーとしてAppExchangeに製品を公開している人にとっては欠かせないのが Force.com Security Source Code Scanner 。とはいえ、なかなか手動で実行してあげないといけないということで忘れがちです。CI(継続的インテグレーション)を実践していくためには自動化しておきたいところです。
そこで、今回は Force.com Security Source Code Scanner の実行をAntで自動化します。Force.com Security Source Code Scanner はWebページから申し込むサービスなので、ブラウザテスト自動化でお世話になる Selenium2 を利用して自動化を目指します。
Selenium IDE 導入
まずは、Selenium IDEを導入。Selenium IDE は特になくても問題ないのですが、ブラウザ操作を記録して各種プログラミング言語のソースコードにエクスポートできるので優れもの。今回は、Antタスクを作成するのでJavaでエクポートしました。
ちなみに、Seleniumのブラウザ自動実行のソースコードはこんな感じになります。
WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.get("http://security.force.com/security/tools/forcecom/scanner"); driver.findElement(By.id("id_username")).clear(); driver.findElement(By.id("id_username")).sendKeys(username); driver.findElement(By.id("id_description")).clear(); driver.findElement(By.id("id_description")).sendKeys(description); new Select(driver.findElement(By.id("id_scantype"))).selectByVisibleText(scanProfile.getValue()); driver.findElement(By.cssSelector("button.btn.btn-primary")).click(); driver.findElement(By.linkText("Accept")).click(); driver.quit();
Antタスク化
あとは、Antタスク化。Webで先人たちの知恵を検索しつつ、実装。Ant の lib/ant.jar にある org.apache.tools.ant.Task を継承すればほとんどロジックの実装のみで、思ったよりも簡単にできました!
ところが、最後に罠が…。
headless化するためドライバをHtmlUnitDriverに変更してみたところ、エラー!
CSS、JavaScript周りがうまく動作せず、押下すべきボタンが見つからない模様。コンソールから実行していたときは正常動作していたように見えたのに…。
ということで、残念ながら今回の記事では時間切れのため、headless化は行わずFirefoxで実行する実装になっています。
現時点の実装では今一歩というところですが、このAntタスクをJenkinsなどで定期実行しているジョブに組み込めば、定期的にソースコードのセキュリティ・品質チェックができるようになります。
RunRscScanner
ソースコードや使い方は、GitHub で公開しています。
諸々途中で断念しているものもありますが、気が向けば見てやってください。
設定ファイルはこんな感じで、Webページから入力するUsername、Description、ScanProfileを設定できるようにしてあります。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <project basedir="." default="scan" name="Force.com Security Source Code Scanner Run" xmlns:runfscscanner="antlib:jp.gr.java_conf.a_kura.ant.runfscscanner"> <target name="scan"> <runfscscanner:runFscScanner username="admin@test.org" description="Product A" scanProfile="Beta Rules (+CRUD/FLS)" /> </target> </project>
Enjoy Advent Calendar!