0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

背景

会社の成果物作成、毎回しんどい。よくこんなの周りの人やってんなと思うレベル

自分の場合、成果物として以下を毎回まとめる必要があった:

  • 設計や仕様のまとめ
  • ソースのまとめ

全部 Jira, Azure DevOps にあるもので、これらを頑張って収集&整理する。
まぁ日頃からやっておけって話ではあるんですが :sweat_smile:
手作業でやるの、正直めんどい。特に困ってたのが 「作業記録のまとめ」

JIRA には日々の作業を Issue で登録してるし、Wiki には技術的な調査内容も書いてる。でも成果物として出すときは、それを Word に整形し直す必要がある。

まぁ、word なんて書きたくないってことで、tool 化したお話

概要

作ったツール群 DeliveryAutomationSuite の構成はこんな感じ:

ツール 機能
createWiki2Word.py Azure DevOps Wiki → Word 変換(AI 要約付き)
jiraIssues2Word.py JIRA 完了 Issue → Word 変換(AI 要約付き)
analyze_clockinfo.py cloc 出力の集計・分析
createzip.ps1 上記を統合して成果物フォルダを自動生成

ポイント:Azure OpenAI(gpt-4o-mini)で Wiki や JIRA Issue の内容を自動要約してる。長文の技術メモも簡潔にまとめておかないと、章立てが困ったので

使用している主な技術・ライブラリ

技術 用途 公式リンク
cloc ソースコード行数カウント GitHub
JIRA REST API JIRA Issue の取得 Atlassian Developer
azure-devops (Python SDK) Azure DevOps Wiki の取得 GitHub
python-docx Word 文書の生成 公式ドキュメント
Azure OpenAI AI 要約生成 Microsoft Learn

全体の流れ

詳細:各ツールの役割

1. Azure DevOps Wiki → Word 変換

Azure DevOps の Wiki、便利なんだけど旧態依然で社内は Word 大好き派が幅を利かせてるので変換が必要・・
そもそも、その形式を想定した記録ってのも考えられなくもないけど、無駄な形式主義には反旗を :fire:

やってること:

  • Wiki の階層構造をそのまま Word の見出しレベルに変換
  • 各ページの内容を Azure OpenAI で要約
  • ハイパーリンク付きの目次を自動生成

2. JIRA 完了 Issue → Word 変換

「何やったか」をまとめるのに、JIRA の完了 Issue をベースに文書化する。

やってること:

  • 指定期間内に完了した Issue を API で取得
  • 各 Issue の description やコメントを AI で要約
  • Word テンプレートに沿って整形出力

3. ソースコード統計の集計

cloc の出力を解析して、言語別のステップ数を集計。上位 3 言語の合計も自動計算されるので、成果物件一覧表の記入が楽になった。

そもそも、今時 LoC: Line of Code なんて意味あるんかいって思うんですけどね・・ :sweat:

4. 統合スクリプト(createzip.ps1)

最終的に、決められたフォルダ構成で成果物を自動生成:シンドイ

技術的なつまずきポイント

1. Azure DevOps API の認証

Azure DevOps の Python SDK(azure-devops)は認証に msrest を使う。ただ AzureCliCredential はそのままだと使えない。

解決策msrest.authentication.Authentication を継承したラッパークラスを作って、AzureCliCredential で取得したトークンをセッションヘッダーに設定すれば OK。

class AzureCliMsRestCredential(Authentication):
    def __init__(self):
        self.azure_cli_credential = AzureCliCredential()

    def signed_session(self, session=None):
        token = self.azure_cli_credential.get_token(SCOPE).token
        session.headers["Authorization"] = f"Bearer {token}"
        return session

2. Wiki の再帰取得と進捗表示

Wiki ページは階層構造になってて、再帰的に取得する必要がある。ページ数が多いと時間かかるので、tqdm で進捗バー出すようにした。

3. Word へのハイパーリンク挿入

python-docx には直接ハイパーリンク追加する機能がない。OOXML を直接操作して w:hyperlink 要素を追加する必要があった。ここは地味にハマった。

4. Git の日本語ファイル名問題

cloc --git-diff-all で日本語ファイル名があると fatal: pathspec エラーが出ることがある。

解決策git config --local core.quotepath false を一時的に設定して、処理後に元に戻すようにした。

5. Azure OpenAI の認証

Azure OpenAI を Azure AD 認証で使う場合、get_bearer_token_provider でトークンプロバイダーを設定する。スコープは https://cognitiveservices.azure.com/.default

あとがき

「成果物作成の自動化」っていうと大げさだけど、実際やってることは 「散らばった作業記録を集めて整形する」 だけ。

でもこの「集めて整形する」が毎回地味に時間食うんだよね。特に JIRA、Azure DevOps、Git と複数ツールにまたがった情報を一つの文書にまとめるの、手作業だと漏れやミスが起きやすい。

あと、たまにしかしないので、どうやってたか?なんかも忘れ勝ち

まぁ、毎回なんらかの環境変化があるので、毎回やり方をちょっとずつ変えないといけないことはあるんだけどそれはそれで楽しいって感じるので :ok:

  • 今回は、JIRA, Miroが入ってきた
  • 次回は、Azure DevOps が GitHub になる

今後やりたいこと

自動で成果物更新して常時アップロードできるようにしておけばって気もするが・・
それはそれで API コストもかかるか・・

先に、Code Wiki の Local 対応かな :thinking:

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?