2013年9月9日月曜日

Windows BacthからUnix/Linxを制御する方法

Puttyに含まれるplinkを使って外部Unix/Linuxサーバーでコマンドを実行する。
事前に公開鍵をサーバー上の~/.sshにいておく。
ダイレクトログインを禁止されていたらplinkでリモート実行出来ないかも知れません。

setlocal
set USER=server_username
set SERVER=server
rem 実行ユーザーが誰でも読める場所に秘密鍵を置く
set RSA_FILE=C:\Windows\SysWOW64\config\systemprofile/.ssh/id_rsa.ppk
set FTP_PATH=/home/hoge
set FTP_FILENAME=serverfile.txt
set FTP_FILE=%FTP_PATH%/%FTP_FILENAME%
set LOCAL_PATH=C:\path\to\file
set LOCAL_FILENAME=localfile.txt
set LOCAL_FILE=%LOCAL_PATH%\%LOCAL_FILENAME%

rem サーバーへファイルを置く。エラーが起きれば中断
rem 接続に必要な情報は全て明記。 実行ユーザーがセッションファイルを読み込めないかも知れない。
pscp -agent -batch -i %RSA_FILE% %LOCAL_FILE% %USER%@%SERVER%:%FTP_PATH% || exit 1



rem サーバーからファイルを取得。エラーが起きれば中断
rem 接続に必要な情報は全て明記。 実行ユーザーがセッションファイルを読み込めないかも知れない。
pscp -agent -batch -i %RSA_FILE%  %USER%@%SERVER%:%FTP_FILE% %LOCAL_PATH% || exit 1



rem サーバー上のスクリプトを実行
set MESSAGE=Success!
set SERVER_COMMAND=echo %MESSAGE%

rem 接続に必要な情報は全て明記。 実行ユーザーがセッションファイルを読み込めないかも知れない。エラーが起きれば中断
set COMMAND=plink -batch -ssh -agent -i %RSA_FILE% %USER%@%SERVER% %SERVER_COMMAND% || exit 1

rem 出力結果を%RESULTS%に入れる
for /f "delims=" %%i in ('%COMMAND%') do @set RESULTS=%%i

rem 出力結果を表示
echo %RESULTS%

rem Jenkinsで失敗と判断する為にShellで正常終了するとSuccess!と出力。
rem 正常終了の出力でない場合にエラーコードを設定
if not %RESULTS%==Success! exit 1

2013年9月8日日曜日

JenkinsでWindowsバッチを使う例


途中でエラーが起きたら中断
On Error Gotoなんて便利なものは無いのでエラーが起きそうな行に毎回書く必要がある。
copy a.txt b.txt || exit 1

外部バッチファイルを呼び出す
途中でエラーが起きたら中断
call somebatch.bat || exit 1

Puttyに含まれるplinkを使って外部Unix/Linuxサーバーでコマンドを実行する。事前に公開鍵をサーバー上の~/.sshにいておく。
setlocal
set USER=ssh_username
set SERVER=target_server
set MESSAGE=Success!
rem Jenkinsはユーザーのファイルを読めないので誰でも読める場所に秘密鍵を置く
set RSA_FILE=C:\Windows\SysWOW64\config\systemprofile/.ssh/id_rsa.ppk
set SERVER_COMMAND=echo %MESSAGE%

rem 接続に必要な情報は全て明記。 Jenkinsはセッションファイルを読み込めない。
rem 途中でエラーが起きたら中断
set COMMAND=plink -batch -ssh -agent -i %RSA_FILE% %USER%@%SERVER% %SERVER_COMMAND% || exit 1

rem 出力結果を%RESULTS%に入れる
for /f "delims=" %%i in ('%COMMAND%') do @set RESULTS=%%i

echo %RESULTS%

rem Jenkinsで失敗と判断する為に正常終了の出力でない場合にエラーコードを設定
if not %RESULTS%==Success! exit 1

2013年9月7日土曜日

Windowsタスクスケジューラの代わりにJenkinsを使う

Windowsで定期的に実行させる場合、タスクスケジューラを使わずにJenkinsを使う様にしました。
 Jenkinsは本来はシステム開発を自動化するツールですが、定期的にバッチを実行する高性能タスクスケジューラとして使えます。

タスクスケジューラと比べて良い点は以下です。
  1. どのジョブが失敗したか明確。
  2. 実行履歴を見てどの回が失敗したか明確。
  3. 失敗するとメール通知が出来る。
  4. 出力ログを取ってくれる上に古いログを自動的に消去も出来る。
  5. 前回の実行が終わっていなければ終わるまで待ってから実行される。(多重起動防止)
  6. ジョブ毎にパスワードを設定する必要がない。 パスワード変更時に変え忘れにくい。
 実際に設定してみましょう。
 新規ジョブを作る時はフリースタイルを選択します。

「説明」ではHTMLを書く事が出来ます。
「古いビルドの破棄」 を設定すると古いログを自動的に削除してくれます。

「ビルド手順の追加」でWindowsバッチコマンドの実行を追加します。

「定期的に実行」 で周期や時間を設定します。
表記方法はcrontabとほぼ同じです。

バッチコマンドを記入します。
Jenkinsでコマンドを入力する時の詳細は次回にでも紹介します。

ビルド後の処理の追加で「E-mail通知」を設定すると失敗の度にメール通知されます。

当然、通知先アドレスを設定します。

ジョブの一覧で失敗していると赤く表示されて分かりやすい。

履歴の一覧はこんな感じで見れます。
#5が失敗したのが一目で分かります。
 

 実行ログはコンソール出力にこんな感じで表示されます。

本来の使い方はJenkinsではじめる継続的インテグレーションなどを参考にして下さい。
 定期実行する方法に主に参考にしたのは邪道Jenkinsおひとりさまからはじめよう。おひとりさまでもはじめよう。です。

2013年9月2日月曜日

初めてのData Integration 12 仕様書作成の自動化

http://code.google.com/p/kettle-cookbook/
成果物としてプログラムの 流れなどを図に書いて提出しなければいけなかったり、人に説明する場合に手で取ったスクリーンショットを張ったりするのは面倒ですよね?
そんな場合に便利なのがkettle-cookbookです。

注意は2点
  1. INPUT_DIRに日本語を含むファイルを置くとエラーで止まる。 きっと簡単に直せるが手付かず。
  2. 出来上がった仕様書のオブジェクトを結ぶ線はInternet Explorer 6, 7では見えない。 Firefoxでは正常に表示される。

初めてのPentaho Data Integration 10 UnixサーバからSamba/Windows Shareを参照

jcifsと言うモジュールが組み込まれています。

下記のような内容でjcifs.propsと言う名前でファイルを作成。
    jcifs.smb.client.username=your_user_name
    jcifs.smb.client.password=yor_password
    jcifs.smb.client.domain=you_domein
    jcifs.netbios.wins=192.168.1.220
    jcifs.netbios.hostname=your_hostname
    jcifs.util.loglevel=3
詳細はjcifsのホームページを参照して下さい。

上記ファイルを使用する為にspoon.bat, kitchen.sh, pan.shを修正します。

Windows版Spoonを使う場合、spoon.batに追加
    set OPT=%PENTAHO_DI_JAVA_OPTIONS% " ...
    set OPT=%OPT% "-Djcifs.properties=./jcifs.props"
kitchen.shに追加
    OPT="$PENTAHO_DI_JAVA_OPTIONS ...
    OPT=$OPT" -Djcifs.properties=jcifs.props"

pan.shに追加
    OPT="$PENTAHO_DI_JAVA_OPTIONS
    OPT=$OPT" -Djcifs.properties=jcifs.props"

例えばGet File Namesで使う場合はこんな指定です。


2013年9月1日日曜日

初めてのPentaho Data Integration 9 テーブルの入れ替え

テーブルの中身を入れ替える場合に普通に作るとアプリケーションが入れ替え途中にテーブルにアクセスするつ入れ替え途中のデータが見えてしまいます。

途中のデータを見えなくするには 入れ替え途中にCommitされないように工夫する必要があります。
PentahoでCommitされないように作る場合はこんな方法があります。
ファイルからの入力を元にSQL Insert文を作成
 

Generate RowsでDelete文、Commitを作成

Append Streamで Delete→Insert→Commitとなるように並べる

データが途切れるとデータが途切れると自動Commitされるのでデータ個数を数え最後のデータを待つ。
 

 Execute row SQL scriptで実行する。コミット数を入力数より大きくする。

 SQL文をファイルに書き込んでバルクロードを使った方が素直かも。
Transformationを2つに分けなくても良いのがこの方法の利点です。

初めてのPentaho Data Integration 8 Windows 7 64bitでの動作





Windows 7 64bitではPentaho Data Integration 4.3以上が動作しません。
その場合、下記に従って変更する事で動作する様になります。

  1. swt.jarをダウンロード
    • http://archive.eclipse.org/eclipse/downloads/drops/R-3.5.1-200909170800/download.php?dropFile=swt-3.5.1-win32-win32-x86_64.zip
  2.  libswt\win64フォルダを作成
  3.  libswt\win32フォルダから以下の3ファイルをlibswt\win64へコピー
    1. jaybird21.dll
    2. JtdsXA.dll
    3. ntlmauth.dll
  4.  ダウンロードしたswt.jar をlibswt\win64へコピー
  5. Spoon.batを修正
    • 変更前 : set CLASSPATH=%CLASSPATH%;libswt\win32\swt.jar
    • 変更後 : set CLASSPATH=%CLASSPATH%;libswt\win64\swt.jar