batファイルを使用してアプリケーションを展開する

労働の過程で、私は1つのタスクに直面しなければなりませんでした。 Windowsで実行され、カーネル、プロトコル、ブリッジ、配信チャネルなどのいくつかのコンポーネントで構成される特定の製品があります。 コンポーネントの一部はJAVAで、一部はC ++で記述されています。 配信チャネルは1〜20です。 各コンポーネントは独自のデータベースを使用します(MS SQL ServerはDBMSとして機能します)。 JAVAで記述されたコンポーネントの場合、データベース構造は自動的に作成され、C ++で記述されたコンポーネントの場合、構造はSQLスクリプトを使用して手動で作成する必要があります。 各コンポーネントは、システム内のサービスとして機能する必要があります。 これらはすべて徹底的にテストする必要があります。 テストごとに、データベースとシステムサービスを再作成する必要があります。



このことを一度行った後、このプロセスを可能な限り自動化する方法を考えました(アクションは複雑ではなく、日常的です)。 ソリューションはシンプルで、ソフトウェアをインストールする必要はありません。 したがって、すぐに選択は、組み込みのコマンド言語である古くから実績のあるスクリプトファイル-Bat。 同時に、batスクリプトがまだ可能なものを確認します。



スクリプトを使用してすべてのアクションを記録しようとします。 これを行うには、ログファイル名を設定します。

@ LOGFILE = "log。%DATE%_%TIME:〜0.2%-%TIME:〜3.2%-%TIME:〜6.2%.txt"


次のような出力ファイルが得られます:log.14.02.2012_10-41-42.txt

ただし、朝または夜遅くに仕事が好きな人は、次のようになります:log.14.02.2012_ 1-03-28.txt

これを修正する方法についての提案を喜んで検討します。



UPD。 よりエレガントなソリューションを提供してくれたみんな、特にDJnKユーザーに感謝します。

for / f "tokens = 1-4 delims =:" %% a in ( 'echo%time:〜0.8%' ) do set mytime = %% a_ %% b_ %% c




バッチファイルでアクションの選択を設定します。これは最初のパラメーターとして渡されます

@ rem INSTALLまたはREMOVE

ACTION = % 1を設定




データベースに接続する行を設定します。

@ rem形式: < ComputerName > < InstanceName >または単なるIP

@ rem -Uオプションも-Pオプションも指定されていない場合、sqlcmdはMicrosoft Windows認証モードを使用して接続を試みます。

@ remこれは、sqlcmdプログラムを起動したWindowsユーザーアカウントを使用します。

url_db = "(local)"を設定します




次に、各コンポーネントに特定のパラメーターを設定します。 コンポーネントを使用する必要があるかどうか(yまたはn)は、パラメーターから設定します

@ remこれらのパラメーターを入力します、y-カーネルのグローバルデータベースを作成する場合

@ set WorkWhisKernel = % 2

@ KernelDbName =カーネルの設定

@ set KernelUserName = Kernel

@ set KernelUserPassw =カーネル

@ remベースの復旧モデル。 利用可能な完全な値| BULK_LOGGED | シンプル

@ set KernelRecovery_mode = SIMPLE



@ remこれらのパラメーターを入力します、y-チャネルのデータベースを作成する場合

@ set WorkWhisChannel = % 3

@ ChannelDbName =チャネルの設定

@ ChannelDbCount = 10を 設定

@ set ChannelUserName = Channel

@ set ChannelUserPassw =チャンネル

@ remベースの復旧モデル。 利用可能な完全な値| BULK_LOGGED | シンプル

@ ChannelRecovery_mode = SIMPLEを設定

@ rem 「_」記号を使用して、データベース名とその番号を区切ります。 たとえば、test_1またはtest1

@ Use_underline = yを設定

@ remチャネルのデータベースバージョン

@ set ChannelVersion = mssql.Channel_5.4.3.2



@ remこれらのパラメーターを入力します、y-Bridgeのデータベースを作成する場合

@ set WorkWhisBridge = % 4

@ set BridgeDbName = Bridge

@ set BridgeUserName = Bridge

@ set BridgeUserPassw =ブリッジ

@ remベースの復旧モデル。 利用可能な完全な値| BULK_LOGGED | シンプル

@ BridgeRecovery_mode = SIMPLEを設定

@ rem Bridgeのデータベースバージョン

@ set BridgeVersion = mssql.Bridge_1.1.3




さらに、ベースでのアクションのタイプ(INSTALLまたはREMOVE)、およびこのコンポーネントを使用するかどうかに応じて、特定のアクションを実行します。

便宜上、データベースに対するアクションは個別のSQLスクリプトで作成されます。 sqlcmdユーティリティを使用して作業します。 MSSQL Serverがマシンにインストールされていない場合は、sqlcmdをダウンロードして、 SQL Server Express Utility配布の一部として使用できます。



if "%WorkWhisI_k%" == "y" (

if "%ACTION%" == "INSTALL" (

@ remカーネルお​​よびユーザーと彼女のグローバルデータベースを作成します

sqlcmd -S % url_db % -i Kernel.sql >> % LOGFILE %

)

if "%ACTION%" == "REMOVE" (

@ rem informer_kernelデータベースとそのユーザーを削除します

sqlcmd -S % url_db % -i KernelDel.sql >> % LOGFILE %

)

)




ご覧のとおり、ここではすべてが非常に簡単です。 ただし、データベース、ユーザーなどの名前を転送する方法など、小さな問題があります。 sqlcmd経由で呼び出されたSQLスクリプトで?

実際、すべてが非常に簡単です。

-データベースのログインを作成する

CREATE LOGIN $ ( KernelUserName )

WITH PASSWORD = '$(KernelUserPassw)' 、 CHECK_POLICY = OFF;

行く



-データベースを作成する

使用マスター;

CREATE DATABASE $ ( KernelDbName ) ;

行く



-データベース回復モードを設定する

ALTER DATABASE $ ( KernelDbName ) SET RECOVERY $ ( KernelRecovery_mode )

行く



-データベースのユーザーを作成する

USE $ ( KernelDbName ) ;

ログイン$ ( KernelUserName )のユーザー$ ( KernelUserName )の作成

WITH DEFAULT_SCHEMA = dbo;

行く



-ユーザーに役割を割り当てる

USE $ ( KernelDbName ) ;

EXEC sp_addrolemember 'db_owner' 、 '$(KernelUserName)'

行く





同様の行は、Bridgeコンポーネント用です。 しかし、チャンネルコンポーネントについては、たとえば10個になります。 したがって、単純なループを追加します。

for / L %% i in ( 1、1 、 % ChannelDbCount % ) do (

if "%Use_underline%" == "y" (

@ ChannelDbNameCounter = % ChannelDbName % _ %% iを設定

) else (

@ set ChannelDbNameCounter = % ChannelDbName %%% i

)

% ChannelDbNameCounter %

@ remデータベースcp_serviceを作成します

sqlcmd -S % url_db % -i Channel.sql >> % LOGFILE %

@ rem cp_serviceのデータベース構造を作成します

sqlcmd -S % url_db % -i % ChannelVersion % .sql >> % LOGFILE %

)




次に、システムにコンポーネントのサービスをインストールします(チャンネルコンポーネントのみの例を示します)。

@ remチャネル数

SET ChannelDbCount = 10

@ remスタートアップの種類<ブート| システム| 自動| 需要| 無効| エラー>

SET run_type = demand

@ rem Service Dependencies ( / (スラッシュ)で区切られている)

SET depend = MSSQLSERVER



for / L %% i in ( 1、1 、 % ChannelDbCount % ) do (

@ remは、チャンネルサービスをインストールします。 コンポーネントをサービスとしてインストールするには、その内部実装が使用されます。

ルビーチャンネル%% i.exe --install

サービスの@ remは、 1分の間隔で3回再起動を設定します。 致命的なエラーが発生した場合

sc failure Channel %% i reset = 240 actions = restart / 60000 / restart / 60000 / restart / 600000

@ remサービスの開始タイプ<ブート| システム| 自動| 需要| 無効| エラー>および依存関係<依存関係( / (スラッシュ)で区切られる) >

sc config Channel %% i start = % run_type % depend = % depend %

)



インストールされたサービスを起動します。

for / L %% i in ( 1、1 、 % ChannelDbCount % ) do (

sc startチャンネル%% i

)




サービスを停止および削除するためのコードは提供しません。 彼は同一です。



ここで、前に書いたすべてを作成します。

install.bat yyyパラメーターを使用した製品デプロイメントスクリプトの実行



@ remデータベースを作成するためのパラメーターを使用してメインスクリプトを実行します

DbManage.bat INSTALL % 1 % 2 % 3



@ remインストールサービス

InstallServices.bat



@ remすべてのサービスを起動します

StartServices.bat




install.bat yyyパラメーターを使用した製品アンインストールスクリプトの実行

@ remサービスが開始されると停止します

StopServices.bat



@ remすべてのサービスを停止する時間があるように溝を作ります

@ rem Dataメソッドは、サーバー以外のWindowsでは機能しない場合があります

タイムアウト/ t 10



@ rem古いサービスを削除

RemoveServices.bat



@ rem削除用のパラメーターを使用してメインスクリプトを実行します

DbManage.bat REMOVE % 1 % 2 % 3を開始します




その結果、最小限の労力でこの操作の最初に書かれたすべての目的のアクション、つまりいくつかのパラメーターを含む通常のバッチファイルを起動することができました。

もちろん、実装は完全ではありませんが、機能を実行します。 古き良き「バッチファイル」はまだ何かを実行できますが、今度はPoverShellに切り替えます。 ただし、特に証明書と署名スクリプトにはいくつかの困難があります。



一般的に、彼らが言うように、理想的な解決策は存在しません。



All Articles