Backlog Wiki のチェンジログっぽいものを作成する(Shell編)

Backlog Wiki のチェンジログっぽいものを作成する(Shell編)

Clock Icon2025.05.13

はじめに

アノテーション株式会社のあのふじたです。
最近、BacklogのWikiの更新日時が古いページの確認をする機会があり検索に苦しみました。
付け焼き刃的なものですが Backlog Wiki のチェンジログっぽいものをShellで作成したのでブログ化してみます。
※似たようなブログがあったことに気づいたのはShell作成後だったので気にしないで書き進めます...。
Backlog APIを使って Wiki 一覧(リンク付き)を取得する Python製 CLIを作ってみる

以下にある Backlog API を使っています。
Wikiページ一覧の取得 | Backlog Developer API | Nulab
Wikiページ情報の更新 | Backlog Developer API | Nulab

Shell 全体の流れ

  1. Backlog APIでWikiページの一覧を取得
  2. jq で必要な部分のみフィルターして jsonとして保存
  3. markdown の表が崩れる恐れのあるパイプを置換
  4. DuckDB で markdown の表として出力
  5. Backlogの表が崩れる恐れのある文字をエスケープ
  6. Backlog APIでチェンジログ用 Wikiページの更新

事前準備

Backlog APIキー 取得

APIキーを取得しておきましょう。 Backlog の [個人設定 > API] から取得できます。

backlog-apikey-gen

チェンジログページの作成

対象の Backlog の Wiki にページを作成しておきます。
中身は空でOKです。
ページ一覧で一番上にソートされるように一旦 00.Changelog として作成しました。
また作成後のページID 1234567890は後で利用するのでメモしておきます。
XXX.backlog.jp/alias/wiki/1234567890

local PC側の設定

jq Install
自分は macOS だったので brew install jq
DuckDB Install
コマンドラインで curl https://install.duckdb.org | sh 実行
※中身はOS判定後 "https://github.com/duckdb/duckdb/releases/download/v${VER}/duckdb_cli-${DIST}.gz" をダウンロードして処理する感じでした。
※ macOS の方のみ
gsed Install brew install gsed

ログインシェル 設定(macOS の方のみ)

自分は普段ログインシェルはBashにしているので、同様の環境にしたい場合は以下のコマンドを利用して変更してください
% chsh -s /bin/bash

zshに戻したい場合は以下のコマンドです。
% chsh -s /bin/zsh
【小ネタ】MacbookProのログインシェルをbashからzshに乗り換えました。
https://dev.classmethod.jp/articles/mbp_bash_to_zsh/

Shell 作成

Backlog APIキー保存用ファイル作成

$ vi ~/.backlog/credentials

export API_KEY="APIキーの文字列"

Script本体

#!/bin/bash

set -eou pipefail

## https://<BACKLOG_URL>/find/<PROJECT_ID>?
## https://<BACKLOG_URL>/alias/wiki/<WIKI_ID>
BACKLOG_URL="<BACKLOG_URL>"
PROJECT_ID="<PROJECT_ID>"
WIKI_ID="<WIKI_ID>"

## API_KEY export
source "~/.backlog/credentials"

## wiki-id 一覧
ID_LIST="${PROJECT_ID}-wiki-all-info.json"
>"${ID_LIST}"
# Markdown ファイル
OUTPUT_MD="${PROJECT_ID}-wiki-all-info.md"
>"${OUTPUT_MD}"

## 1. Backlog APIでWikiページの一覧を取得
## 2. jq で必要な部分のみフィルターして jsonとして保存
curl -s -L "${BACKLOG_URL}/api/v2/wikis?apiKey=${API_KEY}&projectIdOrKey=${PROJECT_ID}" | \
jq --arg backlog_url "$BACKLOG_URL" -r '.[] | {
  "最終更新日": (.updated | split("T")[0]),
  "最終更新者": .updatedUser.name,
  "Wiki名": .name,
  "URL": "https://\($backlog_url)/alias/wiki/\(.id)"
}' >${ID_LIST}
## 3. markdown の表が崩れる恐れのあるパイプを置換
### WSL環境の方は gsed -> sed に置き換えてください
gsed -i 's/|/-/g' "${ID_LIST}"

## 4. DuckDB で markdown の表として出力
duckdb -markdown -c "SELECT * FROM read_json('${ID_LIST}')ORDER BY CAST(最終更新日 AS DATE) DESC" >"${OUTPUT_MD}"

## 5. Backlogの表が崩れる恐れのある文字をエスケープ
### WSL環境の方は gsed -> sed に置き換えてください
gsed -i 's/\([\*_][^|]*\)/ "\1" /g' ${OUTPUT_MD}

# Backlog API のエンドポイント
URL="https://${BACKLOG_URL}/api/v2/wikis/${WIKI_ID}"

# Markdown ファイルの内容を読み込む
CONTENT=$(cat "${OUTPUT_MD}")

## 6. Backlog APIでチェンジログ用 Wikiページの更新
response=$(curl -X PATCH "${URL}?apiKey=${API_KEY}" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     --data-urlencode "content=${CONTENT}" \
     --data-urlencode "mailNotify=false" \
     -w "\n%{http_code}")

# レスポンスボディとステータスコードを分離
body=$(echo "$response" | sed -e '$d')
status_code=$(echo "$response" | tail -n1)

# レスポンスの確認
if [ "$status_code" -eq 200 ]; then
    echo "Wiki ページが正常に更新されました。"
    echo "$body"
    rm -rf "${OUTPUT_MD}"
    rm -rf "${ID_LIST}"
else
    echo "エラーが発生しました。ステータスコード: $status_code"
    echo "$body"
fi

上記を実行すると以下のチェンジログっぽいものでWikiページが更新されます。

  • 最終更新者
  • 最終更新日
  • Wiki名
  • URL

backlog-wiki-changelog

定期的な更新での利用や長く使っているBacklogの整理等にお使いください。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.