Automation Anywhere A360 ロボットファイルをDiffツールで比較する

## A360のバージョン管理
Automation Anywhere A360では、ロボットファイルの差分を抽出する機能があります。でも、少し物足りなさを感じているのは私だけでしょうか。まずA360のバージョン管理の様子を示してから、課題についての話をしたいと思います。
非公開フォルダで新規にロボットAを作ってチェックインすると、ロボットAのバージョンがver.1になって公開フォルダに表示され、非公開フォルダからは消えます。
ロボットAに変更が必要になった場合には、公開フォルダのロボットAをチェックアウトして非公開フォルダで編集した後、チェックインすると、ロボットAのバージョンがver.2になって公開フォルダに表示され、非公開フォルダからは消えます。
この様子を図で表すと、以下のようになります。

:::note info
【フォルダ表示の簡略化について】
フォルダ内のロボットは、[ロボット名]、[チェックインバージョン番号]、[ロボットファイルステータス]などの属性項目が表示されます。このページでは、ロボット名 {チェックインバージョン番号/ロボットファイルステータス} の形式で表示しています。
:::

|No.|非公開ﾌｫﾙﾀﾞ→<br>での操作|非公開ﾌｫﾙﾀﾞの表示|公開ﾌｫﾙﾀﾞの表示|←公開ﾌｫﾙﾀﾞ<br>での操作|リポジトリ|
|:-:|:-:|:--------------------------:|:-------------------------:|:-:|:-:|
|1|ロボットA作成||||
|2||ロボットA<br>{該当なし/新規}||||
|3|チェックイン||||
|4||   |ロボットA<br>{ver.1/ﾊﾟﾌﾞﾘｯｸ}||ロボットA<br>{ver.1}|
|5||||チェックアウト|||
|6||ロボットA<br>{ver.1/ﾁｪｯｸｱｳﾄ済}|ロボットA<br>{ver.1/ﾁｪｯｸｱｳﾄ済}||ロボットA<br>{ver.1}|
|7|編集&保存|||||
|8||ロボットA<br>{ver.1/ﾁｪｯｸｱｳﾄ･編集済}|ロボットA<br>{ver.1/ﾁｪｯｸｱｳﾄ済}||ロボットA<br>{ver.1}|
|9|チェックイン||||
|10|||ロボットA<br>{ver.2/ﾊﾟﾌﾞﾘｯｸ}||ロボットA<br>{ver.2}<br>ロボットA<br>{ver.1}|

No.3でロボットAをチェックインすると、公開フォルダに表示されるとともに、バージョン管理が始まります。以降、チェックアウト＋チェックインの度にバージョンが更新していきます。すべてバージョンの履歴がリポジトリに残っており、No.10のタイミングではver.1とver.2のロボットAで差異の比較が可能です。

上記の状態から、ロボットAをコピーしてロボットBを作り、ロボットBをチェックインした場合は、次のような表示になります。

|No.|非公開ﾌｫﾙﾀﾞ→<br>での操作|非公開ﾌｫﾙﾀﾞの表示|公開ﾌｫﾙﾀﾞの表示|←公開ﾌｫﾙﾀﾞ<br>での操作|リポジトリ|
|:-:|:-:|:--------------------------:|:-------------------------:|:-:|:-:|
|10|||ロボットA<br>{ver.2/ﾊﾟﾌﾞﾘｯｸ}||ロボットA<br>{ver.2}<br>ロボットA<br>{ver.1}|
|11||||チェックアウト||
|12||ロボットA<br>{ver.2/ﾁｪｯｸｱｳﾄ済}|ロボットA<br>{ver.2/ﾁｪｯｸｱｳﾄ済}||ロボットA<br>{ver.2}<br>ロボットA<br>{ver.1}|
|13|ﾛﾎﾞｯﾄAをｺﾋﾟｰ<br>してﾛﾎﾞｯﾄB作成|||||
|14||ロボットA<br>{ver.2/ﾁｪｯｸｱｳﾄ済}<br>ロボットB<br>{該当なし/新規}|ロボットA<br>{ver.2/ﾁｪｯｸｱｳﾄ済}||ロボットA<br>{ver.2}<br>ロボットA<br>{ver.1}|
|15|ロボットAの<br>ﾁｪｯｸｱｳﾄｷｬﾝｾﾙ|||||
|16||ロボットB<br>{該当なし/新規}|ロボットA<br>{ver.2}||ロボットA<br>{ver.2}<br>ロボットA<br>{ver.1}|
|17|ロボットBの<br>チェックイン|||||
|18|||ロボットA<br>{ver.2}<br>ロボットB<br>{ver.1}||ロボットA<br>{ver.2}<br>ロボットA<br>{ver.1}<br>ロボットB<br>{ver.1}|

:::note info
【補足】
No.11でロボットAをチェックアウトしているのは、ロボットのコピーは非公開フォルダにあるロボットが対象なので、ロボットAを非公開フォルダに表示するためです。コピー操作が終わったらロボットAに用は無いので、No.15でチェックアウトキャンセルしています。
:::
## ロボットファイルの差分抽出機能の課題
私は、以下の点でロボットファイルの差分抽出機能について物足りないと思っています。
（１）同一ロボットのバージョン間比較しかできない
具体的には、No.10のタイミングでロボットAのver.1とver.2の比較が可能ですが、No.18のタイミングでロボットAのver.2とロボットBのver.1の比較はできません。
既存のロボットをコピーして別のロボットを作っているようなケースはよくあることなので、別ロボットの間でも比較はしたいところです。
（２）差異がある場合の表示はアクション名レベルであり、アクションの詳細設定についての差異は表示されません。
差異があるアクションの場所が分かったら、エディタで開いてアクションの詳細設定を表示することで差異の内容を確認することはできますが、エディタを開くのも面倒な時がありますよね。

## Diffツールを利用したロボットファイル比較方法の紹介
前述した物足りない部分を補う手段として、Diffツールを利用したロボットファイルの比較方法を紹介します。
A360のロボットファイルは、JSON形式のテキストファイルなので、テキストの比較ができるDiffツールであれば、比較して差分を抽出することが可能です。
ただし、Diffツールを使うまでにいくつか事前準備が必要です。

### （１）ロボットファイルのエクスポート
まず、Control Roomにあるロボットファイルをエクスポートして、Diffツールが読み込めるフォルダに保存する必要があります。エクスポートできるロボットファイルは、Control Roomの公開フォルダにあるロボットのみなので、エクスポートしたいロボットはチェックインして公開フォルダに移してからエクスポートします。

### （２）エクスポートファイルのダウンロード
Control Roomの履歴からエクスポートの実行結果を表示したら、エクスポートファイル(Zip圧縮ファイル)のリンクをクリックして、ローカルフォルダにzip圧縮ファイルをダウンロードします。ロボットファイルは、解凍してできる「Automation Anywhere\Bots」フォルダの中にあります。ロボットファイルは拡張子が無いファイルです。
「Bots」フォルダ下の階層はControl Roomと同じになっています。

### （３）ロボットファイルに改行コード追加
ロボットファイルは、改行コードの入っていないJSON形式のファイル（つまり１行しかないファイル）です。これではせっかくDiffツールで比較してもどこに変化があるのが探しづらくてしかたがありません。そこで、改行コードを追加して見易い形のJSONファイルにします。改行コードを追加して見易くする方法としては、１行で実現できるPowerShellが簡単だと思います。
エクスポートファイルから展開して取り出したロボットファイル「botA」を、「C:\work」フォルダに置いて変換する例です。
```PowerShell:addLF.ps1
#改行のないJSONファイルを改行ありファイルに変換する。
$tmp = get-content C:\work\botA -Encoding UTF8 | ConvertFrom-Json | ConvertTo-Json -Depth 100
#uidの行を「ステップ開始位置」で置換する。
$tmp = $tmp -replace "`"uid`":.*","---------------ステップ開始位置---------------"
$tmp | Out-File C:\work\botA.txt
```
:::note info
【コードの説明】
uidの行を「ステップ開始位置」で置換している理由
ロボットのフロー１つのステップは、必ず先頭の位置に変数 "uid" が設定してあるオブジェクトになっています。この "uid" がくせ者で、全く同じフローを作成しても、A360のユーザーが異なると "uid" が全く別の値になってしまうのです。
ロボットを作成したユーザーに関係なくフローの内容だけを比較したいため、"uid" を置換している訳です。
:::
:::note info
【ステップのJSON例】
現在の日時 System:Date をカスタムフォーマット「yyyyMMdd」形式で変数 ymd に代入するステップに対応するJSONのコードを下記に示します。
:::
ロボットのステップの詳細表示例
![ステップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128425/9f9cdfd9-bcf3-23bc-b470-76efa025bce2.png)
ロボットファイルを改行ありファイルに変換したときのJSON形式のコード例
（"uid" の値は本来は英数字が混在していますが、「x」で書き換えています。）
```JSON:文字列に変換.json
{
  "uid":  "xxxx-xxxx-xxxx-xxxx-xxxx",
  "commandName":  "toString",
  "packageName":  "Datetime",
  "disabled":  false,
  "attributes":  [
                     {
                         "name":  "source",
                         "value":  {
                                       "type":  "VARIABLE",
                                       "packageName":  "System",
                                       "variableName":  "Date"
                                   }
                     },
                     {
                         "name":  "selectPattern",
                         "value":  {
                                       "type":  "STRING",
                                       "string":  "CUSTOM"
                                   }
                     },
                     {
                         "name":  "patternInput",
                         "value":  {
                                       "type":  "STRING",
                                       "string":  "yyyyMMdd"
                                   }
                     }
                 ],
  "returnTo":  {
                   "type":  "VARIABLE",
                   "variableName":  "ymd"
               }
}
```
改行コードを追加したJSONファイルが完成したら、Diffツールで比較が可能です。

## 補足
ここではAutomation Anywhere A360 ロボットファイルをDiffツールで比較するための方法について紹介しました。如何だったでしょうか、簡単な手順で比較ができるようになることがお分かりいただけたと思います。
同様に、BizRobo! のロボットファイルをDiffツールで比較することも可能です。Diffツールを実行する前の事前準備は上記と異なりますが、事前準備の手順を紹介しているページがあるので、ご参考までにURLを載せておきます。
参考URL：[BizRobo! ロボットファイルの差分を抽出する](https://masuo.doorblog.jp/archives/51853625.html)