github-research-tool/features/04-github-projects.md
marketing-shibata50 59b60ace06 feat: add comprehensive GitHub guides expansion
🆕 New Guides Added:
- GitHub Actions complete guide (CI/CD automation)
- GitHub Security comprehensive guide (enterprise security)
- GitHub Pages detailed guide (website publishing)

🔗 Navigation Improvements:
- Updated index.md with all 7 guides
- Added cross-navigation between all guides
- Enhanced learning paths for different user types
- Comprehensive learning flow diagrams

📚 Content Highlights:
- Jenkins/CircleCI migration strategies
- Enterprise security best practices
- WordPress to GitHub Pages migration
- Advanced automation workflows
- Complete external tool replacements

🎯 User Experience:
- Role-based learning recommendations
- Consistent navigation structure
- Progressive learning paths
- Cross-reference linking

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-20 13:22:23 +09:00

26 KiB
Raw Permalink Blame History

layout title description
default GitHub Projects完全ガイド アジャイル開発のためのプロジェクト管理とGitHub Projects V2完全活用法

📋 GitHub Projects - アジャイル開発のためのプロジェクト管理

GitHub Projects V2を活用して、Jira・Trello・Asanaなどの外部ツールに依存しない、統合されたプロジェクト管理環境を構築する完全ガイド。Issues・Pull Requestsとシームレスに連携し、開発から運用まで一元管理を実現します。

🎯 学習目標

  • GitHub Projects V2の全機能理解と実践的活用
  • アジャイル開発手法(スクラム・カンバン)の実装
  • 外部プロジェクト管理ツールからの完全移行
  • 自動化によるプロジェクト運用効率化
  • チーム協働とステークホルダー管理の最適化

📚 目次

  1. GitHub Projects V2 概要
  2. プロジェクト作成と基本設定
  3. ビューとワークフローの設計
  4. カスタムフィールドと自動化
  5. アジャイル手法の実装
  6. 外部ツールからの移行

1. GitHub Projects V2 概要

🚀 従来版との主要な違い

Projects V2 の革新的機能

### V1 → V2 進化ポイント

#### データ構造
- **V1**: カード形式(制限的)
- **V2**: テーブル形式(柔軟性)

#### カスタマイズ性  
- **V1**: 基本的なカラム移動のみ
- **V2**: カスタムフィールド・フィルタ・グループ化

#### 自動化
- **V1**: 限定的なワークフロー
- **V2**: 高度な自動化ルール

#### ビュー機能
- **V1**: カンバンビューのみ
- **V2**: カンバン・テーブル・ロードマップ・ガントチャート

#### スコープ
- **V1**: リポジトリレベル
- **V2**: 組織・個人・複数リポジトリ対応

📊 外部ツールとの機能比較

機能 GitHub Projects V2 Jira Trello Asana Linear 備考
カンバンボード 全て対応
ガントチャート Projects V2で新対応
スプリント管理 ⚠️ カスタムフィールドで実現
バーンダウンチャート ⚠️ ⚠️ APIで実現可能
カスタムフィールド 高い柔軟性
自動化 ⚠️ GitHub Actions連携
レポート機能 ⚠️ Insights・API活用
コード連携 ⚠️ ⚠️ 最も強力
コスト100人 $0-2,100 $7,000 $5,000 $12,000 $8,000 圧倒的にコスト効率良い

2. プロジェクト作成と基本設定

🛠️ プロジェクト初期設定

新規プロジェクト作成

# GitHub CLI でプロジェクト作成
gh project create --title "Product Development Q1 2024" \
  --body "Q1期の製品開発プロジェクト管理"

# または Web UI で作成
# https://github.com/users/USERNAME/projects/new
# または組織: https://github.com/orgs/ORGANIZATION/projects/new

基本設定の最適化

### プロジェクト基本情報

#### 必須設定項目
- **プロジェクト名**: 明確で検索しやすい名前
- **説明**: 目的・スコープ・期間を明記
- **可視性**: Private機密 / Publicオープンソース
- **所有者**: 個人 / 組織
- **README**: プロジェクトの詳細情報

#### 推奨README構成
```markdown
# Product Development Q1 2024

## 🎯 プロジェクト概要
Q1期間中の製品開発における機能開発・バグ修正・リリース管理

## 📅 期間
2024年1月1日 - 2024年3月31日

## 👥 チーム構成
- **Product Manager**: @product-lead
- **Tech Lead**: @tech-lead  
- **Frontend**: @frontend-team
- **Backend**: @backend-team
- **QA**: @qa-team

## 🎯 主要マイルストーン
- [ ] Alpha版リリース (1/31)
- [ ] Beta版リリース (2/28)
- [ ] 本番リリース (3/31)

## 📊 成功指標
- 機能完成率: 95%以上
- バグ解決率: 100%
- リリース予定遵守率: 90%以上

🔗 リポジトリとの連携設定

複数リポジトリの統合管理

# プロジェクトにリポジトリを追加
gh project item-create PROJECT_ID \
  --owner OWNER \
  --repo REPO_NAME

# 複数リポジトリの一括追加例
REPOS=("frontend-app" "backend-api" "mobile-app" "documentation")
for repo in "${REPOS[@]}"; do
  gh project item-create $PROJECT_ID --owner $OWNER --repo $repo
done

3. ビューとワークフローの設計

📊 多角的ビューの構築

1. カンバンビュー(日常業務用)

### カンバン列設計

#### 基本フロー
📋 **Backlog** → 🏗️ **Ready** → 🔄 **In Progress** → 👀 **Review** → ✅ **Done**

#### 詳細ステータス定義
- **Backlog**: 優先順位付け待ち・要件未確定
- **Ready**: 開発可能・担当者アサイン済み
- **In Progress**: 実装中・ブロック状況の監視
- **Review**: PR作成済み・レビュー待ち
- **Done**: マージ完了・検証済み

#### 高度な列設定
- **Ice Box**: 将来検討・低優先度アイデア
- **Blocked**: 外部依存・技術的課題で停止中
- **Waiting**: 顧客フィードバック・承認待ち
- **Deployed**: 本番環境デプロイ完了

2. テーブルビュー(詳細管理用)

### カスタムフィールド設計

#### 必須フィールド
- **Status**: Single selectBacklog, Ready, In Progress, Review, Done
- **Priority**: Single selectCritical, High, Medium, Low
- **Size**: Single selectXS, S, M, L, XL
- **Epic**: Text関連するエピック名
- **Sprint**: Single selectSprint 1, Sprint 2, ...
- **Assignee**: People担当者
- **Due Date**: Date期限
- **Story Points**: Number見積もりポイント

#### 発展フィールド
- **Component**: Multi-selectFrontend, Backend, Mobile, API
- **Customer Impact**: Single selectHigh, Medium, Low, None
- **Technical Debt**: Single selectYes, No
- **Risk Level**: Single selectHigh, Medium, Low
- **Reviewer**: Peopleレビュー担当者

3. ロードマップビュー(戦略的計画用)

### 時系列での進捗可視化

#### 設定項目
- **X軸**: 時間軸(週・月・四半期)
- **Y軸**: エピック・チーム・コンポーネント
- **マーカー**: マイルストーン・リリース予定日
- **色分け**: 優先度・ステータス・担当チーム

#### 活用シーン
- **エグゼクティブレビュー**: 経営陣への進捗報告
- **リリース計画**: 機能リリースのタイムライン
- **リソース配分**: チーム間の作業バランス確認
- **依存関係管理**: ブロッカーの可視化

🔄 ワークフロー自動化の設計

Issue → Project 自動追加

# .github/workflows/add-to-project.yml
name: Add Issue to Project
on:
  issues:
    types: [opened, labeled]

jobs:
  add-to-project:
    runs-on: ubuntu-latest
    steps:
      - name: Add to project
        uses: actions/add-to-project@v0.4.0
        with:
          project-url: https://github.com/users/USERNAME/projects/1
          github-token: ${{ secrets.ADD_TO_PROJECT_TOKEN }}
          labeled: bug,enhancement,feature

ステータス自動更新

# .github/workflows/update-project-status.yml
name: Update Project Status
on:
  pull_request:
    types: [opened, closed, merged]

jobs:
  update-status:
    runs-on: ubuntu-latest
    steps:
      - name: Update status on PR
        uses: actions/github-script@v6
        with:
          script: |
            const pr = context.payload.pull_request;
            
            // PRの状態に応じてプロジェクトアイテムのステータスを更新
            let newStatus;
            if (pr.state === 'open') {
              newStatus = 'Review';
            } else if (pr.merged) {
              newStatus = 'Done';
            } else if (pr.state === 'closed') {
              newStatus = 'Backlog';
            }
            
            // GraphQL APIでプロジェクトアイテムを更新
            const query = `
              mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $value: String!) {
                updateProjectV2ItemFieldValue(
                  input: {
                    projectId: $projectId
                    itemId: $itemId
                    fieldId: $fieldId
                    value: { singleSelectOptionId: $value }
                  }
                ) {
                  projectV2Item {
                    id
                  }
                }
              }
            `;
            
            // 実際の更新処理
            // 注projectId, itemId, fieldIdは環境に応じて設定

4. カスタムフィールドと自動化

🎛️ 高度なカスタマイズ

スクラム開発用フィールド設定

### スクラム特化カスタムフィールド

#### ストーリー管理
- **User Story**: Textユーザーストーリー記述
- **Acceptance Criteria**: Text受け入れ条件
- **Story Points**: Number1, 2, 3, 5, 8, 13, 21
- **Business Value**: Single selectHigh, Medium, Low

#### スプリント管理
- **Sprint**: Single selectCurrent, Next, Future, Backlog
- **Sprint Goal**: Textスプリント目標
- **Velocity**: Numberチームの開発速度
- **Burndown**: Number残作業量

#### 品質管理
- **Definition of Done**: Checkbox完了条件チェックリスト
- **Test Coverage**: Numberテストカバレッジ%
- **Code Review Status**: Single selectPending, Approved, Changes Requested
- **QA Status**: Single selectNot Started, In Progress, Passed, Failed

カンバン開発用フィールド設定

### カンバン特化カスタムフィールド

#### フロー管理
- **WIP Limit**: Number作業中上限数
- **Cycle Time**: Number開始から完了までの日数
- **Lead Time**: Number要求から完了までの日数
- **Flow Efficiency**: Number実作業時間の割合%

#### 継続改善
- **Blocker Reason**: Textブロック理由
- **Improvement Suggestion**: Text改善提案
- **Retrospective Item**: Checkbox振り返り対象
- **Customer Feedback**: Text顧客からのフィードバック

🤖 自動化ルールの実装

複雑な条件分岐自動化

# .github/workflows/project-automation.yml
name: Advanced Project Automation
on:
  issues:
    types: [opened, edited, labeled, assigned]
  pull_request:
    types: [opened, closed, review_requested, review_submitted]

jobs:
  project-automation:
    runs-on: ubuntu-latest
    steps:
      - name: Advanced Automation Logic
        uses: actions/github-script@v6
        with:
          script: |
            const { data: projects } = await github.rest.projects.listForUser({
              username: context.repo.owner
            });
            
            const projectId = projects.find(p => p.name === 'Development Board')?.id;
            if (!projectId) return;
            
            // 複雑な条件分岐処理
            const event = context.eventName;
            const action = context.payload.action;
            
            switch(event) {
              case 'issues':
                await handleIssueEvent(action, context.payload.issue);
                break;
              case 'pull_request':
                await handlePREvent(action, context.payload.pull_request);
                break;
            }
            
            async function handleIssueEvent(action, issue) {
              // 優先度に応じた自動アサイン
              if (issue.labels.some(l => l.name === 'priority:critical')) {
                await github.rest.issues.addAssignees({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: issue.number,
                  assignees: ['team-lead']
                });
              }
              
              // 見積もりポイントの自動設定
              let storyPoints = 3; // デフォルト
              if (issue.labels.some(l => l.name === 'size:small')) storyPoints = 1;
              if (issue.labels.some(l => l.name === 'size:large')) storyPoints = 8;
              
              // プロジェクトアイテムのフィールド更新
              // 注実際のGraphQL実装が必要
            }
            
            async function handlePREvent(action, pr) {
              if (action === 'opened') {
                // PR作成時関連Issueのステータスを「Review」に更新
                const linkedIssues = extractLinkedIssues(pr.body);
                for (const issueNumber of linkedIssues) {
                  // ステータス更新処理
                }
              }
            }
            
            function extractLinkedIssues(prBody) {
              const regex = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)/gi;
              const matches = [...prBody.matchAll(regex)];
              return matches.map(match => parseInt(match[1]));
            }

5. アジャイル手法の実装

🏃‍♂️ スクラム手法の完全実装

スプリント計画・実行・振り返り

スプリント計画ビューの設定

### Sprint Planning View 設定

#### フィルタ設定
- **Status**: Backlog, Ready
- **Sprint**: Current, Next
- **Story Points**: 1-21見積もり済み

#### グループ化
- **Primary**: Epic機能群別
- **Secondary**: Priority優先度別

#### ソート順
1. PriorityCritical → High → Medium → Low
2. Business ValueHigh → Medium → Low 
3. Story Points小 → 大)

#### 表示カラム
- Title, Status, Assignee, Story Points, Sprint, Due Date

スプリント実行中のデイリースタンドアップ支援

### Daily Standup Dashboard

#### 今日の作業ビュー
- **フィルタ**: Status = "In Progress", Assignee = "@me"
- **表示**: 昨日完了・今日予定・ブロッカー情報

#### チーム全体の進捗ビュー  
- **グループ化**: Assignee担当者別
- **色分け**: ステータス別(緑=順調、黄=注意、赤=遅延)
- **アラート**: 期限超過・長期停滞アイテム

#### ブロッカー監視ビュー
- **フィルタ**: Labels contains "blocked"
- **ソート**: 作成日(古い順)
- **アクション**: 担当者への通知・エスカレーション

スプリントレトロスペクティブ

### Sprint Retrospective Template

#### 振り返り観点
- **Keep**: 継続すべきこと
- **Problem**: 改善が必要なこと  
- **Try**: 次スプリントで試すこと

#### メトリクス収集
- **Velocity**: 完了ストーリーポイント
- **Burndown**: 日別残作業量推移
- **Cycle Time**: 平均完了時間
- **Bug Rate**: 不具合発生率

#### 改善アクション
- 特定された問題の対策アイテム作成
- プロセス改善のためのタスク追加
- 次スプリントでの実験項目設定

📊 カンバン手法の実装

継続的フロー最適化

WIP制限の設定と監視

### WIP Limits by Column

#### 推奨設定5人チーム
- **Ready**: 10アイテムバックログの充実
- **In Progress**: 5アイテムチーム人数と同じ
- **Review**: 3アイテム迅速なレビュー
- **Blocked**: 制限なし(問題の可視化)

#### 監視とアラート
- WIP超過時の自動通知
- 長期滞留アイテムの検出
- フロー効率の計測・レポート

累積フロー図CFDの作成

# cfd_generator.py - Cumulative Flow Diagram 生成
import requests
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime, timedelta

class CFDGenerator:
    def __init__(self, github_token, project_id):
        self.token = github_token
        self.project_id = project_id
        
    def generate_cfd(self, days=30):
        """過去30日間の累積フロー図を生成"""
        end_date = datetime.now()
        start_date = end_date - timedelta(days=days)
        
        daily_data = []
        current_date = start_date
        
        while current_date <= end_date:
            # その日のステータス別アイテム数を取得
            status_counts = self.get_status_counts_for_date(current_date)
            daily_data.append({
                'date': current_date,
                **status_counts
            })
            current_date += timedelta(days=1)
        
        df = pd.DataFrame(daily_data)
        
        # 累積フロー図の描画
        plt.figure(figsize=(12, 8))
        statuses = ['Done', 'Review', 'In Progress', 'Ready', 'Backlog']
        colors = ['#28a745', '#ffc107', '#007bff', '#6c757d', '#dc3545']
        
        for i, status in enumerate(statuses):
            plt.fill_between(df['date'], 
                           df[status] if i == 0 else df[statuses[:i+1]].sum(axis=1),
                           df[statuses[:i]].sum(axis=1) if i > 0 else 0,
                           color=colors[i], alpha=0.7, label=status)
        
        plt.xlabel('Date')
        plt.ylabel('Number of Items')
        plt.title('Cumulative Flow Diagram')
        plt.legend()
        plt.xticks(rotation=45)
        plt.tight_layout()
        plt.savefig('cfd.png', dpi=300, bbox_inches='tight')
        
        return df
    
    def get_status_counts_for_date(self, date):
        """指定日のステータス別アイテム数を取得"""
        # GitHub GraphQL API を使用してプロジェクトデータを取得
        # 実装の詳細は省略実際のAPI呼び出しが必要
        return {
            'Backlog': 15,
            'Ready': 8, 
            'In Progress': 5,
            'Review': 3,
            'Done': 25
        }

# 使用例
cfd = CFDGenerator(github_token="your_token", project_id="project_id")
data = cfd.generate_cfd()
print("CFD generated successfully!")

6. 外部ツールからの移行

🔄 Jira からの移行

完全移行チェックリスト

### Phase 1: データマッピング設計1週間

#### Jiraフィールド → GitHub Projects フィールド対応
- **Issue Type** → **Labels**bug, feature, story, epic
- **Priority** → **Priority**Critical, High, Medium, Low
- **Status** → **Status**Backlog, In Progress, Done等
- **Assignee** → **Assignee**(ユーザーマッピング必要)
- **Epic Link** → **Epic**(カスタムテキストフィールド)
- **Story Points** → **Story Points**(カスタム数値フィールド)
- **Sprint** → **Sprint**(カスタム選択フィールド)
- **Components** → **Labels**(複数ラベルで対応)

### Phase 2: 移行ツール開発2週間

#### 自動移行スクリプト
```python
# jira_to_github_projects.py
import requests
import json
from jira import JIRA

class JiraToGitHubMigrator:
    def __init__(self, jira_url, jira_user, jira_token, github_token, github_project_id):
        self.jira = JIRA(server=jira_url, basic_auth=(jira_user, jira_token))
        self.github_token = github_token
        self.project_id = github_project_id
        
    def migrate_project(self, jira_project_key):
        """Jiraプロジェクト全体を移行"""
        # 1. Jira Issuesを取得
        issues = self.jira.search_issues(f'project={jira_project_key}', maxResults=1000)
        
        # 2. GitHub Issues/Project Itemsを作成
        for issue in issues:
            github_issue = self.create_github_issue(issue)
            self.add_to_project(github_issue['number'])
            
    def create_github_issue(self, jira_issue):
        """Jira Issue を GitHub Issue に変換"""
        # フィールドマッピング
        title = jira_issue.fields.summary
        body = self.convert_description(jira_issue.fields.description)
        labels = self.map_labels(jira_issue.fields.issuetype, jira_issue.fields.priority)
        
        issue_data = {
            'title': title,
            'body': body,
            'labels': labels
        }
        
        # GitHub API で Issue 作成
        response = requests.post(
            f'https://api.github.com/repos/{self.repo}/issues',
            headers={'Authorization': f'token {self.github_token}'},
            json=issue_data
        )
        
        return response.json()

Phase 3: チーム教育・並行運用2週間

教育プログラム

  • ハンズオン研修: GitHub Projects V2操作方法
  • ワークショップ: アジャイルプロセスの再設計
  • QAセッション: 移行に関する疑問解決
  • ドキュメント: 新しいプロセスの標準化

Phase 4: 完全移行・Jira停止1週間

移行完了基準

  • 全データ移行完了・検証済み
  • チーム全員が新プロセスに習熟
  • 自動化・インテグレーション動作確認
  • パフォーマンス・可用性確認
  • バックアップ・ロールバック手順準備

### 📊 コスト効果分析

#### 移行前後の比較100人チーム・年間
```markdown
### 導入・運用コスト比較

#### Jira移行前
- **ライセンス費用**: $7,000/年
- **管理・運用**: 1人 × 20% = $20,000/年
- **教育・サポート**: $5,000/年
- **カスタマイズ**: $10,000/年
- **合計**: $42,000/年

#### GitHub Projects V2移行後
- **ライセンス費用**: $0GitHub Pro に含まれる)
- **管理・運用**: 1人 × 5% = $5,000/年
- **教育・サポート**: $2,000/年(初年度のみ)
- **カスタマイズ**: $3,000/年(自動化開発)
- **合計**: $10,000/年

### ROI計算
- **年間削減額**: $32,000
- **移行コスト**: $15,000一時費用
- **投資回収期間**: 5.6ヶ月
- **3年間総節約額**: $81,000

🎓 実践演習

演習1: スクラムプロジェクト構築

  1. プロジェクト作成 - チーム用スクラムボード
  2. カスタムフィールド設定 - ストーリーポイント・スプリント
  3. 自動化ルール - Issue→Project追加・ステータス更新
  4. レポートビュー - スプリント進捗・ベロシティ

演習2: カンバンフロー最適化

  1. フロー設計 - WIP制限・フロー効率
  2. メトリクス収集 - サイクルタイム・リードタイム
  3. 継続改善 - ボトルネック特定・プロセス改善
  4. 可視化 - 累積フロー図・バーンアップチャート

演習3: 外部ツール移行

  1. 現状分析 - 既存ツールの機能・データ調査
  2. 移行計画 - フェーズ別移行ロードマップ
  3. データマッピング - フィールド・ワークフロー対応
  4. 並行運用 - リスク軽減・段階的移行

🔗 関連リソース

公式ドキュメント

移行・活用ツール

アジャイル手法参考資料


📝 まとめ

GitHub Projects V2を効果的に活用することで

統合された開発環境 - コードとプロジェクト管理の一元化 コスト大幅削減 - 外部ツールライセンス費用の削減 チーム生産性向上 - シームレスなワークフローと自動化 柔軟なプロセス適応 - スクラム・カンバン・独自手法に対応 データドリブン改善 - メトリクス収集と継続的最適化

次は実際のプロジェクトでGitHub Projects V2を活用し、チームの開発プロセスを最適化しましょう

🔗 関連ガイド

📖 学習フロー

graph LR
    A[リポジトリ基礎] --> B[Issues管理]
    B --> C[Pull Request]
    C --> D[GitHub Projects]
    D --> E[完全活用]
    
    style A fill:#f3e5f5
    style B fill:#f3e5f5
    style C fill:#f3e5f5
    style D fill:#e1f5fe
    style E fill:#e8f5e8