# バッチ設計書 43-tizen-fetch.sh

## 概要

本ドキュメントは、Tizenパッケージ取得スクリプト（tizen-fetch.sh）の設計仕様を記載したものです。このスクリプトは、Tizenの公式リポジトリから.NETランタイムのクロスコンパイルに必要なRPMパッケージをダウンロードします。

### 本バッチの処理概要

このバッチは、Tizen公式リポジトリのメタデータを解析し、指定されたアーキテクチャ向けの必要なパッケージを自動的にダウンロードします。XMLベースのリポジトリメタデータを解析し、パッケージのURLを特定してダウンロード、チェックサム検証を行います。

**業務上の目的・背景**：.NETランタイムをTizenプラットフォーム向けにクロスコンパイルするには、Tizenのシステムライブラリやヘッダーファイルが必要です。これらはRPMパッケージとしてTizenリポジトリで提供されています。このスクリプトにより、必要なパッケージを自動的に特定・ダウンロードすることで、手動でのパッケージ管理の手間を省き、ビルド環境の構築を自動化します。

**バッチの実行タイミング**：tizen-build-rootfs.shから呼び出されるか、rootfs構築前に手動で実行されます。

**主要な処理内容**：
1. 必要なコマンド（curl, xmllint, sha256sum）の存在確認
2. Tizen-BaseおよびTizen-Unifiedプロファイルの初期化
3. リポジトリメタデータ（build.xml, repomd.xml, primary.xml）の取得
4. 指定アーキテクチャ向けパッケージのダウンロード
5. ダウンロードしたパッケージのSHA256チェックサム検証

**前後の処理との関連**：tizen-build-rootfs.shから呼び出され、ダウンロードしたパッケージはtizen-build-rootfs.shで展開されます。

**影響範囲**：指定された一時ディレクトリにRPMパッケージがダウンロードされます。ネットワーク帯域を使用します。

## バッチ種別

パッケージダウンロード / リポジトリ同期

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（rootfs構築時） |
| 実行時刻 | tizen-build-rootfs.shからの呼び出し時 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | tizen-build-rootfs.shからの呼び出し / 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| curlコマンド | HTTPダウンロード用ツール |
| xmllintコマンド | XML解析用ツール |
| sha256sumコマンド | チェックサム検証用ツール |
| gunzipコマンド | gzip圧縮ファイル展開用 |
| ネットワーク接続 | download.tizen.orgへのアクセス |

### 実行可否判定

- curl, xmllint, sha256sumのいずれかが存在しない場合はエラー終了

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $1 (TMPDIR) | string | No | ./tizen_tmp | ダウンロード先一時ディレクトリ |
| $2 (TIZEN_ARCH) | string | Yes | なし | Tizenアーキテクチャ名（armv7hl, aarch64等） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| build.xml | XML | ビルドターゲット情報 |
| repomd.xml | XML | リポジトリメタデータ |
| primary.xml | XML | パッケージ一覧とチェックサム |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| $TMPDIR/*.rpm | RPMファイル | ダウンロードされたパッケージ |
| 標準出力 | テキスト | 進捗メッセージ（VERBOSE有効時） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | {パッケージ名}-{バージョン}.{アーキテクチャ}.rpm |
| 出力先 | $TMPDIRで指定されたディレクトリ |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. 必須コマンドの存在確認
   └─ curl, xmllint, sha256sumが利用可能か確認
2. 一時ディレクトリの準備
   └─ TMPDIRが存在しない場合は作成
3. Tizen-Baseプロファイルの初期化
   └─ build.xmlからターゲットパス取得
   └─ repomd.xmlからprimary.xmlのパス取得
   └─ primary.xml.gzをダウンロードして展開
4. Tizen-Base共通パッケージのダウンロード
   └─ gcc, glibc, libicu等のコアパッケージ
5. CoreCLRパッケージのダウンロード
   └─ libgcc, libstdc++, libunwind, lttng-ust等
6. CoreFXパッケージのダウンロード
   └─ zlib, openssl, krb5等
7. Tizen-Unifiedプロファイルの初期化
   └─ unified向けリポジトリメタデータ取得
8. Tizen-Unifiedパッケージのダウンロード
   └─ gssdp, tizen-release等
9. 各パッケージのチェックサム検証
   └─ SHA256による整合性確認
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{curl存在?}
    B -->|なし| C[エラー終了]
    B -->|あり| D{xmllint存在?}
    D -->|なし| C
    D -->|あり| E{sha256sum存在?}
    E -->|なし| C
    E -->|あり| F[一時ディレクトリ準備]
    F --> G[Tizen-Base初期化]
    G --> H[共通パッケージDL]
    H --> I[CoreCLRパッケージDL]
    I --> J[CoreFXパッケージDL]
    J --> K{RISC-V?}
    K -->|Yes| L[lldb除外でDL]
    K -->|No| M[lldbも含めてDL]
    L --> N[Tizen-Unified初期化]
    M --> N
    N --> O[Unifiedパッケージ DL]
    O --> P[正常終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | - | - | このバッチはデータベース操作を行いません |

### テーブル別操作詳細

このバッチはデータベース操作を行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | Require 'curl' | curlコマンドが未インストール | curlをインストール |
| 1 | Require 'xmllint' | xmllintコマンドが未インストール | libxml2-utilsをインストール |
| 1 | Require 'sha256sum' | sha256sumコマンドが未インストール | coreutilsをインストール |
| 1 | Can not find target | XMLからターゲット情報を取得できない | リポジトリURLとメタデータを確認 |
| 1 | Fail to fetch | パッケージダウンロード失敗またはチェックサム不一致 | ネットワーク接続を確認し再実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（スクリプト自体ではリトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

1. エラーメッセージを確認し、不足しているツールをインストール
2. ネットワーク接続を確認
3. Tizenリポジトリ（download.tizen.org）が利用可能か確認
4. 一時ディレクトリをクリーンアップして再実行

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 約30パッケージ |
| 目標処理時間 | 数分（ネットワーク速度に依存） |
| メモリ使用量上限 | 特になし |

## 排他制御

同一の一時ディレクトリに対して同時実行しないでください。ファイルの競合が発生する可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 情報ログ | プロファイル初期化時 | "Initialize {arch} base" |
| 情報ログ | パッケージカテゴリ開始時 | "fetch common packages" / "fetch coreclr packages" / "fetch corefx packages" |
| 進捗ログ | 各パッケージダウンロード時 | "Fetching... {package}" |
| デバッグログ | VERBOSE>=2時 | 詳細なダウンロード情報 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDパイプラインの失敗通知 |
| チェックサム検証 | 失敗 | 標準エラー出力 |

## 備考

- ダウンロードするパッケージ一覧（Tizen-Base）：
  - 共通: gcc, gcc-devel-static, glibc, glibc-devel, libicu, libicu-devel, libatomic, linux-glibc-devel, keyutils, keyutils-devel, libkeyutils
  - CoreCLR: libgcc, libstdc++, libstdc++-devel, libunwind, libunwind-devel, lttng-ust-devel, lttng-ust, userspace-rcu-devel, userspace-rcu, lldb, lldb-devel（RISC-V以外）
  - CoreFX: libcom_err, libcom_err-devel, zlib, zlib-devel, libopenssl11, libopenssl1.1-devel, krb5, krb5-devel
- ダウンロードするパッケージ一覧（Tizen-Unified）：
  - gssdp, gssdp-devel, tizen-release
- VERBOSE環境変数で詳細度を制御可能（0: 最小, 1: 通常, 2: デバッグ）
- RISC-V 64bitではlldb/lldb-develはダウンロードされません
