Hatena::ブログ(Diary)

ushidayの日記 RSSフィード

2009-07-08

HudsonをWindowsサービスで実行

| 16:40

HudsonWindowsサービスで実行させようと、思いやってみましたが、またまたハマッタのでメモしときます。

サービスのインストール自体は、非常に簡単です。

  1. Hudsonの管理を開く
  2. Windowsのサービスとしてインストールを選択f:id:ushiday:20090708161115j:image
  3. サービスのインストール先を指定するf:id:ushiday:20090708161116j:image
  4. 実行ボタンをクリックして、サービスを開始するf:id:ushiday:20090708161117j:image

しかし、サービスの開始がされず、下の表示のまま変わらない...。

f:id:ushiday:20090708163550j:image

プロンプト画面を見ると、エラーが投げられていた。

f:id:ushiday:20090708161114j:image

それではと、手動でサービスを開始すると、「"ローカルコンピュータ上の テストサービス サービスは起動して停止しました。パフォーマンスログ、警告サービスなど、一部のサービスは作業がない場合に自動的に停止します"」と言われて開始できない。

もう一度インストールをと思い実行しても、既にサービスがあるから駄目みたい。

ならばと、プロンプトから「sc.exe delete hudson」でサービスを削除して、再度インストール&実行。でも結果は同じ...。

ふと、イベントビューアのアプリケーションログを見ると、古いログで一杯。

これを消去して、ついでに一杯になったら、上書きされるように設定変更。それから、サービスを開始したら、無事出来ました。

サービスで動くポート等は、インストール先フォルダの「hudson.xml」を変えれば良さそうです。port8080は他のアプリと、かち合う可能性が大なので、8086あたり「netstat -an | find "8086"」で、使ってないか調べて変更しときました。

新たにインストールした先には、前回せっかく作ったジョブがないので、「$USER_HOME/.hudson」の中身をコピペします。Hudson再起動でジョブが戻りました。

f:id:ushiday:20090708163549j:image

初めてのHudson

| 12:42

Antタスクのスケジュール用に、会社のWindows PCにこちらを参考に、Hudsonを入れてみましたので、忘れないように(小ハマリもあったので)メモしときます。

本来は、SVNなどのリポジトリに変更があった場合や別のビルドと連動して、ビルドしたりするケースなど、色々なビルドトリガが、使えて便利なようです。確かにスケジュールだけなら、cronやWindows Taskで十分ですから。でもせっかくなんで、Hudson入れてみます。

導入〜起動

導入から起動までの手順です。

  1. Hudsonのサイトから、ダウンロード(右のDownload)
  2. ダウンロードした、hudson.warを適当なフォルダに配置
  3. コマンドプロンプトで、配置したフォルダをカレントにフォルダにして、「java -jar hudosn.war」を実行f:id:ushiday:20090708100950j:image
  4. http://localhost:8080/」でHudson画面を表示f:id:ushiday:20090708100949j:image

いきなり日本語なのが、凄くウレシイです。

java -jar hudosn.war --help」でオプションが表示されます。ポートを変えたりするオプション"--httpPort"などを確認出来ます。「java -jar hudosn.war --httpPort=8081」で8081ポートで実行。

フリースタイルプロジェクトのビルド

とりあえずAntタスクの定期実行を試すだけなので、まずは、「フリースタイルプロジェクトのビルド」を実行してみます。

  1. Antの設定をする。「Hudsonの管理」→「システム設定」→「Ant」で、自動インストールのチェックを外して、インストール済みAntを”ANT_HOME”に指定(Ant単体でインストールしてなかったのでとりあえず、Eclipseantを使いました)”保存”ボタンで設定完了。f:id:ushiday:20090708122940j:image
  2. ジョブの作成。「新規ジョブ作成」で”ジョブ名”と”フリースタイル・プロジェクトのビルド”を選んで、”OK”ボタンで次へf:id:ushiday:20090708122941j:image
  3. ジョブの設定。
    • ”説明”欄に説明を記入
    • ビルドトリガ”の指定は、”定期的に実行”を選択
    • ”使用するAnt”は、「1」で設定したAntを選択
    • ビルドファイル”に”build.xml”等の存在するパスを指定
    • ”保存”ボタンで設定完了f:id:ushiday:20090708122942j:imagef:id:ushiday:20090708122939j:image
  4. 「3」で作成したジョブを選んで、「ビルド実行」で、正常にビルド出来るか確認。f:id:ushiday:20090708124037j:image
ant.batの変更(Windowsで小ハマリ)

Windows環境で上記の様に、ジョブを実行すると、Ant<javac>タスク自体は、実行されてJavaのクラスファイルは、作成されているのだが、下のようなエラーが出力される。Google先生に聞いてみたら、”%ANT_HOME%\bin\ant.bat”の「goto end」「:end」ラベルを「goto endant」「:endant」に変えればOKみたい。何でだろ?時間があったら調べてみます。

f:id:ushiday:20090708122943j:image

SQL-RPGをチョット勉強 その2

| 12:42

前回の続きで、SQL-RPGで、1行ずつFetchして、社員名を表示する例

     A*****************************************************************
     A*   MSA00F   社員マスター             09/07/08  CSC         *
     A*****************************************************************
     A                                      UNIQUE
     A          R MSA00FR                   TEXT('社員マスター')
     A            MSA001         3S 0       COLHDG('社員コード')
     A*
     A            MSA002        32O         COLHDG('社員フリガナ')
     A            MSA003        16O         COLHDG('社員名')
     A            MSA004         8S 0       COLHDG('入社年月日')
     A            MSA005         1A         COLHDG('職務コード')
     A            MSA900         8S 0       COLHDG('作成日')
     A            MSA901         6S 0       COLHDG('作成時間')
     A            MSA902         8S 0       COLHDG('変更日')
     A            MSA903         6S 0       COLHDG('変更時間')
     A*KEY
     A          K MSA001                                               
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) CHUBU SYSTEM CO,.LTD 1996 - ')
      /IF DEFINED(*CRTBNDRPG)
     H DFTACTGRP(*NO) ACTGRP(*CALLER)
      /ENDIF
     D*-----<<メインプロシージャ・プロトタイプ定義>>-----*
     D*-----<<サブプロシージャ・プロトタイプ>>-----*
     D OPEN_CURSOR     PR              N
     D FETCH_CURSOR    PR              N
     D CLOSE_CURSOR    PR              N
     D*-----<<変数>>-----*
     D******************************************************************
     D*
     C*-------------------------------------------------------------------*
     C*----------<<  FREE FORMAT                                 >>-------*
     C*-------------------------------------------------------------------*
      /FREE

           // 1行ずつのFETCH (NEXT:順読み)
           IF NOT OPEN_CURSOR() ;
              // OPEN ERROR DEFINED
           ELSE ;
               DOW FETCH_CURSOR() ;
               ENDDO ;
               CLOSE_CURSOR() ;
           ENDIF ;

           *INLR = *ON ;
           RETURN      ;

      /END-FREE

     P****************************************************************
     P** < OPEN_CURSOR  > :カーソルオープン処理                   **
     P**------------------------------------------------------------**
     P**          RETURN  : *ON=正常オープン,*OFF=エラー          **
     P**------------------------------------------------------------**
     P****************************************************************
     P OPEN_CURSOR     B
     D OPEN_CURSOR     PI              N
     D*<変数>
     D RETURN_VAR      S               N
      /FREE

              //カーソル定義
              EXEC SQL        DECLARE C1 CURSOR FOR
                              SELECT *
                              FROM MSA00F
                              ORDER BY MSA001 ;

              //カーソルオープン
              EXEC SQL        OPEN C1           ;
              IF SQLSTT = '00000' ;   // 00000:操作正常終了
                   RETURN_VAR = *ON ;
              ELSE  ;
                   RETURN_VAR = *OFF;
              ENDIF ;

              RETURN RETURN_VAR ;

      /END-FREE
     P                 E
     P****************************************************************
     P** < FETCH_CURSOR > :カーソル読取処理                       **
     P**------------------------------------------------------------**
     P**          RETURN  : *ON=正常読取,*OFF=EOF又はエラー  **
     P**------------------------------------------------------------**
     P****************************************************************
     P FETCH_CURSOR    B
     D FETCH_CURSOR    PI              N
     D*<変数>
     D RETURN_VAR      S               N
     D ROW           E DS                  EXTNAME(MSA00F)
     D                                     QUALIFIED
      /FREE

              //カーソル読み込み
              //単一行の取り出し
              EXEC SQL        FETCH NEXT FROM C1 INTO :ROW ;
              SELECT ;
              WHEN SQLSTT = '00000' ;   // 00000:操作正常終了
                  DSPLY (ROW.MSA003) ;
                  RETURN_VAR = *ON  ;
              WHEN SQLSTT = '02000' ;   // 02000:EOF
                  RETURN_VAR = *OFF ;
              OTHER ;                           //
                  RETURN_VAR = *OFF ;
              ENDSL ;

              RETURN RETURN_VAR ;

      /END-FREE
     P                 E
     P****************************************************************
     P** < CLOSE_CURSOR > :カーソルクローズ処理                   **
     P**------------------------------------------------------------**
     P**          RETURN  : *ON=正常クローズ.*OFF=エラー        **
     P**------------------------------------------------------------**
     P****************************************************************
     P CLOSE_CURSOR    B
     D CLOSE_CURSOR    PI              N
     D*<変数>
     D RETURN_VAR      S               N
      /FREE
              //カーソルクローズ
              EXEC SQL        CLOSE C1          ;
              SELECT ;
              WHEN SQLSTT = '00000' ;   // 00000:操作正常終了
                  RETURN_VAR = *ON  ;
              OTHER ;                           //
                  RETURN_VAR = *OFF ;
              ENDSL ;

              RETURN RETURN_VAR ;

      /END-FREE
     P                 E                                             

動的SQLの記述も出来る様ですが、まだ解説を見ておりません。

kkawakkawa 2009/07/09 10:30 サービスの開始にNPEで失敗する可能性のあるバグは1.316に修正を取り入れました。エラーが起きた部分が、ジョブの設定等をコピーする部分なので、何らかの問題があってコピーに失敗し、そのエラー表示にも失敗したものと思われます。

ushidayushiday 2009/07/09 12:35 kkawaさん、コメント有難うございます。
自分が入れたバージョンは”1.314”でした。
かなりの素人なので、すぐ困ってしまうことが多いですが、導入の際には、kkawaさんのわかり易い、解説のおかげで助かりました。