ズンドコキヨシ with ServiceNow - ServiceNowアプリの作り方

夏休みなので、久しぶりにズンドコする。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ネタは、今仕事で担当している[ServiceNow](https://www.servicenow.co.jp/)。

# ServieNowとは
ServiceNowはITサービス管理のSaaS。
世界的にはITサービス管理のデファクトスタンダードとなっているが、日本ではこれから盛り上がりそうといった感じ。

アプリケーションを開発するプラットフォームとしての側面もあり、JavaScript(ブラウザ側とサーバ側両方)でServiceNowの機能を拡張し、他システムと連携させたり処理を自動化したりできる。

# ServieNowでのズンドコ
ServieNowは非常に多機能なので、ズンドコするにも色々やりかたがある。

ワークフローをくるくる回してズンドコしたり、RESTメッセージをズンドコ送ったり、ズンドコイベントを発生させたり、フォームのジャーナルフィールドでズンドコしたり、UI Page作ってフロントエンドズンドコしたり。

今回は実装が一番簡単そうだった、UI Actionと`g_form.addInfoMessage()`でズンドコすることにする。

# ServiceNowインスタンス取得
ServiceNowインスタンスは普通に買うと年間数百万円くらいするが、調査目的とかであれば無料でディベロッパインスタンスを取得できる。
その手順は、

1. ServiceNowアカウント作成
    [ServiceNowのディベロッパサイト](https://developer.servicenow.com/app.do#!/home)に行って、右上のREGISTERからアカウントを作成する。
    無料。

    ![sn_dev_site.png](https://qiita-image-store.s3.amazonaws.com/0/110166/2adb034b-15e0-120c-9862-ad39353d2ebf.png)

2. インスタンス取得申請
    ServiceNowのディベロッパサイトに行って、作ったアカウントでログインして、
    トップページの`Request Instance`ボタンを押す。
    無料。
   ![request_instance.png](https://qiita-image-store.s3.amazonaws.com/0/110166/c2cadab5-b59b-63af-d8c2-8866769c0624.png)

3. インスタンスバージョン選択
    インスタンスバージョンを選択する。
    特別な意図がないなら最新版で。今ならJakarta。
    ![jakarta.png](https://qiita-image-store.s3.amazonaws.com/0/110166/bd7d674f-df50-1788-6bc5-537b46c42748.png)

これだけで即使えるようになる。
ログイン情報は、ユーザIDが`admin`で、パスワードとインスタンスのURLは、インスタンス申請完了時にディベロッパサイトのトップページに表示される。

パスワードを忘れてログインできなくなったら、`Manage Instance`ボタンで開く画面の先でパスワードリセットできる。

![my_instance.png](https://qiita-image-store.s3.amazonaws.com/0/110166/13f658c5-d3c3-fc8a-2b30-d5254ca33728.png)

# アプリ作成
ServiceNowインスタンスにログインすると以下のような画面が出る。
![servicenow.png](https://qiita-image-store.s3.amazonaws.com/0/110166/119d548a-978e-043a-dbcf-9508ff6a09f7.png)

左上の`Filter navigator`のところに「studio」と入力して出てくるメニューをクリックすると、ServiceNowアプリケーションのIDEであるStudioが開く。

![studio.png](https://qiita-image-store.s3.amazonaws.com/0/110166/ee6a4be2-9154-9892-51fa-85c5091b46e8.png)

ここで「Zundoko Kiyoshi」というアプリケーションを作成し、ZundokoGeneratorというScript Includeと、Zundoko KiyoshiというUI Actionを作成。

## ZundokoGenerator (Script Include)
![zundoko-generator.png](https://qiita-image-store.s3.amazonaws.com/0/110166/c3287e15-f411-a281-3d9f-b37efa8d5f73.png)

Script Includeはサーバサイドで動く、再利用可能なモジュール。
ServiceNowでは今のところ、サーバサイドJavaScriptはRhino 1.7 R5ベースのエンジンで実行される。
ECMAScript5準拠。
クラスは(多分)Prototype.jsのやつ。

ZundokoGeneratorの作成フォームでは、`Client callable`にチェックして、`Script`には以下を記入。

```javascript
var ZundokoGenerator = Class.create();
ZundokoGenerator.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
	
	generate: function() {
		var random = GlideSecureRandomUtil.getSecureRandomIntBound(100);
		return random >= 50 ? 'ズン' : 'ドコ';
	},
	
	type: 'ZundokoGenerator'
});
```

`ZundokoGenerator.generate()`で、「ズン」か「ドコ」をランダムに取得できる。

## Zundoko Kiyoshi (UI Action)
![zundoko-kiyoshi.png](https://qiita-image-store.s3.amazonaws.com/0/110166/092099cb-4ef9-7a1a-d169-17fbb17e7692.png)

UI Actionは、リストビューやフォームにボタンやリンクを追加して、それを押したときに実行されるサーバサイドかクライアントサイドの処理を定義できる。

Zundoko Kiyoshiの作成フォームでは、`Table`に「Incident」を入れて、`Show update`と`Client`と`Form button`にチェックして、`Onclick`に「startZundoko()」を入れて、`Script`には以下を記入。

```javascript
function startZundoko() {
	var zundokoGenerator = new GlideAjax('ZundokoGenerator');
	zundokoGenerator.addParam('sysparm_name', 'generate');
	zundokoGenerator.getXML(showZundoko);
}

var zunCount = 0;
function showZundoko(response) {
	var answer = response.responseXML.documentElement.getAttribute('answer');
	g_form.addInfoMessage(answer);
	
	if (answer == 'ズン') {
		zunCount++;
	} else {
		var isTimeToKiyoshi = zunCount === 4;
		zunCount = 0;
		if (isTimeToKiyoshi) {
			g_form.addInfoMessage('キ・ヨ・シ！');
		}
	}
}
```

`Client`にチェックしたので、このコードはクライアントサイドで動く。
`GlideAjax`を使って、さっき作った`ZundokoGenerator.generate()`をサーバサイドで実行して、レスポンスを`showZundoko()`で処理する。

`showZundoko()`では、`ZundokoGenerator.generate()`の戻り値を`g_form.addInfoMessage()`によってフォーム上部に表示し、「ズン」が4回来た後に「ドコ」が来たら「キ・ヨ・シ！」を表示する。

# アプリ動作確認
アプリは、Studioで作成したら即使えるようになる。

UI ActionのZundoko Kiyoshiの`Table`に「Incident」と入れたので、Incidentフォームに`Zundoko Kiyoshi`ボタンが追加されたはずだ。
`Filter navigator`に「incident.list」と入力してEnter押して出てくるIncidentリストビューで、適当なレコードをクリックするとそのフォームが開く。

![zundoko-kiyoshi-button.png](https://qiita-image-store.s3.amazonaws.com/0/110166/2f81550c-6312-6efd-6d6d-7b02408fe430.png)

右上に件のボタンが。
これを一回押すと「ズン」か「ドコ」が一つ表示される。

![doko.png](https://qiita-image-store.s3.amazonaws.com/0/110166/c5b38428-206f-4c22-15ff-1baef0ca7eb0.png)

何回も押していくと…

![zundoko.png](https://qiita-image-store.s3.amazonaws.com/0/110166/f9d38142-7b76-a5cd-a727-2446b63d9513.png)

勝った。

# GitHub連携
作成したアプリはGitHubのリポジトリとリンクさせて、Studioから直接pushしたりできる。
まずGitHubに空のリポジトリを作成して、Studioのメニューバーの、`Source Control`の`Link To Source Control`から、そのリポジトリのURLとGitHubのクレデンシャルを入力するとリンクできる。

今回作ったZundoko Kiyoshiアプリとリンクしたリポジトリは[これ](https://github.com/kaitoy/servicenow-zundoko-kiyoshi)。

Studioからタグも作れるので、[0.0.1というタグ](https://github.com/kaitoy/servicenow-zundoko-kiyoshi/releases/tag/0.0.1)を作って、そこにアプリのUpdate Setを載せておいた。
これをインポートすれば、どのServiceNowインスタンスでもズンドコできる。