CI/CD 連携

CI/CD では Personal API Token を secret として渡し、nolto pull で roadmap をキャッシュに取得してから nolto sync を実行します。roadmap の正本はサーバーにあるため、リポジトリへコミットしておくのは nolto.json だけです。

⚠️

NOLTO_TOKEN を workflow、roadmap、ログへ直接書かないでください。CI の secret manager を使用します。

GitHub Actions

関連文書が main branch に入ったときに同期する例です。

name: Sync Nolto roadmap

on:
  push:
    branches: [main]
    paths:
      - "docs/plans/**/*.md"
      - "nolto.json"

jobs:
  sync:
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Sync roadmap
        env:
          NOLTO_TOKEN: ${{ secrets.NOLTO_TOKEN }}
        run: |
          npx --yes @nolto/cli pull
          npx --yes @nolto/cli sync

GitHub の Settings → Secrets and variables → Actions に NOLTO_TOKEN を登録してください。

project binding

CI は nolto.json の projectId を同期先として使用します。

{
  "projectId": "550e8400-e29b-41d4-a716-446655440000"
}

このファイルに secret は含まれません。別の project へ誤送信しないよう、pull request で変更をレビューしてください。

競合時の扱い

同期はキャッシュの revision を基準に送ります。サーバー側の変更と衝突した場合は 409 Conflict で失敗します。CI で自動リトライせず、原因を確かめてから再実行してください。

プロジェクトメモリを CI で読む

「設定」→「アプリと API トークン」の「API トークン」で「制限付き」を選び、「メモリ」を「読み取り」にし、対象プロジェクトを選んでトークンを作り、secret の NOLTO_TOKEN に渡して nolto memory pull --scope project,branch を実行します。CI からは読み取りだけを行います(トークンを作った人の user スコープを取り込まないよう、--scope を付けます)。PR の CI などブランチ名が取れない環境では、branch のエントリは索引に載りません。詳しくはプロジェクトメモリをご覧ください。

ベストプラクティス

  • CI 専用の token 名と有効期限を設定する
  • workflow の権限を contents: read に限定する
  • nolto sync が非ゼロ終了したら job を失敗させる
  • token をローテーションしたら古い token を失効する