Use Cases

GitHub API:Claude Code 实战指南

了解github api:Claude Code 实战. 包含实用技巧和代码示例。

GitHub API活用を通过 Claude Code 提高效率

GitHub APIを活用すれば、リポジトリ管理、PR创建、イシュー管理、发布など、开发工作流の多くを自动化可以。借助 Claude Code,Octokit SDKを活用した自动化スクリプトを快速构建可以。

Octokit客户端のセットアップ

> GitHub API客户端をセットアップして。
> 认证はGitHub AppとPersonal Access Tokenの
> 両方に支持して。
// src/lib/github.ts
import { Octokit } from '@octokit/rest';
import { createAppAuth } from '@octokit/auth-app';

// Personal Access Token认证
export function createOctokitWithPAT(token: string) {
  return new Octokit({ auth: token });
}

// GitHub App认证
export function createOctokitWithApp(
  appId: string,
  privateKey: string,
  installationId: number
) {
  return new Octokit({
    authStrategy: createAppAuth,
    auth: {
      appId,
      privateKey,
      installationId,
    },
  });
}

const octokit = createOctokitWithPAT(process.env.GITHUB_TOKEN!);
export default octokit;

PR自动化ツール

> PRの创建、レビュアー割り当て、ラベル付けを
> 自动化するツールを作って。
// src/services/pr-automation.ts
import octokit from '../lib/github';

interface CreatePROptions {
  owner: string;
  repo: string;
  title: string;
  body: string;
  head: string;
  base: string;
  reviewers?: string[];
  labels?: string[];
  draft?: boolean;
}

export async function createPullRequest(options: CreatePROptions) {
  // PR创建
  const { data: pr } = await octokit.pulls.create({
    owner: options.owner,
    repo: options.repo,
    title: options.title,
    body: options.body,
    head: options.head,
    base: options.base,
    draft: options.draft || false,
  });

  // レビュアー割り当て
  if (options.reviewers?.length) {
    await octokit.pulls.requestReviewers({
      owner: options.owner,
      repo: options.repo,
      pull_number: pr.number,
      reviewers: options.reviewers,
    });
  }

  // ラベル付け
  if (options.labels?.length) {
    await octokit.issues.addLabels({
      owner: options.owner,
      repo: options.repo,
      issue_number: pr.number,
      labels: options.labels,
    });
  }

  return pr;
}

// PRの更改文件を分析
export async function analyzePRChanges(
  owner: string,
  repo: string,
  pullNumber: number
) {
  const { data: files } = await octokit.pulls.listFiles({
    owner,
    repo,
    pull_number: pullNumber,
    per_page: 100,
  });

  const summary = {
    totalFiles: files.length,
    additions: files.reduce((sum, f) => sum + f.additions, 0),
    deletions: files.reduce((sum, f) => sum + f.deletions, 0),
    filesByType: {} as Record<string, number>,
  };

  for (const file of files) {
    const ext = file.filename.split('.').pop() || 'other';
    summary.filesByType[ext] = (summary.filesByType[ext] || 0) + 1;
  }

  return summary;
}

イシュー管理の自动化

> ステイルイシューの自動クローズと
> ラベル自動付与のスクリプトを作って。
// src/services/issue-management.ts
import octokit from '../lib/github';

export async function closeStaleIssues(
  owner: string,
  repo: string,
  daysThreshold = 90
) {
  const cutoffDate = new Date();
  cutoffDate.setDate(cutoffDate.getDate() - daysThreshold);

  const { data: issues } = await octokit.issues.listForRepo({
    owner,
    repo,
    state: 'open',
    sort: 'updated',
    direction: 'asc',
    per_page: 100,
  });

  const staleIssues = issues.filter(
    (issue) =>
      !issue.pull_request &&
      new Date(issue.updated_at) < cutoffDate
  );

  for (const issue of staleIssues) {
    // staleラベルを添加
    await octokit.issues.addLabels({
      owner,
      repo,
      issue_number: issue.number,
      labels: ['stale'],
    });

    // 评论添加クローズ
    await octokit.issues.createComment({
      owner,
      repo,
      issue_number: issue.number,
      body: `このイシューは${daysThreshold}日以上更新がないため、自動クローズします。再度対応が必要な場合はリオープンしてください。`,
    });

    await octokit.issues.update({
      owner,
      repo,
      issue_number: issue.number,
      state: 'closed',
      state_reason: 'not_planned',
    });
  }

  return { closedCount: staleIssues.length };
}

发布自动化

// src/services/release.ts
import octokit from '../lib/github';

export async function createRelease(
  owner: string,
  repo: string,
  tagName: string,
  options?: { prerelease?: boolean; generateNotes?: boolean }
) {
  const { data: release } = await octokit.repos.createRelease({
    owner,
    repo,
    tag_name: tagName,
    name: `Release ${tagName}`,
    generate_release_notes: options?.generateNotes ?? true,
    prerelease: options?.prerelease ?? false,
  });

  return release;
}

Webhook接收服务器

// src/api/github-webhook.ts
import { Webhooks } from '@octokit/webhooks';

const webhooks = new Webhooks({
  secret: process.env.GITHUB_WEBHOOK_SECRET!,
});

webhooks.on('pull_request.opened', async ({ payload }) => {
  const { pull_request, repository } = payload;
  console.log(`New PR: ${pull_request.title} in ${repository.full_name}`);
  // 自動ラベル付け、レビュアー割り当てなど
});

webhooks.on('issues.opened', async ({ payload }) => {
  const { issue, repository } = payload;
  console.log(`New Issue: ${issue.title} in ${repository.full_name}`);
});

export default webhooks;

总结

GitHub APIとClaude Codeを組み合わせれば、开发工作流の自动化を快速実現可以。GitHub Actions活用指南Git 工作流也可以参考。

GitHub API的详细信息请参阅GitHub REST API文档

#Claude Code #GitHub API #automation #CI/CD #開発効率化