【UiPath Studio】バージョン管理にSVNを使ってみる。

# はじめに
UiPath StudioにはGitやSVNバージョン管理ツールとの連携機能が用意されています。
現在ではGitをご利用されるケースが多いかもしれません。

UiPath StudioのSVN機能の情報が少ないため、この機能を使って何ができるか、どんな操作感なのか、などを確認していきます。
SVNはSubversion（サブバージョン）の略です。

:::note
UiPath StudioのSVN機能の確認を目的としており、SVNサーバーの導入手順は省略します。
:::

# SVN連携機能の有効化の手順

:::note 
UiPath Studioはv23.4を利用しています。
:::

**ツール > プラグイン > ソース管理プラグイン**  から　SVN を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/9e081f93-5fdd-da97-f492-ff86ebaba898.png)

SVN機能が有効化されると、下図の右クリック メニューが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/7391fcc1-2ca3-4d2f-60ae-0cd2b83ba81f.png)


:::note
 **xaml編集後のアイコン表示**
編集後、Studioの画面からファイルの状態を示すアイコンの表示となります。

Main.xamlを更新した状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/39ecf314-e6d2-da9c-01a2-83bca4e48647.png)

追加シーケンス.xamlを追加した状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/78eb593e-5a16-3adc-682d-078082555e9d.png)

Studio下部のペンのマーク。（下図は、2件の未コミット対象があることを示してます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/a00c190e-ce37-0851-e29f-16a74429b8f3.png)
:::

# よくあるシナリオに沿ったStudioのSVN機能の使い方

:::note
全体的に **チェックイン** と **コミット** という2種類の表現、表示があります。同じ操作（リポジトリに修正を登録）を指しているようです。
:::

## ★シナリオ１：　開発済のプロジェクトをSVNサーバーへコミットする。

SVNで管理したいプロジェクトを開き、Studio下部の以下のメニューを選択します。

**＋ソース管理に追加 > SVNに追加**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/d8953a17-16be-d90e-f536-77b4967e2e1b.png)

表示されたダイアログに必要な情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/76b47e87-b54a-11b0-9240-fbfc2e51a048.png)
| 項目名 | 入力値 | 補足説明 |
| ------ | ----- | ----- |
| リポジトリURL | SVNサーバーのURLを入力。 | 当検証ではhttpプロトコル、ポート81で環境を使いました。 |
| チェックアウト ディレクトリ | ソースを置く自身のPCのパスを入力。 | 初期値としてプロジェクトのパスが入力されています。 |
| 資格情報を使用 | SVNサーバーで認証する場合はチェックを入れる。 | 
| ユーザー | SVNサーバーへ接続するユーザーを入力。 | 当検証ではsvnというユーザーを定義しています。 |
| パスワード | SVNサーバーへ接続するパスワードを入力。 |

SVNへチェックイン（コミット）をする対象を選択し、
**コミットメッセージ** （必須）へメッセージを入力、**チェックイン** ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/a4cb20c5-80b4-f1d2-2f15-2ec57d6ad9ea.png)

:::note
SVNへチェックイン（コミット）をすると、該当のプロジェクトのフォルダに「.svn」というフォルダが作成されました。この中に接続の定義が作成されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/53231b0c-1e73-cae8-240a-217cc0b5fc37.png)
:::



## ★シナリオ２：　既にSVNサーバーにコミットされているプロジェクトを取得する。
**チーム > SVNから開く** を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/31ab743d-37b6-36ff-8dea-d74e700a8e52.png)

表示されたダイアログに必要な情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/a916d663-3045-a4e9-f9b0-d5747c84b8cd.png)

直下にxamlが無い場合は下図が表示されますが気にしないくて良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/11846c02-3f1a-955d-762c-c13b3b6d9159.png)

取得したプロジェクトを開き、Main.xamlを開いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/4ce84a5a-44a6-9fa2-d137-ec3b770b98c5.png)

以下のダイアログが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/e0c15769-4e52-3904-4472-41ed2d9222bc.png)
**最新バージョンをチェックアウトして編集** ボタンを押下して編集しようとすると、以下のダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/36f62c59-358f-5b03-25cf-55388a5f3baa.png)
**ロックを解除** ボタンを押下し、ロックを解除すると編集できます。

:::note warn
**ロックを解除** については、以降に記載したコンフリクトの発生を考慮しながら選択する必要があります。できれば事前にロックしているユーザーを確認し、ロックを解除した状態にすることを依頼するべきです。
:::


## 補足： ロック状態とは…
 **ロック状態** とはユーザーによって明示的に編集を宣言している状態です。

ファイルの左端に南京錠のアイコンがあります。
このアイコンが **青色** 状態だと対象ファイルをロックしていることを示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/f1853577-cfe4-923c-e9e4-402a86a66b87.png)

南京錠のアイコンが **灰色** の状態でクリックすると以下のダイアログが表示されます。
直接ファイルの編集ができない状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/f33e0f11-1b13-a20f-5006-33c711af3181.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/733cb827-7835-79fd-5a5c-1208f103c14a.png)

この状態のファイルを右クリックすると、以下のメニューが表示されます。
**「編集用にチェックアウト」** が表示されているのが差分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/e9c3befc-2764-b374-1934-2b0d1de07649.png)

右クリックメニューにて、**編集用にチェックアウト** をすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/2bbc8c6c-df3c-8ca0-4aff-dd09c9bf4fc9.png)
南京錠のアイコンが青色に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/33f3a716-5149-54cb-e791-f7fd7d73ac62.png)
右クリックメニューにて、**編集を終了** をすると、元の灰色のアイコンに戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/3df4ba52-a3f6-50ee-5ffe-0e319fa50097.png)


:::note
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/4ebecc06-ee78-facc-ca64-d39719698d2d.png)
このチェックをオンにすると、常に編集用にロックした状態となります。
ファイルの南京錠アイコンは青色表示のままとなり、**編集用にチェックアウト** や **編集を終了** は表示されなくなります。
:::




## ★シナリオ３：　修正のコンフリクト（競合）が発生する。
:::note
複数のユーザーが同じプログラムソースを同時にコミットしようとする操作を **コンフリクト（競合）** と言います。
:::

コンフリクトが発生する条件下で、コミット操作をしようとすると以下のダイアログが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/f37d9078-764f-bd45-3269-3bd003015995.png)
以下のメッセージが表示され、このままではコンフリクトが解消できません。
**OKボタン** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/94993691-7aa6-3fda-5c74-258066d763e4.png)

#### コンフリクトの解消のために、自身の変更を元に戻します。

:::note warn
**元に戻す** 操作により、自身の修正が消えてしまします。
**元に戻す** 前に自身の修正を手元にてバックアップしておきましょう。
:::

右クリックメニューの **元に戻す** を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/df1315be-5ae3-3482-4919-40e18caad294.png)

**元に戻す** 対象のリソースを選択し、**元に戻す** ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/eda208e9-62e2-3b44-8372-ef2fb57aeac3.png)
変更を元に戻すことで、自身の修正を破棄します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/1dccd9e0-1d74-fc45-354c-481e59a6f715.png)
右クリックメニューの **最新バージョンを取得** を選択し、
先にコミットされた内容を取り込みます。 


その後、改めて自身の修正を反映 → コミット、という手順を実施しコンフリクトが解消しました。


## ★シナリオ３：　修正をサーバーへ登録する。

右クリックメニューの **チェックイン** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/036a97cd-7954-1b12-c1f7-4d6b63c3319d.png)
**コミットメッセージ** を入力し **チェックイン** ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/213de763-44da-fd51-133b-8599ef0de8af.png)


## ★シナリオ４：　履歴を確認する。

右クリックメニューの **変更を表示** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/d6b0f284-98ca-fd5d-9818-4d8e42682fa4.png)

チェックイン（コミット）の情報が確認できます。
いずれかの行をクリックすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/df6d4e03-ded4-6c3d-5a50-9cd2ecf7070d.png)

変更内容の差分が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/e7d99f39-df33-e092-ce3d-0dafb151814d.png)

#### 右クリックメニューの 「変更を表示」 でも変更内容の確認が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/585ac6a3-24a3-3ff3-2eb9-8f0daabddcae.png)
右クリックメニューの **変更を表示** を選択すると、即座に差分が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/23798aca-a181-7d44-2583-062b024cabd8.png)


# 補足：　SVNの仕組みについて、イメージで理解してみます。
これらの挙動や、運用時の注意点、Gitとの違いなどを理解するためにはSVN仕組みを大まかに知ることが必要です。

### Gitのイメージ
分散型と言われ、その名のとおりクライアント（利用者の端末）側にもリポジトリを持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/2e8bc1da-ee3a-a07b-75bd-ce7259032b39.png)

### SVNのイメージ 
集中型と言われ、その名のとおりリポジトリはサーバー側に１つという構造です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302589/6662d6ee-3077-d197-b305-194d5b666a47.png)

こういった基本的な仕組みの違いを背景にしつつ…

- Gitの方が多機能で柔軟性が高い。
- SVNは機能はシンプルですが、サーバーを皆で同期して利用するため注意が必要。 

…といった違いがあります。
SVNはサーバー上にリポジトリが１つしかないことにより、Gitよりもこまめにサーバーと同期をしないとコンフリクト（利用者同時の競合）を発生しやすくなります。
**ロック機能** もSVNが集中型であるため重要な役割を果たしています。

# まとめ

StudioのSVN機能を確認しました。
UiPath StudioのSVN機能をぜひご活用ください。