【UiPath】CI/CD環境の構築その１（Jenkins編）

# 1. はじめに
* アジャイルの普及とともに、システム開発の現場でCI/CDを導入しているプロジェクトが多くなってきています。
* UiPathの開発では、GitHub等のバージョン管理システムを利用しているプロジェクトは見られるようになりましたが、まだCI/CDは普及していないように感じます。
* 本記事では、UiPathが提供しているUiPath Jenkinsプラグインを利用して、CI/CD環境を構築する手順を示します。

# 2. CI/CDとは
* CI/CDとは「Continuous Integration / Continuous Delivery（継続的インティグレーション / 継続的デリバリー）」の略で、ソフトウェアの変更に必要なテストを自動化し、常にリリースできる状態にしておく開発の手法をいいます。

* UiPathでは、UiPath Studioで開発したプロジェクトをバージョン管理システムにプッシュするとCI/CDツールが検知して、自動的にビルドを行い、Orchestratorにパブリッシュ、デプロイ、テストの実行などの一連の流れを構築することが出来ます。
![Jenkins_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/cf17a7f2-e870-54e3-822b-4532961c9cab.png)

# 3. 前提
* GitHubなどのバージョン管理システムにリポジトリを作成済でUiPath Studioからコード連携がされている
* Windows環境にJenkinsをインストール済（検証バージョン2.387.1）
* Jenkinsに[Gitプラグイン](https://plugins.jenkins.io/git/)がインストールされている（インストール時に「推奨プラグインをインストールする」を選択していればインストールされているはずです）
:::note info
* 本記事ではGitHubを利用しています。GitLabやBitbucketなど他のバージョン管理システムをご利用の場合は、ご利用のシステムに合わせてJenkinsと連携をしてください。
* Jenkinsの画面が英語で表示されている場合は、ブラウザの言語設定を日本語に変更するか、[Localeプラグイン](https://plugins.jenkins.io/locale/)を導入することで日本語表示に切り替えることが出来ます。
:::

# 4. CI/CD環境の構築
## 4-1. UiPath Jenkins Pluginのインストール

https://plugins.jenkins.io/uipath-automation-package/

Jenkinsの左メニューから「Jenkinsの管理」-> 「プラグインの管理」を選択します。
![Jenkins_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/0c9883fd-38aa-bc5f-92ed-da27ccd7e883.png)
「Available plugins」を選択して、「UiPath」と検索ボックスに入力すると候補にUiPathプラグインが表示されます。
「Install」にチェックを入れ、「Install without restart」をクリックします。
![Jenkins_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/3d56cd1b-11cd-2339-885b-7e9616c24411.png)
UiPathプラグインのインストールが始まります。
「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックを入れると自動的にJenkinsの再起動がされます。
![Jenkins_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/b1e68960-4c23-e5c2-4957-ec4b0294fbf0.png)
再起動が終わるとログイン画面が表示されるので、再度ログインします。
以上でJenkinsプラグインのインストールは完了です。

## 4-2. JenkinsとGitHubの連携
:::note warn
Jenkinsサーバーに[Git](https://git-scm.com/)がインストールされている必要があります。Gitのインストール後にJenkinsを再起動することでJenkinsがGitを認識できるようになります。

Jenkinsの再起動方法：http://(Jenkinsサーバー)/safeRestart
例：http://localhost:8080/safeRestart
:::

今回はSSHで接続します。
JenkinsとGitHubを連携させるためには、Jenkinsサーバー上で作成した公開鍵をGitHubに登録する必要があります。以下に手順を示します。

### SSH秘密鍵と公開鍵の作成
Jenkinsサーバ上で以下のコマンドを入力します。
```
ssh-keygen -t ed25519
```
コマンドを実行して何回かエンターキーを押していくと、`%USERPROFILE%\.ssh`に次のファイルが作成されます。今回はパスフレーズは省略していますが、必要に応じて設定してください。
![Jenkins_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/c22d5e04-0435-315a-eb60-b0a5e7d9450d.png)

### GitHubに公開鍵を登録
GitHubにログイン後、左上のアイコンをクリックしたら表示されるメニューの「Settings」を選択します。
![Jenkins_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/a556850a-550e-980e-4750-c235ecf6894d.png)

「SSH and GPG keys」を選択します。
![Jenkins_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/8ea43e90-5f98-c5e4-eadc-b2d5b22f077c.png)

「New SSH key」を選択して登録画面を表示させます。
「Title」に任意の名前を入力して、「Key」に次のコマンドでクリップボードにコピーした内容を貼り付けます。このコマンドはJenkinsサーバ上で実行します。
入力が完了したら、「Add SSH key」をクリックして登録します。
```
C:\>clip < %USERPROFILE%\.ssh\id_ed25519.pub
```
![Jenkins_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/1d0def01-fda7-7059-53b6-a6dc63f4e08e.png)

これでGitHubへの公開鍵の登録は完了です。
![Jenkins_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/a95a5213-26d1-02a7-85bc-feac3acf5f2f.png)

### JenkinsからGitHubへの接続確認（known_hostsファイルの作成）
Jinkinsサーバー上で次のコマンドを実行してGitHubへの接続を確認します。
```
ssh -T git@github.com
```
`You've successfully authenticated`と表示されれば接続は出来ています。`GitHub does not provide shell access.`と表示されますが気にしなくて大丈夫です。
コマンドを実行すると`%USERPROFILE%\.ssh`に`known_hosts`ファイルが作成されます。
![Jenkins_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/97b8f7b3-7425-c191-e2a9-e6ef9b7bf3e6.png)

:::note warn
**重要（ハマりポイント）**
SYSTEMユーザーでJenkinsサービスを起動している場合は、上記の方法ではJenkinsが秘密鍵とknown_hostsファイルを認識することが出来ません。以下の方法で秘密鍵とknown_hostsの内容を登録します。
* 秘密鍵
    * 「Jenkinsの管理」->「Manage Credentials」にある「Add Credentials」をクリックして秘密鍵を登録します。
* known_hosts
    * 「Jenkinsの管理」->「グローバルセキュリティの設定」にある「Git Host Key Verification Configuration」を「Manually provided keys」に変更して、上で作成したknown_hostsファイルの内容をJenkinsに登録します。
:::

以上でJenkinsとGitHubが連携できるようになりました。

## 4-3. JenkinsからOrchestratorに接続できるようにするための事前設定
JenkinsがOrchestatorに接続できるようにするには、Orchestratorに外部アプリケーション登録する必要があります。
### Orchestrator外部アプリケーションの登録
Automation Cloudの左メニューにある「管理」->「外部アプリケーション」を選択します。

:::note info
オンプレOrchestatorの場合は、テナントメニューの「アクセス権を管理」->「アカウントおよびグループを管理」から外部アプリケーション画面に遷移することができます。
:::

![Jenkins_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/4a6b4360-1c72-f9eb-70e1-f9ae4aabf841.png)

「アプリケーションを追加」をクリックします。
![Jenkins_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/e3bc1e4e-f983-dab1-4b18-34301701365e.png)

以下の内容を入力します。入力したら、「追加」ボタンをクリックして登録します。
<table>
  <caption>基本情報</caption>
  <thead>
    <tr>
      <th>項目</th>
      <th>値</th>
    </tr>
  </thead>
  <tr>
    <td>アプリケーション名</td>
    <td>任意の名前</td>
  </tr>
  <tr>
    <td>アプリケーションの種類</td>
    <td>機密アプリケーション</td>
  </tr>
  <tr>
    <td>リダイレクトURL</td>
    <td>入力なし</td>
  </tr>
</table>

<table>
  <caption>スコープ情報</caption>
  <thead>
    <tr>
      <th>項目</th>
      <th>値</th>
    </tr>
  </thead>
  <tr>
    <td>リソース</td>
    <td>Orchestrator API Access</td>
  </tr>
  <tr>
    <td>ユーザースコープ /<br />アプリケーションスコープ</td>
    <td>アプリケーションスコープ</td>
  </tr>
  <tr>
    <td>スコープ</td>
    <td>
      OR.Assets<br />
      OR.BackgroundTasks<br />
      OR.Execution<br />
      OR.Folders<br />
      OR.Jobs<br />
      OR.Machines.Read<br />
      OR.Monitoring<br />
      OR.Robots.Read<br />
      OR.Settings.Read<br />
      OR.TestSetExecutions<br />
      OR.TestSets<br />
      OR.TestSetSchedules<br />
      OR.Users.Read
    </td>
  </tr>
</table>

![Jenkins_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/7c59815f-5c36-c1bf-e4fa-51042dbe5e3f.png)

登録されるとアプリIDとアプリシークレットが表示されます。
アプリシークレットはこのダイアログを閉じると確認することが出来なくなるので**必ずコピーしてテキストファイル等に控えておいてください**。
![Jenkins_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/270da034-187a-8ca7-f309-918369dd33b6.png)

### Jenkinsにアプリシークレットを登録
続いてOrchestratorの外部アプリケーションの登録で取得したアプリシークレットをJenkinsに登録します。
Jenkinsの左メニューの「Jenkinsの管理」から「Manage Credentials」を選択します。
![Jenkins_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/56efb3bd-abf8-6dc7-77d8-761310fcb3c9.png)
「Stores scoped to Jenkins」の「(global)」にマウスを合わせるとドロップダウンリストが表示されるので、その中にある「Add credentials」を選択します。
![Jenkins_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/6e4caf37-33d2-5b3e-8b9c-ad6ab171fee8.png)

以下の内容を入力します。入力したら、「Create」ボタンをクリックして登録します。
<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>値</th>
    </tr>
  </thead>
  <tr>
    <td>種類</td>
    <td>Secret text</td>
  </tr>
  <tr>
    <td>スコープ</td>
    <td>グローバル</td>
  </tr>
  <tr>
    <td>Secret</td>
    <td>Orchestratorの外部アプリケーション登録で取得したアプリシークレット</td>
  </tr>
  <tr>
    <td>ID</td>
    <td>入力しなくてもOK</td>
  </tr>
  <tr>
    <td>説明</td>
    <td>分かり易い説明を入力</td>
  </tr>
</table>

![Jenkins_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/ae4b04fd-5dbb-b61b-bad1-ea55bc6d7558.png)
登録されました。
![Jenkins_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/02915219-5350-cec6-9998-296a5714d837.png)

以上で、JenkinsからOrchestratorに接続するための事前設定は完了です！

## 4-4. ジョブを登録してみる
ここからは、実際にJenkinsジョブを作成してOrchestratorにプロセスがパブリッシュ/デプロイされるところまで環境を構築します。

Jenkins左メニューから「新規ジョブ作成」を選択します。
今回は、「フリースタイル・プロジェクト」でジョブを作成します。ジョブ名に任意の名前を入力して、「フリースタイル・プロジェクトのビルド」を選択後、「OK」をクリックします。

:::note warn
ジョブ名、後ほど登場するデプロイ先のフォルダ名に日本語が含まれているとジョブ実行に失敗するようです。日本語を含まない名称を指定してください。
:::

![Jenkins_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/a45947e8-c0ac-3978-059c-4014aff1ecef.png)
「ソースコード管理」に「Git」を選択後、「リポジトリURL」にビルドしたいGitHubリポジトリのURLを入力します。URLは以下のフォーマットで記述します。
「ブランチ指定子」にビルド対象のブランチを指定してください。
```
git:github.com:[GitHubアカウント]/[リポジトリ名].git
```
![Jenkins_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/bc896da8-91b7-3af0-e745-42d855344123.png)
続いて「ビルド環境」の「ビルド開始前にワークスペースを削除する」にチェックを入れます。前回ビルドしたファイルが削除されきれいな状態でジョブを実行することが出来ます。
![Jenkins_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/e6dba687-c00d-dc5e-4416-ca1a8fc74a3d.png)
画面を下にスクロールしていくと、「Build Steps」あります。
「ビルド手順の追加」をクリックして、「UiPathのNugetパッケージをパブリッシュ」を選択します。
![Jenkins_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/5d6f4413-ee30-a074-fbac-76be163fa845.png)
タスク名にパブリッシュと書かれていますが、実際には指定したプロジェクトをビルドしてJenkinsにビルドしたNugetパッケージを作成するタスクになります。
今回は次の内容で入力します。
<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>値</th>
    </tr>
  </thead>
  <tr>
    <td>バージョン管理メソッドを選択</td>
    <td>パッケージのバージョンを自動生成</td>
  </tr>
  <tr>
    <td>プロジェクトのパス</td>
    <td>${WORKSPACE}</td>
  </tr>
  <tr>
    <td>出力フォルダー</td>
    <td>${WORKSPACE}\Output</td>
  </tr>
  <tr>
    <td>出力の種類</td>
    <td>Pack a process project</td>
  </tr>
</table>

![Jenkins_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/a5aaf61b-4951-7fe4-ccf1-dc6f66d27a86.png)

続いて「ビルド後の処理」にタスクを追加します。
「ビルド後の処理の追加」をクリックして、「UiPathのNugetパッケージをデプロイ」を選択します。
![Jenkins_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/fc1770c9-fc05-0d27-005e-f2df2837147b.png)
「UiPathのNugetパッケージをデプロイ」では「UiPathのNugetパッケージをパブリッシュ」タスクで作成したNugetパッケージをOrchestratorにパブリッシュ／デプロイします。
今回は次の内容で入力します。
<table>
  <caption>基本項目</caption>
  <thead>
    <tr>
      <th>項目</th>
      <th>値</th>
    </tr>
  </thead>
  <tr>
    <td>パッケージのパス</td>
    <td>${WORKSPACE}\Output</td>
  </tr>
  <tr>
    <td>Orchestratorのアドレス</td>
    <td>https://cloud.uipath.com/</td>
  </tr>
  <tr>
    <td>Orchestratorテナント</td>
    <td>DefaultTenant</td>
  </tr>
  <tr>
    <td>Orchestratorのフォルダー</td>
    <td>Shared</td>
  </tr>
  <tr>
    <td>ロボットグループ</td>
    <td>入力なし</td>
  </tr>
  <tr>
    <td>Automatically create/update process</td>
    <td>チェック</td>
  </tr>
  <tr>
    <td>認証</td>
    <td>外部アプリケーションを使用してCloud Orchestratorに認証</td>
  </tr>
  <tr>
    <td>Identity Url</td>
    <td>入力なし</td>
  </tr>
  <tr>
    <td>Account Name</td>
    <td>
      <code>https://cloud.uipath.com/[アカウント名]/[テナント名]</code><br />
      上記URLの[アカウント名]を入力
    </td>
  </tr>
  <tr>
    <td>Application Id</td>
    <td>Orchestrator外部アプリケーションの登録で取得したアプリID</td>
  </tr>
  <tr>
    <td>Application Secret</td>
    <td>Jenkinsに登録したCredentialの説明が表示されているはずなのでそのままでOK</td>
  </tr>
  <tr>
    <td>Application Scope(s)</td>
    <td>Orchestrator外部アプリケーションの登録で設定したスコープの一覧</td>
  </tr>
</table>

「シークレット文字列を指定してください。」と表示されていますが、気にせず「保存」をクリックします。
![Jenkins_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/7113e6b8-d555-11c8-3d28-6cb54a48cd00.png)
以上でジョブの作成は完了です。

# 5. ジョブを実行してみよう
ジョブを作成したので、いよいよジョブを実行してみましょう。
ジョブを実行するには、作成したジョブの「ビルド実行」をクリックします。ジョブが実行されるとビルドが始まり画面左下に進捗状況が表示されるので完了するまで待ちましょう。
![Jenkins_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/e19e9bab-12a2-389b-cc19-d0d6fa65e72f.png)
緑〇が表示されればジョブが正常終了したことを表しています。
![Jenkins_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/a8520799-c823-0391-bfeb-0e0df954e20c.png)
Orchestratorを見るとSharedフォルダにパッケージが無事デプロイされていました。
![Jenkins_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/6d41840f-be1c-b785-feec-6264fb8013ed.png)

# 6. おわりに
* 無事、JenkinsとGitHubを利用したCI/CD環境の構築が出来ました。
* ただ、このままではジョブの実行をJenkins上で手動で行わなければなりません。StudioからファイルをGitHubにプッシュしたことをトリガーとしてJenkinsのジョブを実行するにはWebhookを設定する必要があります。
* また、今回はフリースタイル・プロジェクトを利用しましたが、パイプラインを利用するとより柔軟なジョブの構築が可能になります。
* 次回はWebhookを導入して一連の流れを自動的に実行できるようにします。

https://qiita.com/MasahiroHarada1105/items/bf8d4c0b75b3a38e4e39

https://qiita.com/MasahiroHarada1105/items/0d3eb734794f6c4651d7