Wget を活用した JIRA の操作自動化

2011-07-21 (Thu)  •  By 伊藤  •  活用のヒント  •  JIRA

今回の記事は、JIRA 管理ドキュメント「Automating JIRA operations via wget 」の弊社翻訳版です。原文と差異がある場合は、原文の内容が優先されます。

JIRA は Web アプリケーションであるため、大抵の場合、課題の作成や課題へのコメント作成といった操作の引き金となる URL を生成することが可能です。しばしば、これは SOAP や XML-RPC の簡易な代替手段となります。

例えば、jira.atlassian.com 上の “TST” プロジェクトに課題 (課題タイプは “バグ”) を作成する場合は以下のようになります。

http://jira.atlassian.com/secure/CreateIssueDetails.jspa?pid=10420&issuetype=1&summary=My+Test+Issue&os_username=soaptester&os_password=soaptester

この URL は各種パラメーター (pidissuetypesummary) を含んでおり、これらは HTML フォームとして隠蔽もしくは送信されます。他のバリエーションとしてカスタム フィールドの設定がありますが、これはフォームの送信ではありません (例 : フィールドの事前作成など)。

http://jira.atlassian.com/secure/CreateIssueDetails.jspa?pid=10420&issuetype=1&customfield_10010=hooray

したがって、特定の操作に関して必要なパラメーターを見極めることが必要となります。

HTTP パラメーターの検出

HTTP パラメーターの検出は、Firefox 用 LiveHTTPHeaders プラグインを使用することで簡単に行えます。

このプラグインをインストールし、その後、あなたが関心のある操作の直前までナビゲートします (例 : 課題作成プロセスのステップ 2)。LiveHTTPHeaders ウィンドウを開き、JIRA フォームを送信し、操作を実行します。LiveHTTPHeaders ウィンドウ上で HTTP POST 操作を確認しきます。

POST /secure/CreateIssueDetails.jspa HTTP/1.1
Host: jira.atlassian.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://jira.atlassian.com/secure/CreateIssue.jspa
Cookie: jira.conglomerate.cookie=navigator.filter.subheading.workratio=0; jira.conglomerate.cookie=;JSESSIONID=aWtQgyV8UTO9JioJG-; s_cc=true; s_sq=%5B%5BB%5D%5D
Content-Type: multipart/form-data; boundary=---------------------------20848862422003718001775908787
Content-Length: 2665
-----------------------------20848862422003718001775908787
Content-Disposition: form-data; name="summary"

My test issue
-----------------------------20848862422003718001775908787
Content-Disposition: form-data; name="description"

Test description
.....
-----------------------------2084886242200378001775908787

Content-Disposition: form-data; name="customfield_10061:1"

10104
-----------------------------20848862422003718001775908787
Content-Disposition: form-data; name="customfield_10170"


-----------------------------20848862422003718001775908787
Content-Disposition: form-data; name="pid"

10420
-----------------------------20848862422003718001775908787
Content-Disposition: form-data; name="issuetype"

1
-----------------------------20848862422003718001775908787
Content-Disposition: form-data; name="Create"

Create
-----------------------------20848862422003718001775908787--

ここから POST ヘッダー URL を取得します。

/secure/CreateIssueDetails.jspa

その後、あなたが関心のある各フィールドに関するセクションを見つけ、それに関する名前と値の組を生成します。例えば、次のような感じです。

pid=10420
issuetype=1
summary=My test issue
description=Test description

ここで完全な URL を生成します。URL とパラメーターは ‘?’ で、パラメーター同士は ‘&’ で区切ります。

http://jira.atlassian.com/secure/CreateIssueDetails.jspa?pid=10420&issuetype=1&summary=My test issue&description=Test description

最後に認証に関して以下のいずれかを行います。

http://jira.atlassian.com/secure/CreateIssueDetails.jspa?pid=10420&issuetype=1&summary=My test issue&description=Test description&os_username=soaptester&os_password=soaptester

Wget や cURL などのコマンドライン ツールを使用することで、このような URL の送信を自動化することができます。

多段階操作のスクリプト化

JIRA の操作によっては、(ユーザーのセッションにおける) サーバー サイド ステートを組み合わせることや、複数ページ要求の受け渡しが必要となります。そのためには、複数の要求をまとめるために Cookie の保管や再利用を行う必要があります。

Wget の場合、以下の手順で行います。

justin@asahi ~
$ wget --save-cookies cookies.txt --post-data 'os_username=justin&os_password=XXXX&os_cookie=true' http://localhost:8090/jira/login.jsp

このコマンドは初期要求を実行し、JIRA インスタンスへのログイン、およびホーム ディレクトリ内へ cookies.txt と呼ばれるファイルの作成を行います。

以降の要求に関しては、cookies.txt ファイルを参照し、ユーザー詳細が追加されていない通常の URL を使用するだけです。

justin@asahi ~
$ wget --load-cookies cookies.txt -p http://localhost:8090/jira/browse/WEB-3

cURL の場合、まず、--cookie-jar を使用してログインに関する Cookkie を保存します。

$ curl  -u justin:XXXX --cookie-jar cookies.txt 'http://localhost:8080/secure/Dashboard.jspa?os_authType=basic' --head

次に --cookie cookies.txt を使用してそれ以降の要求を処理します。

添付ファイルのアップロード

JIRA 4.2 以降の場合

Atlassian REST API により、添付ファイルの追加を行えます。

$ curl -H "X-Atlassian-Token: no-check" -u justin:XXXX 'http://localhost:8080//rest/api/2.0-alpha1/issue//attachments' -X POST -F file=@/path/to/file

ベース URL、ユーザー名/パスワード、課題キー、およびファイルを代入します。複数のファイルのパラメーターを指定することで複数の添付ファイルをアップロードできます。それ以外にも、-F "file=@/path/to/file;filename=attachmentname" を使用することで添付ファイル名を明示的にセットすることができます。

JIRA 4.1 以前の場合

コマンドラインから添付ファイルをアップロードする一番簡単な方法は cURL を使用することです (Wget でも可能と思われますが)。ファイル test.txthttp://localhost:8080 上の JIRA にアップロードする場合、以下を実行します。

curl -H "X-Atlassian-Token: no-check" 'http://localhost:8080/secure/AttachFile.jspa?id=10000&os_username=test&os_password=test' -F filename.1=@small.txt

課題 ID (10000) を見つけるには、その JIRA 課題に対する操作 (コメント作成や割り当てなど) の際の URL を確認します。

カスタム フィールド オプションの一括追加

複数のカスタム フィールド オプションを追加する場合を考えます。

この操作のスクリプト化は簡単です。LiveHTTPHeaders を用いて送信を解析します。

POST /secure/admin/EditCustomFieldOptions!add.jspa HTTP/1.1
Host: localhost:8080
.....
Content-Type: application/x-www-form-urlencoded
Content-Length: 87
addValue=second&fieldConfigId=10031&selectedParentOptionId=&addSelectValue=true&Add=Add

この場合、URL 以下のとおりです。

/secure/admin/EditCustomFieldOptions!add.jspa?
addValue=second&fieldConfigId=10031&selectedParentOptionId=&addSelectValue=true&Add=Add

ホスト名を先頭に追加し、認証パラメーターを末尾に追加します。さらにその値を最後に追加します。

http://localhost:8080/secure/admin/EditCustomFieldOptions!add.jspa?fieldConfigId=10031&selectedParentOptionId=&addSelectValue=true&os_username=test&os_password=test&addValue=second

ここで、コマンドラインから 3 つ目の値を追加します。

$ wget --header="X-Atlassian-Token: no-check" -q 'http://localhost:8080/secure/admin/EditCustomFieldOptions!add.jspa?fieldConfigId=10031&selectedParentOptionId=&addSelectValue=true&os_username=test&os_password=test&addValue=third'

もしくは、ファイルやスクリプトでオプションを一括追加することも可能です。

$ for user in `cat /etc/passwd | cut -d: -f1`; do
    wget --header="X-Atlassian-Token: no-check" -q 'http://localhost:8080/secure/admin/EditCustomFieldOptions!add.jspa?fieldConfigId=10031&selectedParentOptionId=&addSelectValue=true&os_username=test&os_password=test&addValue='$user
done

XSRF 保護の回避

JIRA における多くの操作では XSRF 保護が施されており、XSRF を使用してそれらの操作を実行できないようになっています。XSRF 攻撃の制限のひとつとして、被害者がブラウザー経由で送信した HTTP ヘッダーを攻撃者が制御できないことが上げられます。JIRA はカスタム HTTP ヘッダーを持っており、これは XSRF トークン チェックの回避に使用可能です。このヘッダー名は X-Atlassian-Token で、その値は “no-check” でなければなりません。これを Wget で使用する場合は --header="X-Atlassian-Token: no-check" 、cURL で使用する場合は -H "X-Atlassian-Token: no-check" で代用します。

  Previous Next  

関連記事