Azure DevOps Server #A-1 バージョンアップ TFS 2018 Update 1 → Update 3、検索サービスの分割

**Chapters**

📘 **Chapter #1**
　📗 **Chapter #1-1**　[継続的インテグレーション（CI）構築](https://qiita.com/tfukumori/items/ef8314857ecb545c4b15)
　📗 **Chapter #1-2**　[継続的インテグレーション（CI）手順](https://qiita.com/tfukumori/items/11d24a5eee8d77a17a80)
📘 **Chapter #2**
　📗 **Chapter #2-1**　[VB6で使用する 環境設定](https://qiita.com/tfukumori/items/37f035694751dc098fcd)
　📗 **Chapter #2-2**　[VB6で使用する プロジェクトの追加](https://qiita.com/tfukumori/items/68aca8cdc04fe76d6eee)
📘 **Chapter #A**
　📗 **Chapter #A-1**　[バージョンアップ TFS 2018 Update 1 → Update 3、検索サービスの分割](https://qiita.com/tfukumori/items/778bb2e3d913106beba9)
　📗 **Chapter #A-2**　[バージョンアップ 2019→2019 Update1](https://qiita.com/tfukumori/items/7f149928a6e413afe755)

---

# TL;DR

- Team Foundation Server 2018 Update 1のシングルサーバー構成から、Team Foundation Server 2018 Update 3.2のマルチサーバー構成へのアップグレード、設定変更に関する手順について記載する

## アップグレードする理由

Team Foundation Server 2018 Update 2以降では、Wiki検索機能など大幅に[機能が向上している](https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/tfs2018-update2#wiki)。

しかし、それに伴いElastic Searchの実行にリソースを使用するため、マルチサーバーの環境を使用することが推奨されている。

[Requirements for Azure DevOps on-premises](https://docs.microsoft.com/ja-jp/azure/devops/server/requirements?view=azure-devops&viewFallbackFrom=vsts)

実際、以前2015→2018にアップグレードを試みた際には、シングルサーバー構成ではパフォーマンスが遅すぎたため、Update 1でアップグレードを止めていた。

## ハマるポイント

インストール手順の中では、以下がはまるポイントとしてあげられる

- サーバー1では、途中でインストール画面のまま中断して、サーバー2のインストールを行う手順となる（後から変更も可能、との記載あり）
- サーバー2でのJREのインストール先のパスは、空白を含まないこと（Elasticsearchのインストールが先に進まない）

# 環境
## 移行前
### サーバー1：アップグレード対象サーバー

- マシン名 server1
- Windows Server 2012 R2
- SQL Server 2016 SP2 X64
- Team Foundation Server 2018 Update 1
- ElasticSearch 同一サーバー
- Java SE Runtime Environment 8u201
- 仮想コア 2
- メモリ 12GB

### サーバー2：Elastic Search 新規インストールサーバー

- マシン名 server2
- Windows Server 2016
- 仮想コア 1
- メモリ 8GB

## 環境（移行後）

### サーバー1：アップグレード対象サーバー

- マシン名 server1
- Windows Server 2012 R2
- SQL Server 2016 SP2 X64
- **Team Foundation Server 2018 Update 3.2**
- ElasticSearch ~~同一サーバー~~ **停止**
- Java SE Runtime Environment 8u201
- 仮想コア 2
- メモリ 12GB

### サーバー2：Elastic Search 新規インストールサーバー

- マシン名 server2
- Windows Server 2016
- **ElasticSearch**
- **Java SE Runtime Environment 8u201**
- 仮想コア 1
- メモリ 8GB

# インストール手順

## サーバー1での作業（1/2）

1. アップグレード前にバックアップ（仮想基盤のスナップショットを作成）

2. Team Foundation Server 2018 Update 3.2のインストーラーを実行

    1. Webインストーラーを実行

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/50cda0bc-4252-84df-65b7-1a8eeec86661.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/bbfe4f54-801d-e43b-63d3-dcaeae4cfeee.png)

    2. 画面に従いインストール

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/9ce4567e-cb21-48b4-c749-772451a751cc.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/3e168e15-9803-5fb5-2f97-49804651ba2d.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/0c43c898-c72b-352f-22e6-2103ed69785b.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/2767e1d6-72a1-16d7-787f-d3596d1cdd31.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/e9d43ab2-5b77-461d-ffdd-90b3a56d2176.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/63dbfbce-a706-0f01-c0f0-0b80fff40fd6.png)

    3. 「検索構成の設定を指定します。」の画面を表示したまま一旦中断し、「検索サービスのパッケージ」のリンクをクリック

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/1ac2146e-fddf-4a95-cb04-5a8b0082c266.png)
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/41270041-c597-bd73-56e7-9572591919bb.png)

        ```
        C:\Program Files\Microsoft Team Foundation Server 2018\Search\zip
        ```

## サーバー2用のファイルの収集

1. 前項で表示したサーバー1の次のフォルダをコピー

    ```
    C:\Program Files\Microsoft Team Foundation Server 2018\Search\zip
    ```

    同梱のReadme.txtをよく確認すること

2. Java SE Runtime Environment 8u201 のダウンロード

    https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html

    ```
    jre-8u201-windows-x64.exe
    ```

## サーバー2での作業

1. 前項のインストーラーで、Java SE Runtime Environment 8u201のインストール。

    1. 「宛先フォルダ」にチェックして次へ

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/424635a3-e862-8466-2ad7-9f79ce0d4579.png)

    2. ライセンス確認画面で次へ（このバージョンならば、ライセンスに問題はない）

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/03ac4b83-fcaa-639a-67c0-6e4474ed0611.png)

    3. インストール先として、``C:\app\Java\jre1.8.0_201``を選択

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/24281987-7c06-e0db-35a5-9ab5f8f3128d.png)

2. 環境変数``JAVA_HOME``を設定

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/a2c62cd9-719e-bb85-cfe8-df8d93c37a7e.png)

    ```
    C:\app\Java\jre1.8.0_201
    ```

3. 前項のElastic Searchのフォルダを``C:\Program Files\Microsoft Team Foundation Server 2018\Search\zip``をサーバー2のローカルにコピー（C:\tempなど）

4. ``C:\ES``、``C:\ESDATA``を作成

5. PowerShellで以下のコマンドを実行

    ```posh
    cd (Configure-TFSSearch.ps1のローカルコピーしたフォルダ)
    .\Configure-TFSSearch.ps1 -Operation install -TFSSearchInstallPath C:\ES -TFSSearchIndexPath C:\ESDATA -User elasticuser -Password (サーバー1からElasticSearchへの接続用のパスワード)
    ```
    
    **``.\``**がないと実行できないので、注意

6. インストール完了

    ```posh:実行結果の最後
    Your Search service URL is:
    http://server2:9200
    
    Point your TFS instance to this Search Service instance via the Search Configuration wizard.
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/8e169d9f-5504-0a54-5004-acb717d55144.png)

### トラブルシューティング

#### JREがインストールされていない、またはJAVA_HOMEが設定されていない場合

```
[ERROR]: System environment variable JAVA_HOME is not set correctly.
[ERROR]:
Search requires Oracle Server JRE 8 (Update 60 or higher), and a suitable version was not detected or is not
correctly configured on this computer. If Server JRE is installed, see Java installation notes to resolve this and then
rerun this installer.
```

#### JREのインストール先にスペースを含んでいる場合

```
Removing environment variable ES_JAVA_OPTS
Elasticsearch output: elasticsearch-service.bat : 'Files' は、内部コマンドまたは外部コマンド、
発生場所 C:\temp\zip\modules\ElasticsearchHelper.psm1:244 文字:15
+     $output = & $serviceBatPath install 2>&1 | Out-String
+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ('Files' は、内部コマンドまたは外部コマンド、:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

## サーバー1での作業（2/2）

1. 「検索構成の設定を指定します。」で検索サービスの接続先にserver2のElasticSearchのURLを設定し、設定したIDとパスワードを指定

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/0485ab6d-7ef5-dab4-ceeb-4c8fe46aa024.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/823548c2-ca1e-5d79-9ac9-7e514fcb0c22.png)

2. 以降は、画面に従いインストール

3. Wiki検索等が正常に行えることを確認したら、サーバー1のElasticSearchサービスを停止、および無効として、再度動作確認