📊

GitHubのIssueをPowerShellでCSVファイルにエクスポートする方法

2024/10/05に公開

解法

GitHubのIssueをCSVファイルにエクスポートするPowerShellスクリプトを作成しました。このスクリプトを使用することで、指定したリポジトリのオープンなIssueを簡単にCSVファイルに出力できます。

以下のスクリプトを Export-GitHubIssues.ps1 のようなファイルに保存し、実行してください:

param(
    [Parameter(Mandatory=$true)]
    [string]$Owner,
    
    [Parameter(Mandatory=$true)]
    [string]$Repo
)

# モジュールのインストール確認と必要に応じてインストール
if (-not (Get-Module -ListAvailable -Name PowerShellForGitHub)) {
    Write-Host "PowerShellForGitHub モジュールがインストールされていません。インストールを開始します..."
    Install-Module -Name PowerShellForGitHub -Force -Scope CurrentUser
}

# モジュールのインポート
Import-Module PowerShellForGitHub

# GitHub認証設定
# 環境変数からトークンを取得、なければコンソールから入力を求める
$token = [System.Environment]::GetEnvironmentVariable("GitHubToken", "User")
if (-not $token) {
    $secureToken = Read-Host "GitHub Personal Access Tokenを入力してください" -AsSecureString
    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureToken)
    $token = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

    # 入力されたトークンを環境変数に設定
    [System.Environment]::SetEnvironmentVariable("GitHubToken", $token, "User")
    Write-Host "トークンが環境変数 'GitHubToken' に保存されました。"
}

# トークンを使用して認証情報を設定
$secureString = ($token | ConvertTo-SecureString -AsPlainText -Force)
$cred = New-Object System.Management.Automation.PSCredential "username is ignored", $secureString
Set-GitHubAuthentication -Credential $cred

try {
    # オープンなIssueの取得
    Write-Host "リポジトリ $Owner/$Repo からオープンなIssueを取得中..."
    $issues = Get-GitHubIssue -OwnerName $Owner -RepositoryName $Repo -State Open

    # すべてのラベルを収集(重複を除去、bugとenhancementを除外)
    $allLabels = $issues.Labels.Name | Where-Object { $_ -notin @('bug', 'enhancement') } | Select-Object -Unique | Sort-Object

    # データの整形
    $formattedIssues = $issues | ForEach-Object {
        $issue = $_
        $labelNames = $issue.Labels.Name
        
        $type = if ($labelNames -contains 'bug') { 'bug' }
                elseif ($labelNames -contains 'enhancement') { 'enhancement' }
                else { '' }

        $labelColumns = @{}
        foreach ($label in $allLabels) {
            $labelColumns[$label] = if ($labelNames -contains $label) { 'x' } else { '' }
        }

        # 日付の処理
        $createdAt = if ($issue.created_at) { 
            [DateTime]::Parse($issue.created_at).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss") 
        } else { "" }
        
        $updatedAt = if ($issue.updated_at) { 
            [DateTime]::Parse($issue.updated_at).ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss") 
        } else { "" }

        # マイルストーン情報の取得
        $milestone = if ($issue.milestone) {
            $issue.milestone.title
        } else { "" }

        $baseProperties = [ordered]@{
            'Number' = $issue.Number
            'Title' = $issue.Title
            'Created At' = $createdAt
            'Updated At' = $updatedAt
            'Assignee' = $issue.Assignee.Login
            'Type' = $type
            'Milestone' = $milestone
        }

        $combinedProperties = $baseProperties + $labelColumns
        New-Object PSObject -Property $combinedProperties
    }

    # 出力フォルダの作成(存在しない場合)
    $outputFolder = Join-Path $PSScriptRoot "out"
    if (-not (Test-Path -Path $outputFolder)) {
        New-Item -ItemType Directory -Path $outputFolder | Out-Null
        Write-Host "出力フォルダを作成しました: $outputFolder"
    }

    # CSVファイルへの出力(Shift_JISエンコーディングを使用)
    $outputFileName = "github_open_issues_$Repo.csv"
    $outputPath = Join-Path $outputFolder $outputFileName
    $formattedIssues | Export-Csv -Path $outputPath -NoTypeInformation -Encoding Shift-JIS

    Write-Host "オープンなIssueが正常にCSVファイルに出力されました: $outputPath"
    Write-Host "取得したオープンなIssueの数: $($formattedIssues.Count)"
}
catch {
    Write-Error "エラーが発生しました: $_"
}
finally {
    # 認証情報のクリア
    Clear-GitHubAuthentication
}

解説

このスクリプトは以下の手順でGitHubのIssueをCSVファイルにエクスポートします:

  1. PowerShellForGitHubモジュールを使用してGitHub APIにアクセスします。
  2. 指定されたリポジトリからオープンなIssueを取得します。
  3. 各Issueの情報(番号、タイトル、作成日時、更新日時、担当者、タイプ、マイルストーン、ラベル)を整形します。
  4. 整形したデータをCSVファイルに出力します。

スクリプトの実行には、GitHubのPersonal Access Tokenが必要です。トークンは環境変数GitHubTokenに設定するか、初回実行時に入力を求められます。

使用方法

  1. PowerShellForGitHubモジュールをインストールします:

    Install-Module -Name PowerShellForGitHub -Scope CurrentUser
    
  2. スクリプトを実行します:

    .\Export-GitHubIssues.ps1 -Owner "オーナー名" -Repo "リポジトリ名"
    
  3. 出力されたCSVファイルは out フォルダ内に保存されます。

補足情報

  • 出力されるCSVファイルはShift_JISエンコーディングを使用しています。必要に応じて変更可能です。
  • bugenhancementラベルは特別に扱われ、Type列に出力されます。
  • その他のラベルは個別の列として出力されます。
  • マイルストーン情報も含まれています。

このスクリプトを使用することで、GitHubのIssue管理をより効率的に行うことができます。

Discussion