社内ツール配布における課題:環境構築の「沼」を回避する
エンタープライズ環境でエンジニアが直面する最大のストレスの一つは、開発環境では完璧に動作するツールが、他部署のPCに配布した途端に動かなくなることです。「ライブラリが足りない」「Pythonのバージョンが違う」「パーミッションの設定が漏れている」といったトラブル対応で、技術チームの貴重な時間が奪われるのは避けるべきです。
本記事では、自社開発の視覚解析スイート「AIGlasses OS Pro」を例に、必要なランタイムや依存関係をすべて含んだ「標準インストーラー」を作成し、誰でも一クリックでデプロイできる環境を整える方法を解説します。
1. パッケージ化の設計:資産と構造の整理
闇雲にパッケージングを始める前に、アプリケーションの構成要素を整理し、ターゲット環境での「設計図」を描きます。
- 実行バイナリ: PyInstallerなどで固めた実行ファイル、またはソースコード群。
- ランタイム環境: Pythonインタプリタや特定の共有ライブラリ(OpenCV等)。社内環境では、ネットワーク制限を考慮し、依存関係をすべて同梱する「フルパッケージ」方式が推奨されます。
- 静的リソース: 学習済みモデル(.onnx等)、設定ファイル(config.yaml)、アイコン画像。
- システム連携: バックグラウンドで動作させるためのサービス定義(systemdやWindows Service)、デスクトップのショートカット。
以下は、Linux(DEBパッケージ)を想定した標準的なディレクトリ構造の例です:
aig-pro-suite_1.0.0/
├── DEBIAN/
│ ├── control # パッケージのメタ情報
│ ├── postinst # インストール後の設定スクリプト
│ └── prerm # アンインストール前の処理スクリプト
└── opt/
└── aig-pro/
├── bin/
│ └── aig-core # メインバイナリ
├── models/ # モデルデータ
├── config/ # デフォルト設定
└── icons/ # アプリロゴ
2. Linux環境での実装:DEBパッケージとFPMの活用
2.1 Debian/Ubuntu向けパッケージ作成
dpkg-debを使用して、ネイティブなDEBパッケージを作成します。まず、DEBIAN/controlファイルに依存関係とメタデータを記述します。
Package: aig-pro-suite
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Depends: libopencv-dev (>= 4.0), python3 (>= 3.9)
Maintainer: Engineering Team <dev@internal.company.com>
Description: Enterprise Visual Analysis Suite
Internal tool for secure image processing.
次に、インストール後にサービスを登録するためのDEBIAN/postinstスクリプトを作成します。
#!/bin/bash
# システムユーザーの作成
if ! id -u aig-worker >/dev/null 2>&1; then
useradd --system --no-create-home --shell /usr/sbin/nologin aig-worker
fi
# 権限の付与
chown -R aig-worker:aig-worker /opt/aig-pro
chmod 755 /opt/aig-pro/bin/aig-core
# systemdユニットの有効化
cp /opt/aig-pro/config/aig-pro.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable aig-pro.service
exit 0
2.2 FPMによる高速パッケージング
より柔軟にRPMやDEBを切り替えたい場合は、fpm(Effing Package Management)が便利です。以下のコマンド一発で、ディレクトリ構造をRPMパッケージに変換できます。
fpm -s dir -t rpm \
-n "aig-pro-suite" \
-v 1.0.0 \
--prefix /opt/aig-pro \
-C ./build_dir \
--after-install ./scripts/setup_env.sh \
--depends "opencv >= 4.0" \
.
3. Windows環境での実装:Inno Setupによるインストーラー作成
Windows環境では、GUIベースのインストーラーが一般的です。Inno Setup(.issスクリプト)を使用することで、プロフェッショナルなセットアッププログラムを作成できます。
[Setup]
AppName=AIGlasses OS Pro
AppVersion=1.0.0
DefaultDirName={commonpf}\InternalSystems\AIG-Pro
DefaultGroupName=AIG-Pro
OutputDir=bin_output
OutputBaseFilename=AIG_Pro_Setup_v1.0
Compression=lzma
SolidCompression=yes
[Files]
; アプリケーション本体とリソースのコピー
Source: "release_build\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
; スタートメニューとデスクトップのショートカット
Name: "{group}\AIGlasses OS Pro"; Filename: "{app}\bin\aig-core.exe"; IconFilename: "{app}\icons\main.ico"
Name: "{commondesktop}\AIGlasses OS Pro"; Filename: "{app}\bin\aig-core.exe"
[Run]
; インストール完了後にサービス登録バッチを実行
Filename: "{app}\scripts\install_service.bat"; Parameters: "/install"; Flags: runhidden
Windowsサービスとして登録する場合、nssm(Non-Sucking Service Manager)などのユーティリティを同梱しておくと、Pythonスクリプトや通常のEXEを安定してバックグラウンド動作させることができます。
4. システム統合と自動化の重要ポイント
単にファイルを配置するだけでなく、OSの管理機能に深く統合させることが、運用負荷を下げる鍵となります。
- サービス管理: アプリが異常終了した際の自動再起動設定を
systemd(Restart=always)やWindowsのサービス回復オプションで設定します。 - ログのローテーション: ログファイルがディスクを圧迫しないよう、
logrotateの設定ファイルを配布に含めるか、アプリ側でサイズ制限を設けます。 - 環境変数の制御:
/etc/environmentやシステムのプロパティを汚さず、アプリ起動用のラッパースクリプト内で必要なパスを通すようにします。
5. 内部テストとデプロイ戦略
パッケージが完成したら、以下のステップで検証と配布を行います。
- クリーンインストールテスト: 依存関係が全くない仮想マシン(VM)上で、インストーラーのみで完結するか確認します。
- アップグレードパスの確認: v1.0が入っている環境にv1.1を上書きし、ユーザー設定やデータベースが正しく継承されるか検証します。
- 配布チャネルの構築:
- 社内リポジトリ: JFrog ArtifactoryやSonatype Nexusを使用して、APT/YUMリポジトリを構築し、
apt upgradeで更新できるようにします。 - 構成管理ツール: AnsibleやTerraformを用いて、サーバー群へ一括デプロイします。
- 社内リポジトリ: JFrog ArtifactoryやSonatype Nexusを使用して、APT/YUMリポジトリを構築し、
手動でのセットアップを廃止し、パッケージベースの管理に移行することで、技術チームは「環境の修復」ではなく「新機能の開発」に集中できるようになります。AIGlasses OS Proのような高度なツールこそ、堅牢なパッケージングがその価値を最大化させます。