あれあの備忘録

アプリ作成の備忘録、IT関連のニュースなどなどいろいろ

jenkinsとpowershellを使って簡単なwebアプリを作成する

こんにちは! ra-men-tarouです!

今更powershellの便利さに気付きいろいろ遊んでいます。
それまではdosコマンドをつかってbat書いたり、vbaやvbsでちょっとした関数を組んだりとこのご時世でよくやるわと思いますが、セキュリティ観点や学習コスト(逃げ)、どの端末でも実行可能かなどを考慮するとなかなか重い腰があがらなかったのが事実です。
その点powershell君はwindows7以降デフォルトで導入されているので、officeのインストールが必須なVBAよりも敷居が低いので優秀です。

職場の課題共有にはtrac lightningを使っています。これも今更かもしれないのですが、jenkinsもSVNもこれ一本で導入でき、面倒なhttpd.confが最初から設定され、更にプラグインも導入済みのため、非常に気に入っています。

さて、今回はjenkinsとpowershellを合わせて簡単なwebアプリを作る方法を紹介していきたいと思います。

はじめに

まずアプリの仕様として下記を想定しています。
・インプット値をエクセルに書き込むアプリ
・jenkinsはtrac lightningに同梱されているものを使用
・jenkinsのpowershellプラグインを導入済み(https://wiki.jenkins-ci.org/display/JENKINS/PowerShell+Plugin
・処理言語はpowershellを使用
・テンプレートとなるエクセル(tmp.xls)をc:\workフォルダに保存

アプリのインプットにjenkinsのパラメータを使う

trac lightningに同梱されているjenkinsにはデフォルトでビルドの際にパラメータ値を与えることができます。
ジョブの設定画面から下図の「ビルドのパラメータ化」のチェックボックスにチェックを入れてください。

f:id:ra-men-tarou:20151213160024p:plain

何種類かパラメータの種類がありますが、今回は文字列と選択を使います。
(※パラメータは複数指定可能)
文字列は1行の文字列、選択はプルダウンから指定した値をユーザに選ばせるものとなります。 名前欄にはそのパラメータを受け取る環境変数名を入力します。既存の環境変数と衝突しないように 注意しましょう。 今回は文字列にwriter-nameを、選択にwriter-teamを入力。

パラメータを詳しく知りたい場合は下記ページが参考になります。 qiita.com

powershellを使ってパラメータをエクセルに書き込む

「ビルド手順の追加」からWindows Powershellを選択し、下記ソースを入力。

#テンプレートをコピー
Copy-Item C:\work\tmp.xls c:\work\copy.xls

# Excelオブジェクト作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

# コピーしたExcelを開く
$book = $excel.Workbooks.Open("c:\work\copy.xls")

#開いたExcelの1枚目のシートを開く
$sheet = $excel.worksheets.item(1)

$sheet.Cells.Item(1,1) = get-content env:writer-team #writer-teamの値をA1セルに入力
$sheet.Cells.Item(1,2) = get-content env:writer-name #writer-nameの値をB1セルに入力

# 上書き保存
$book.Save()

# 閉じる
$excel.Quit()

# プロセスを解放する
$excel = $null
[GC]::Collect()

ジョブの画面から「パラメータ付きビルド」を押下して実行しましょう。

さいごに

プラグイン「Dynamic Parameter Plug-in」を使えばGroovyスクリプトを使ってパラメータを動的に変更できるみたいなので、 アプリの幅が広がるかと思います。
僕としてはGroovyスクリプトを使ったことがないので使う気はないのですが、powershellを使えば似たようなことができると思います。
例えばパラメータを持たせたジョブ(①)のconfig.xmlを書き換えるジョブ(②)を①のジョブの前に実行するようにすれば実現可能でしょう。
powershellにはオブジェクトをxml形式にパースして読み書きする機能が備わっているので②のジョブ内でいくらでも処理できます。

こういったアプリをプログラム言語をつかってMVCに沿って作るのもいいのですが、どんな機能が必要か使い勝手を見てから決めたいという時にこの方法は便利かもしれません。最低限必要なCの部分を将来採用予定の言語で作ってしまい、jenkinsとの連携をpowershellなどを使う。商用などではなくあくまで職場内で使用するアプリにはこれくらいがいいのかもしれないと思うのです。