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 #開発効率化