ランブック

ワークスペース内の Bitbucket リポジトリを一括監査

Bitbucket ワークスペース内のすべてのリポジトリについて、詳細な CSV レポートを生成します。サイズ、言語、公開範囲、権限、活動日時を含むため、コンプライアンス対応や整理に活用できます。

この処理の内容

このランブックは、Bitbucket ワークスペース内のすべてのリポジトリを取得し、詳細な CSV 監査レポートとして出力します。各行には、リポジトリ名、サイズ(MB 単位)、主要な言語、公開範囲、フォークかどうか、機能フラグ、作成日と最終更新日、既定のブランチ、権限の件数が含まれます。CSV の書き出し後には、合計値と言語別の内訳をまとめたサマリーがターミナルに表示されます。

前提条件

クイックスタート

# Audit all repos with default output file
./repo-audit.sh myworkspace

# Use a specific profile and output file
./repo-audit.sh myworkspace prod repos_audit.csv

# Quick one-liner with atlassian-cli directly
atlassian-cli bitbucket --workspace myworkspace repo list --format json | \
  jq -r '.[] | [.slug, .language, .size] | @csv'

ランブックスクリプト全文

repo-audit.sh

#!/bin/bash
# Bitbucket Repository Audit Script
#
# Generates a comprehensive CSV audit report of all repositories in a workspace.
# Includes repository details, permissions, and activity metrics.
#
# Usage:
#   ./repo-audit.sh --workspace myworkspace --output repos.csv
#   ./repo-audit.sh --workspace myworkspace --profile prod
#
# Output CSV columns:
#   - Repo Name, Full Name, Size, Language, Public, Fork, Has Wiki,
#     Has Issues, Created, Updated, Default Branch
#
# Requirements:
#   - atlassian-cli installed and configured
#   - jq for JSON processing

set -euo pipefail

# Configuration
WORKSPACE="${1:?Workspace slug required}"
PROFILE="${2:-default}"
OUTPUT_FILE="${3:-repos_audit_$(date +%Y%m%d).csv}"

# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log() {
    echo -e "${GREEN}[$(date +'%H:%M:%S')]${NC} $*"
}

warn() {
    echo -e "${YELLOW}[WARN]${NC} $*"
}

# Get all repositories
get_all_repos() {
    log "Fetching all repositories from workspace: $WORKSPACE"

    atlassian-cli bitbucket repo list \
        --profile "$PROFILE" \
        "$WORKSPACE" \
        --output json
}

# Get repository permissions
get_repo_permissions() {
    local repo="$1"

    atlassian-cli bitbucket permission list \
        --profile "$PROFILE" \
        "$WORKSPACE" \
        "$repo" \
        --output json 2>/dev/null || echo "[]"
}

# Generate CSV report
generate_report() {
    local repos="$1"

    log "Generating audit report: $OUTPUT_FILE"

    # Write CSV header
    echo "Repo Name,Full Name,Size (MB),Language,Public,Fork,Has Wiki,Has Issues,Created,Updated,Default Branch,Permission Count" > "$OUTPUT_FILE"

    local total
    total=$(echo "$repos" | jq '. | length')
    local processed=0

    echo "$repos" | jq -r '.[] | @json' | while IFS= read -r repo_json; do
        local name
        name=$(echo "$repo_json" | jq -r '.slug')
        local full_name
        full_name=$(echo "$repo_json" | jq -r '.full_name' | sed 's/"/""/g')
        local size
        size=$(echo "$repo_json" | jq -r '.size // 0')
        # Convert bytes to MB
        size=$((size / 1024 / 1024))
        local language
        language=$(echo "$repo_json" | jq -r '.language // "N/A"')
        local is_public
        is_public=$(echo "$repo_json" | jq -r '.is_private | if . then "No" else "Yes" end')
        local is_fork
        is_fork=$(echo "$repo_json" | jq -r 'if has("parent") then "Yes" else "No" end')
        local has_wiki
        has_wiki=$(echo "$repo_json" | jq -r '.has_wiki // false | if . then "Yes" else "No" end')
        local has_issues
        has_issues=$(echo "$repo_json" | jq -r '.has_issues // false | if . then "Yes" else "No" end')
        local created
        created=$(echo "$repo_json" | jq -r '.created_on')
        local updated
        updated=$(echo "$repo_json" | jq -r '.updated_on')
        local default_branch
        default_branch=$(echo "$repo_json" | jq -r '.mainbranch.name // "N/A"')

        processed=$((processed + 1))
        log "Processing [$processed/$total]: $name"

        # Get permissions count
        local permissions
        permissions=$(get_repo_permissions "$name")
        local perm_count
        perm_count=$(echo "$permissions" | jq '. | length')

        # Write CSV row
        echo "\"$name\",\"$full_name\",$size,\"$language\",$is_public,$is_fork,$has_wiki,$has_issues,\"$created\",\"$updated\",\"$default_branch\",$perm_count" >> "$OUTPUT_FILE"
    done
}

# Generate summary statistics
generate_summary() {
    log "Generating summary statistics"

    local total_repos
    total_repos=$(tail -n +2 "$OUTPUT_FILE" | wc -l | tr -d ' ')

    local total_size
    total_size=$(tail -n +2 "$OUTPUT_FILE" | cut -d',' -f3 | \
        awk '{sum+=$1} END {print int(sum)}')

    local public_repos
    public_repos=$(tail -n +2 "$OUTPUT_FILE" | cut -d',' -f5 | \
        grep -c "Yes" || echo "0")

    local forks
    forks=$(tail -n +2 "$OUTPUT_FILE" | cut -d',' -f6 | \
        grep -c "Yes" || echo "0")

    echo ""
    log "Audit Summary:"
    echo "  Total Repositories: $total_repos"
    echo "  Public Repositories: $public_repos"
    echo "  Forks: $forks"
    echo "  Total Size: ${total_size} MB"
    echo ""

    # Language breakdown
    log "Repositories by Language:"
    tail -n +2 "$OUTPUT_FILE" | cut -d',' -f4 | \
        sed 's/"//g' | sort | uniq -c | \
        awk '{printf "  %s: %d\n", $2, $1}'

    echo ""
}

# Main execution
main() {
    log "Starting repository audit"
    log "Workspace: $WORKSPACE | Profile: $PROFILE"

    local repos
    repos=$(get_all_repos)

    if [ "$(echo "$repos" | jq '. | length')" -eq 0 ]; then
        warn "No repositories found in workspace: $WORKSPACE"
        exit 0
    fi

    generate_report "$repos"
    generate_summary

    log "Audit report saved to: $OUTPUT_FILE"
}

main

仕組み

1

入力を設定する。スクリプトは第 1 引数としてワークスペースのスラッグを必須で受け取り、位置引数として任意のプロファイル(既定値は default)と出力ファイル名(既定値は repos_audit_YYYYMMDD.csv)を受け取ります。

2

すべてのリポジトリを取得する。bitbucket repo list を 1 回呼び出すだけで、ワークスペース内のすべてのリポジトリを JSON で取得します。処理を進める前に、リポジトリが 1 つ以上あることを確認します。

3

リポジトリごとにメタデータを抽出する。リポジトリごとに、JSON レスポンスからスラッグ、フルネーム、サイズ(バイトから MB に換算)、言語、公開範囲、フォークかどうか、wiki と issues のフラグ、作成日、最終更新日、既定のブランチを取り出します。

4

権限を収集する。リポジトリごとに権限の一覧を個別に照会し、ユーザーやグループの権限エントリの件数を数えます。これにより、アクセス制御が広すぎるリポジトリや、アクセス制御が設定されていないリポジトリを見つけやすくなります。

5

CSV とサマリーを生成する。すべてのデータをヘッダー付きの CSV ファイルに書き出します。ターミナルには、リポジトリの総数、公開リポジトリ数、フォーク数、合計サイズ(MB 単位)、主要な言語別のリポジトリ内訳がサマリーとして表示されます。

関連ランブック

コピーしました