LoginSignup
0
0

More than 3 years have passed since last update.

NestJSからJiraのチケットを作る

Last updated at Posted at 2019-07-17

Angularで作ったUIからJiraチケットを作ろうとしたところ、CORSの問題でうまくいかなかった。デフォルトではJiraは同じOriginからのリクエストしか受け付けてくれないためらしい。対策としては、リクエストを受け付けるOriginを設定する(Jiraの掲示板参照)か、同じOriginに見えるようリバースプロキシか何かを設定すればよいらしい。しかしどちらも相手のサーバを触る必要があるので敷居が高い。(会社のサーバは、一つのプラグイン追加に対して"協議"に半年かかる)

代わりにAngularで作ったUIからバックエンド(自PCで稼働させる)のNestJSサーバに要求を出して、NestJSからJiraのREST APIを叩かせようと思う。

サーバを使う場合もAuthorizationをどうするかが課題になる。現状、社内Jiraはイントラネットだからか、Basic認証を使っているらしい。そのままで良いものか…

チケットを投稿するコントローラ

以下にNestJSからAxios(HTTPクライアント)を使ってJiraチケット作成を試行した際の簡単なコントローラを示す。testというエンドポイントを開くとエピックを作るので、APIとしてはありえない仕様だが、とりあえず動きは確認できる(ブラウザを開くだけで確認でき、Swaggerの設定をせずに試せるのでついついやってしまう)。

controller.ts
import { Controller, Get, HttpService } from '@nestjs/common';
import { AxiosResponse, AxiosRequestConfig } from 'axios';

@Controller()
export class AppController {
    constructor( private readonly http: HttpService ) {}

    @Get( '/test' )
    async createEpic(): Promise<any> {
        let config: AxiosRequestConfig = {
            baseURL: 'http://<JiraサーバのURL>/rest/api/2/',
            auth: { username: 'ユーザ名', password: 'パスワード' } // Basic認証の指定も兼ねる
        };
        const issue = { 
            fields: { 
                "project": { "key": "プロジェクトのキー" }, 
                "issuetype": { "id": "10000" },
                "summary": "概要",
                "description": "説明",
                "customfield_10104": "エピック名!! これが無いとエピックが作れない。"
            } 
        };
        let res= {};
        try {
            // ここで、BaseURLにissueが付け加えられて、issueエンドポイントを指す
            res= await this.http.post( 'issue', issue, config ).toPromise();
        }
        catch( e )
        {
            // Jiraサーバから文句を言われたらここを見る
            console.log( e.response );
        }
        return res;
    }
}

嵌まったポイント

どうしようもないところで嵌まってしまったので、忘れないようメモする。

エピック名が無い

400 Bad Requestが連発してチケットが作れなかった。実は要求自体はほぼできていたのだが、必須のフィールド(エピック名)が抜けていてNGだった。エラー応答のe.responseを早く見ていたら、「エピック名がありません」と書いてあるのに気づけたが、よく見ずにいじってしまい時間を浪費してしまった。

エピック名のフィールドが分からない

customfield_10104がエピック名だなんて初見殺しも良いところ…と思ってしまったが、実はREST APIのfieldから調べることができた。
image.png

チケットタイプが分からない

既存のエピックから、エピックのチケットタイプは10000と分かったものの、実はREST APIのissuetypeから調べることができた。
image.png

0
0
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
0
0