---
title: "アイテムの展開"
slug: "deploying-items"
abstract: "Dockerを使うときにSitecoreアイテムをどのようにデプロイするかを説明しています。"
---
# アイテムの展開

このトピックでは、Docker上のSitecoreアイテムパッケージとデプロイ自動化戦略について説明します。使用するアイテムシリアライゼーションツールによって方法はいくつかあります。

## Sitecore CLIおよびSitecoreコンテンツシリアライズ

Sitecore CLIは、リモートのSitecoreインスタンスとのスクリプト化されたやり取りに最適化されています。継続的インテグレーションプロセス中にアイテムのパッケージ化に使用でき、デプロイやデリバリーのプロセス中にパッケージをインストールすることもできます。Sitecore CLIを用いてSitecore環境へのアイテム展開を自動化するのは、コンテナ使用時も同じです。

[Sitecore CLIのドキュメント](https://doc.sitecore.com/xp/ja/developers/103/developer-tools/sitecore-content-serialization.html "Sitecore Content Serialization")には詳細が記載されており、[Sitecoreモジュールリファレン](https://doc.sitecore.com/xp/ja/developers/103/developer-tools/sitecore-module-reference.html "Sitecore module reference")スにはCMコンテナイメージに必要なSitecore Management Servicesモジュールをインストールする方法が記載されています。

## Sitecore TDS

[Sitecore TDS](https://www.teamdevelopmentforsitecore.com/)にはアイテムのパッケージ化やデプロイを促進する組み込みツールがいくつかあります。一般的なアプローチとしては、これらのツールを使ってソリューション構築時にアイテムパッケージを作成し、Sitecoreランタイムイメージを構築する際にそれらをContent Management (CM)イメージに追加するというものです。

[Helix。GitHubのサンプルリポジトリ](https://github.com/Sitecore/Helix.Examples)には完全な例があります。

### Sitecore TDSプロジェクト構成

この例は、[Build Output](https://hedgehogdevelopment.github.io/tds/chapter4.html#build)と[WebDeploy Packages](https://hedgehogdevelopment.github.io/tds/chapter4.html#webdeploy-package)という2つのSitecore TDS機能を利用しています。これらはTDSプロジェクトのプロパティページで設定されています:

-   **ビルド出力パス** - **ビルド** ページにあり、 Release ビルド設定を設定します。すべてのプロジェクトで共有されるパスTDS指定します。例では、これは ..\\..\\TdsGeneratedPackages\\Release\\に設定されています。
-   **ビルドWebDeployパッケージ** - **WebDeployパッケージ**ページにあり、Releaseビルド設定を選択してください。*Package Name*を指定します。*コードおよびアイテムパッケージオプション*は「*アイテムのみパッケージ*」を選択します。

以下は、TDSプロジェクトを適切に設定していることを前提にしています。

### ソリューションビルドで設定

Sitecore TDS Dockerまたはクラウドビルドの環境変数のライセンスが必要です:

-   ソリューションビルドDockerfileでは、コードコンパイルとビルドステージの最初にこれらの項目をARG宣言してください(例ではbuilder ):
    
    ARG TDS\_Owner
    ARG TDS\_Key
    
    Dockerfile内の位置は[スコープ](https://docs.docker.com/engine/reference/builder/#scope)ARG重要です。もし前のビルド段階でこれらを宣言すると、builder段階で使われた値は空になります。また、ARGは画像作成にのみ使われるため、ENVではなく使われていることにも注意してください。
    
    これらの値はdocker-compose.override.ymlファイル内のsolutionサービスとして入力されます。例えば:
    
    solution:
     image: ${REGISTRY}${COMPOSE\_PROJECT\_NAME}-solution:${VERSION:-latest}
     build:
     context: .
     args:
     BASE\_IMAGE: ${SOLUTION\_BASE\_IMAGE}
     BUILD\_IMAGE: ${SOLUTION\_BUILD\_IMAGE}
     TDS\_Owner: ${TDS\_OWNER}
     TDS\_Key: ${TDS\_KEY}
     scale: 0
    
    TDS\_OWNERとTDS\_KEYの値は[環境ファイル](https://docs.docker.com/compose/env-file/)(.env)に保存できますが、通常はローカル開発マシンではシステム環境変数として、ビルドサーバーではセキュリティ上のシークレットとして指定します。
    
-   ソリューションビルドDockerfileでは、msbuild命令を簡略化し、代わりにTDSプロジェクトで設定したビルド出力に頼ることができます。
    
    RUN msbuild /p:Configuration=Release
    
    ビルド出力はTDSプロジェクトで指定された位置( *Build Output Path*)に着地します。 builderのWORKDIRに対してです。例では、これはビルド出力が次のことを意味します。
    
    -   \\build\\TdsGeneratedPackages\\Release (ファイル)
    -   \\build\\TdsGeneratedPackages\\WebDeploy\_Release (WDPアイテムパッケージ)
    
    builder段階から最終画像にコピーし、次の構造で作成します。
    
    -   \\artifacts\\website
    -   \\artifacts\\packages
    -   \\artifacts\\transforms
-   最終指示は以下のように調整できます:
    
    WORKDIR C:\\artifacts
    COPY --from=builder \\build\\TdsGeneratedPackages\\Release .\\website\\
    COPY --from=builder \\build\\TdsGeneratedPackages\\WebDeploy\_Release .\\packages\\
    COPY --from=builder C:\\out\\transforms .\\transforms\\
    

### Sitecore CMのランタイムイメージに追加

solutionイメージにアイテムをパッケージ化・含めたら、Sitecoreランタイムイメージを構築する際にそれらをContent Management (CM)イメージに追加できます。

*CM*サービスのDockerfileの最後に、アイテムパッケージをデプロイするための指示を追加してください。TDSにはこの処理方法として2つのオプションがあります:

-   オプション1:コンテナ作成時にデプロイ
    
    これによりSitecore TDSサイト起動時にアイテムパッケージをインストールできます。 [TDSの組み込み機能](https://hedgehogdevelopment.github.io/tds/chapter7.html#deployment-process)を使用しています。ただし、このイメージを使ってコンテナを作成するたびにこの現象が発生することに注意してください:
    
    COPY --from=solution \\artifacts\\packages\\ \\temp\\
    RUN Get-ChildItem -Path 'C:\\\\temp\\\\\*.wdp.zip' | % { Expand-Archive -Path $\_.FullName -DestinationPath 'C:\\\\temp' -Force; }; \`
     Move-Item -Path 'C:\\\\temp\\\\Content\\\\Website\\\\Bin\\\*' -Destination .\\bin -Force; \`
     Move-Item -Path 'C:\\\\temp\\\\Content\\\\Website\\\\temp\\\*' -Destination .\\temp -Force; \`
     Remove-Item -Path 'C:\\\\temp' -Recurse -Force; \`
     # Ensure TDS has permissions to delete items after install
     cmd /C icacls .\\temp\\WebDeployItems /grant 'IIS AppPool\\DefaultAppPool:(OI)(CI)M';
    
-   オプション2:オンデマンド展開
    
    tooling画像のDeploy-TdsWdpPackages.ps1スクリプトを使いましょう。パッケージと一緒にコピーしてください:
    
    COPY --from=tooling \\tools\\scripts\\Deploy-TdsWdpPackages.ps1 \\install\\Deploy-TdsWdpPackages.ps1
    COPY --from=solution \\artifacts\\packages\\ \\install\\packages\\
    
    その後、以下のスクリプトでコンテナ上でオンデマンドでDeploy-TdsWdpPackages.ps1を呼び出すことができます:
    
    docker exec <container> powershell -command "C:\\install\\Deploy-TdsWdpPackages.ps1"
## ユニコーン

> !重要Unicornはサードパーティ製のオープンソースツールであり、Sitecoreサポートによってはサポートされていません。これらの指示は、Unicornユーザーの便宜のためにあくまでガイダンスとして提供されています。

ここで説明する他のシリアライズツールとは異なり、[Unicorn](https://github.com/SitecoreUnicorn/Unicorn)には組み込みのパッケージング機能がなく、Sitecoreプラットフォームでプロセス中に動作します。したがって、Unicornの設定内のシリアライズされたアイテムは、同期したい場合にContent Managementインスタンスのファイルシステムに存在する必要があります。Dockerを使うと、コンテナビルド時にアイテムをコピーできるため簡単です。Unicornはアイテム同期をトリガーする[PowerShellモジュール](https://github.com/SitecoreUnicorn/Unicorn/tree/master/doc/PowerShell%20Remote%20Scripting) も提供しています。これはコンテナ使用時にアイテム展開の自動化に便利です。

以下の手順は、すでにDockerを使ってソリューションを構築し、カスタムSitecoreイメージを作成していることを前提としています。 [Helixを参照してください。GitHubのサンプルリポジトリ](https://github.com/Sitecore/Helix.Examples) で完全な例があります。

### 解決策のアーティファクトにシリアル化されたアイテムを追加してください

Unicornを使う場合、通常はシリアル化されたアイテムをSitecoreソリューションソース内に配置し、Unicorn構成で定義された構造で整理します。これはおそらく[Sitecore Helix手法](https://helix.sitecore.net)に従うこともあります。これらのシリアライズされたアイテムはソリューションビルド中にコピーできますが、ディレクトリ構造を保持することが重要です。Robocopyはこれを実現する簡単な選択肢の一つです:

# Copy serialized items, retaining directory structure
RUN Invoke-Expression 'robocopy C:\\build\\src C:\\out\\items /s /ndl /njh /njs \*.yml'

# ... later in your artifacts build stage
WORKDIR C:\\artifacts
COPY --from=builder c:\\out\\items .\\items\\

### アイテムやデプロイスクリプトをCMイメージにビルドしてください

ソリューションイメージにビルドアーティファクトとしてアイテムができたら、以前にmsbuild出力で行ったようにCMイメージにコピーしてください。さらに、Unicornリモートに必要なファイルをCMイメージに配置し、後でCMコンテナからスクリプト同期を実行するようにしましょう。

1.  CM[ビルド](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#understand-build-context)コンテキスト内のunicornフォルダには[、Unicornリモートスクリプトに必要なファイル](https://github.com/SitecoreUnicorn/Unicorn/tree/master/doc/PowerShell%20Remote%20Scripting)が含まれていなければなりません:
    
    -   MicroCHAP.dll
    -   Unicorn.psm1
    -   習慣 sync.ps1
2.  この場合、sync.ps1スクリプトには標準的なSync-Unicorn呼び出しが含まれ、環境変数を使ってUnicorn共有秘密を埋める必要があります。
    
    $ScriptPath = Split-Path $MyInvocation.MyCommand.Path
    Import-Module $ScriptPath\\Unicorn.psm1
    Sync-Unicorn -ControlPanelUrl 'http://localhost/unicorn.aspx' -SharedSecret $env:UNICORN\_SHARED\_SECRET
    
3.  CM Dockerfileで、このフォルダとシリアライズされたアイテムのアーティファクトをコピーし、後でUnicornの設定に使える環境変数を設定します:
    
    # Set the default location for serialized items
    # This value will be used in our Unicorn configuration
    ENV ITEM\_SYNC\_LOCATION c:\\items
    
    # Copy serialized items and Unicorn sync script
    COPY --from=solution \\artifacts\\items\\ \\items\\
    COPY .\\unicorn \\unicorn\\
    

### UnicornとDocker環境の設定をしてください

ユニコーン同期に使用されるベースファイルシステムパスは通常、Sitecore設定時に「sourceFolder」と呼ばれるsc.variableを使って設定されます:

1.  上記の環境変数からこの値を入力Dockerfile。
    
    <sc.variable name="sourceFolder" value="$(env:ITEM\_SYNC\_LOCATION)" />
    
2.  環境変数からUnicorn共有の秘密も入力し、前回の環境変数と同じ環境変数を使えるようにsync.ps1 :
    
    <authenticationProvider type="Unicorn.ControlPanel.Security.ChapAuthenticationProvider, Unicorn">
     <SharedSecret>$(env:UNICORN\_SHARED\_SECRET)</SharedSecret>
    </authenticationProvider>
    
3.  この環境変数をdocker-compose.override.ymlで定義し、.env:
    
    cm:
     ...
     environment:
     UNICORN\_SHARED\_SECRET: ${UNICORN\_SHARED\_SECRET}
    
    UNICORN\_SHARED\_SECRET=your-secret-here
    

### 同期を実行してください

この時点で、ユニコーンとアイテム同期を発動するために必要なものはすべて揃っています:

-   CMコンテナのファイルシステム上のシリアライズされた項目
-   Unicornはこのパスをアイテムソースとして使用するように設定しています
-   環境変数によって構成されたユニコーンの共有秘密
-   同期をトリガーするPowerShellスクリプト

アイテムを手動でデプロイする場合、または配送パイプライン内でのどちらであっても、docker execまたは本番コンテナオーケストレーター内の同等のツールをご利用ください:

docker exec <container> powershell -command "c:\\unicorn\\sync.ps1"

## さらなる参考文献

-   [Sitecoreコマンドラインインターフェース](https://doc.sitecore.com/xp/ja/developers/103/developer-tools/sitecore-command-line-interface.html "Sitecore Command Line Interface")
-   [Sitecore TDSドキュメント](http://hedgehogdevelopment.github.io/tds/)
-   [ランニングコンテナとアイテムを同期させる](https://doc.sitecore.com/xp/ja/developers/103/developer-tools/sync-items-with-a-running-container.html "Sync items with a running container")