LoginSignup
4
1

クロスプラットフォームのプロジェクトでLinux環境のロボットからマシン上のコマンドを実行する

Last updated at Posted at 2023-07-25

注記: 本稿は registry.uipath.com/robot/uiautomation-runtime:23.4.61.49114-robot23.4.2 のDockerコンテナ、2023/07/22時点リリース済みのUiPath、及びアクティビティを使用して検証を行ったもので、将来のバージョンでも同様の動作となることを保証するものではありません。

はじめに

UiPathは2年ほど前からLinux環境(docker)でのロボットの実行をサポートしています。

ロボットがLinux上で動作するため、制約としてクロスプラットフォームのプロジェクトのみの対応となり、使用できるアクティビティが限定されます。

アクティビティの各プロジェクトへの対応状況はガイドに記載されています。
例えばUiPath.UIAutomation.Activitiesのモダンアクティビティについては2023/07/22時点で次のようになっています。
アクティビティパッケージによっては、各アクティビティについて対応・非対応が混在していることにご注意ください。

image.png

UIAutomation以外のものとしては例えばIntegration Serviceのアクティビティはクロスプラットフォームのプロジェクトに対応しています。その他では『HTTP 要求』のようなアクティビティも使えるため、制限はあるもののニーズを満たせる場面は少なくないのではないかと思います。

この記事では更にもうワンステップできることを広げる方法として、Linux環境のロボットからマシン上のコマンドを実行する方法をご紹介します。

ワークフロー実装

例として hostname コマンドを実行してその結果をログに書き込むワークフローを用意しました。
方法は凄くシンプルで、System.DiagnosticsのProcessクラスを使って対象のコマンドを実行するだけです。

参考:
「System.Diagnostics > Process クラス」
https://learn.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process

全体

全部でアクティビティが5個で、重要なのは『コードを呼び出し』のみです。シンプルですね。

image.png

解説

まずcommand変数に hostname を割り当てます。
hostname は端末のマシン名を出力するだけのコマンドです。
他のコマンドを試してみるときに、もしパスが通っておらずコマンドが見つからない等のエラーが出るときはそのコマンドへのフルパスを指定しましょう。

次にarguments変数ですが、今回は引数は使用しないため空のListを作成して割り当てています。
コマンドに引数を与えたい場合はここで指定を行います。
その際は例えば次のように初期化子({} で囲まれた部分)を追加してインスタンスを作成しましょう。

New List(Of String) {"引数1", "引数2"}

『コードを呼び出し』アクティビティのコードは次の内容です。

ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = command;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
foreach (var arg in arguments) {
    processInfo.ArgumentList.Add(arg);
}
Process process = Process.Start(processInfo);
stdout = process.StandardOutput.ReadToEnd();
process.WaitForExit();
result = process.ExitCode;

パラメーターは次の内容です。

commandで実行対象のコマンド、argumentsとしてコマンドに与える引数を指定します。
resultとしてプロセスの終了コード、stdoutとしてプロセスからの標準出力を取得します。

image.png

今回は実装していませんが、必要があればstderr等についても実装を追加しましょう。

Orchestratorの設定

マシンテンプレートを作成します

Linux環境のロボットであっても特別な設定は必要ありません。
マシンテンプレートを作成し、Unattended ランタイムを1つ割り当てます。
作成後にクライアントIDとシークレットをメモしておきます。

image.png

フォルダへのマシンテンプレートの割り当て

前の手順で作成したマシンテンプレートをフォルダに割り当てます。

image.png

フォルダへのユーザーの割り当て

Unattendedロボットが実行できるユーザーをフォルダへ割り当てる必要があります。
Automation Userの権限を付与します。

image.png

ユーザーの割り当てを忘れると次のエラーが発生し、ジョブの作成ができません。
image.png

Dockerの設定

次のコマンドでLinuxコンテナを起動します。
クライアントIDとシークレットは以前の手順でメモしておいたものです。

docker run -e LICENSE_AGREEMENT=accept -e ORCHESTRATOR_URL="オーケストレーターのURL" -e CLIENT_ID="クライアントID" -e CLIENT_SECRET="シークレット" -p 50000:5900 --env VNC_ENABLED=true registry.uipath.com/robot/uiautomation-runtime:23.4.61.49114-robot23.4.2

注: latestタグが存在しないのか、2023/07/22時点では明示的にtag(23.4.61.49114-robot23.4.2)を指定しないとうまくいきませんでした。

起動したLinuxコンテナがOrchestratorへHTTPSで通信ができることが必須です。
またプロジェクトの依存パッケージをダウンロードするため、パッケージフィードへの通信も必要になります。

参考:
「Robot > Linux Robots - Standalone 2023.4」
https://docs.uipath.com/ja/robot/standalone/2023.4/user-guide/linux-robots

ジョブの実行

パブリッシュしたプロセスを指定してジョブを作成し、実行します。
必要があればAccountやMachineを明示的に指定してください。

image.png

実行されたジョブのログは次のようになり、期待した通りLinuxコンテナのホスト名が出力されました。

image.png

おわりに

クロスプラットフォームのプロジェクトではアクティビティの対応状況により、できることにやや制限がありますが、一方でWindowsとは異なるOS上でロボットを実行できるという利点もあります。
Linuxがサポートする多彩なコマンドが使用できることが強みになる場面も当然ながら存在するはずです。
そのようなシーンを開拓する際にこの記事が参考になりましたら幸いです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1