Pivotal TrackerのAPIで、PBIのDescriptionを更新(追記)する

Pivotal TrackerにあるたくさんのPBIを更新します。
2022.11.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

スクラムのプロジェクト管理にPivotal Trackerを使っています。 このとき、PBIのテンプレートを自分たちで用意してしているのですが、テンプレートを更新するとき、バックログにある既存PBIの内容も更新したいです。

手動で更新するのは大変なので、Pivotal TrackerのAPIを使って更新を試してみます。

おすすめの方

  • Pivotal TrackerのAPIを使いたい方
  • Pivotal TrackerのAPIでPBIを更新したい方

Pivotal TrackerのAPIトークンを取得する

下記を参考にしてAPIトークンを取得します。

Pivotal TrackerのAPIで、PBIのDescriptionを更新する

いまのPBIを確認する

いくつかのPBIのDescriptionを確認します。

更新前のPBI(その1)

更新前のPBI(その2)

これらのPBIに対して、DESCRIPTIONに下記を追記してみます。

## 影響範囲
- 対応後に記載する

PBIの一覧を取得して、Descriptionを更新するスクリプト

次のAPIを利用します。

本記事ではPythonで書いてみました。 PBIの一覧を取得する方法の詳細は、次をご覧ください。

app.py

import json
import urllib.parse
import requests
import textwrap

from time import sleep



API_ENDPOINT = 'https://www.pivotaltracker.com/services/v5'
TOKEN = 'you_token'

PROJECT_ID = 'xxx'


def main():
    result = search()

    for item in result['stories']['stories']:
        print(item.get('id'))
        new_description = make_new_description(item.get('description', ''))
        update_pbi(item.get('id'), new_description)

        sleep(1)

    print('------')
    print(result['stories']['total_hits'])


def search():
    headers = {
        'X-TrackerToken': TOKEN,
    }

    # わかりやすさ優先でListで書いてみる
    query = [
        'type:feature,bug,chore',
        'state:unscheduled,unstarted',
    ]
    url_query = {
        # キーワードの区切りは半角空白
        'query': ' '.join(query),
    }

    parameter = urllib.parse.urlencode(url_query)
    resp = requests.get(
        f'{API_ENDPOINT}/projects/{PROJECT_ID}/search?{parameter}',
        headers=headers
    )
    return resp.json()


def make_new_description(description: str) -> str:
    add_message = textwrap.dedent('''

        ## 影響範囲
        - 対応後に記載する
    ''')
    return description + add_message

def update_pbi(story_id: int, description: str):
    headers = {
        'X-TrackerToken': TOKEN,
        'Content-Type': 'application/json',
    }

    payload = {
        'description': description,
    }
    requests.put(
        f'{API_ENDPOINT}/projects/{PROJECT_ID}/stories/{story_id}',
        headers=headers,
        data=json.dumps(payload)
    )

if __name__ == '__main__':
    main()

実行する

python app.py

結果を確認する

無事にDescriptionが更新されました。

更新後のPBI(その1)

更新後のPBI(その2)

さいごに

Pivotal Trackerで既存PBIを更新する場合などに役に立つと思います。参考になれば幸いです。

参考