SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

PowerShellでJiraにログインしてみる(REST API)

すごく久々の、PowerShell記事です!
半年ぶりぐらい…

hiroronn.hatenablog.jp

Jiraについて

ソフトウェア開発の管理ソフトで、Jiraというのがあります。*1

ja.atlassian.com

普段はブラウザでポチポチ操作するのですが、APIが公開されているとのことなので、遊んでみました。

なお、実際に業務で使っているソフトなので、ソース等記載しますが、URL等は適当です。
また、サーバー導入型で使っているので、クラウドやデータセンター利用の場合は、内容が違うかもしれません。

APIのページ

見てみたら、サーバーやクラウド等で分かれているようです。

サーバー導入型の場合(最新)

JIRA 7.5.0

クラウドの場合

JIRA Cloud REST API Reference

ログイン

https://docs.atlassian.com/jira/REST/server/#auth/1/session-login

# JiraサーバーへのURL
$hostUrl = "http://example.com/jira"

# REST API記載のURL
$login = "rest/auth/1/session"

$hosturi = New-Object System.Uri ($hostUrl)
$url = New-Object System.Uri ($hosturi, $login)

# 自身のログイン情報に置き換える
$inputs = @{
    username = "userName";
    password = "pass";
}

$json = $inputs | ConvertTo-Json;
$headers = @{ Accept = "application/json"; }

$res = Invoke-RestMethod -uri $url.AbsoluteUri `
    -Method Post `
    -Body $json `
    -ContentType "application/json" `
    -Headers $headers `
    -SessionVariable loginSession # loginSessionに、セッション情報が格納される

ちょっとした解説をします。

  • わざわざSystem.Uriを使う理由
    URLの結合は、個人的には面倒に感じます。
    なので、.NETに任せてしまっています。

  • 戻り値$res
    セッションID等が返ってきますが、特に使いません。
    後述のセッション内に値があるので、それをそのまま使います。
    Invoke-RestMethodで戻り値を取得しているので、この中はJSON形式の値が入ってきます。
    リファレンスに、何が返ってくるか書いてあるので、詳細はそちらを参照ください。

  • -SessionVariableについて
    この後、別のREST APIを呼び出す際に必要です。

情報取得

ログインした際のセッションを使って、別のAPIを呼び出します。

今回は例なので、Current Userを呼び出します。
APIを呼び出した人(ログイン者)の情報を返します。

https://docs.atlassian.com/jira/REST/server/#auth/1/session-currentUser

$res2 = Invoke-RestMethod -uri $url.AbsoluteUri `
    -Method Get `
    -ContentType "application/json" `
    -Headers $headers `
    -WebSession $loginSession

さっきとほとんど一緒じゃねえか!と思うかもしれませんが、実際、URL一緒だし、MethodGetになったぐらいです。

また、ちょっと解説します。

  • -WebSessionについて
    ここで、ログインで取得したセッション($loginSession)を渡します。
    こうすることで、自動的に認証されます。

  • 戻り値$res2について
    ログイン失敗回数等が入ってきます。楽しい。

下記は、戻り値中loginInfoの値です。

failedLoginCount loginCount lastFailedLoginTime          previousLoginTime
---------------- ---------- -------------------          -----------------
              21        309 2017-10-12T16:24:58.733+0900 2017-10-12T20:11:24.318+0900

ログアウト

処理が終わったらきちんとログアウトして、余計なもの*2が残らないようにしましょう。

https://docs.atlassian.com/jira/REST/server/#auth/1/session-logout

Invoke-RestMethod -uri $url.AbsoluteUri `
    -Method Delete `
    -ContentType "application/json" `
    -Headers $headers `
    -WebSession $loginSession

またもや、URLは一緒なので、見た目はほぼ一緒です。
今度はMethodDeleteになっています。

なお、戻り値は返ってきません。*3

余談

チュートリアルもあるようです。

JIRA REST API Tutorials - Atlassian Developers

これやった後、通常のログインページから、PowerShellでログインできないか、試していました。
結果から言うと、私には無理でした…

Web初心者なので、もっと勉強して、いつか通常のログインページから、PowerShellでログインしてみたいです。
※ログインできたら満足!

普通に便利に使うなら、REST APIを使ってアクセスしましょう。


*1:前はJIRAと、全部大文字だったが、公式がJiraとなっていたので、それに合わせた

*2:主に、セッションID。どう悪用されるか分からないので、ログアウトで無効にする

*3:ステータス204が返ってきたら成功。成否を確認するなら、Invoke-WebRequestを使って、ステータスコードを取得するとよい