ランブック

CLI で Jira の課題を一括遷移する方法

数百件の Jira 課題を 1 つのコマンドでワークフローのステータス間を移動させます。実行前にドライランモードで変更内容をプレビューできます。

この処理の内容

このランブックは、JQL クエリに一致するすべての Jira 課題を新しいワークフローのステータスへ遷移させます。ドライランでプレビューできるため、変更前にどの課題が影響を受けるかを確認できます。並列数は設定でき、遷移させた各課題に任意のコメントを追加することもできます。

前提条件

クイックスタート

# Preview which issues will be transitioned
./bulk-transition.sh --jql "project = DEV AND status = 'In Progress'" \
  --transition "Done" --dry-run

# Execute the transition against production
./bulk-transition.sh --jql "project = DEV AND status = 'In Progress'" \
  --transition "Done" --profile prod --execute

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

bulk-transition.sh

#!/bin/bash
# Jira Bulk Transition Script
#
# Bulk transition issues matching a JQL query through workflow states.
# Supports dry-run mode and progress tracking.
#
# Usage:
#   # Dry run (preview affected issues)
#   ./bulk-transition.sh --jql "project = PROJ AND status = 'In Progress'" \
#                        --transition "Done" --dry-run
#
#   # Execute transition
#   ./bulk-transition.sh --jql "project = PROJ AND status = 'In Progress'" \
#                        --transition "Done" --profile prod
#
# Requirements:
#   - atlassian-cli installed and configured

set -euo pipefail

# Configuration
JQL=""
TRANSITION=""
PROFILE="default"
DRY_RUN=true
CONCURRENCY=4
COMMENT=""

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

log() {
    echo -e "${GREEN}[INFO]${NC} $*"
}

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

error() {
    echo -e "${RED}[ERROR]${NC} $*" >&2
}

# Parse arguments
parse_args() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            --jql)
                JQL="$2"
                shift 2
                ;;
            --transition)
                TRANSITION="$2"
                shift 2
                ;;
            --profile)
                PROFILE="$2"
                shift 2
                ;;
            --comment)
                COMMENT="$2"
                shift 2
                ;;
            --concurrency)
                CONCURRENCY="$2"
                shift 2
                ;;
            --execute)
                DRY_RUN=false
                shift
                ;;
            --dry-run)
                DRY_RUN=true
                shift
                ;;
            *)
                error "Unknown option: $1"
                exit 1
                ;;
        esac
    done

    if [ -z "$JQL" ] || [ -z "$TRANSITION" ]; then
        error "Both --jql and --transition are required"
        exit 1
    fi
}

# Preview affected issues
preview_issues() {
    log "Finding issues matching JQL..."
    log "Query: $JQL"

    local issues
    issues=$(atlassian-cli jira issue search \
        --profile "$PROFILE" \
        --jql "$JQL" \
        --output json 2>/dev/null || echo "[]")

    local count
    count=$(echo "$issues" | jq '. | length')

    if [ "$count" -eq 0 ]; then
        warn "No issues found matching criteria"
        return 1
    fi

    log "Found $count issues to transition"

    # Show sample issues
    echo ""
    echo "Sample issues (first 10):"
    echo "$issues" | jq -r '.[:10][] | "  - \(.key): \(.fields.summary) (\(.fields.status.name))"'
    echo ""

    return 0
}

# Execute bulk transition
execute_transition() {
    if [ "$DRY_RUN" = "true" ]; then
        warn "[DRY-RUN] Would transition issues to: $TRANSITION"
        return
    fi

    log "Executing bulk transition to: $TRANSITION"

    local args=(
        "jira" "bulk" "transition"
        "--profile" "$PROFILE"
        "--jql" "$JQL"
        "--transition" "$TRANSITION"
        "--concurrency" "$CONCURRENCY"
    )

    if [ -n "$COMMENT" ]; then
        args+=("--comment" "$COMMENT")
    fi

    atlassian-cli "${args[@]}"

    log "Transition complete"
}

# Main execution
main() {
    parse_args "$@"

    log "Jira Bulk Transition"
    log "Transition: $TRANSITION | Profile: $PROFILE"

    if [ "$DRY_RUN" = "true" ]; then
        warn "DRY-RUN MODE: No changes will be made"
    fi

    if ! preview_issues; then
        exit 0
    fi

    if [ "$DRY_RUN" = "false" ]; then
        warn "This will transition matching issues to: $TRANSITION"
        read -rp "Type 'YES' to confirm: " confirm

        if [ "$confirm" != "YES" ]; then
            log "Transition cancelled"
            exit 0
        fi
    fi

    execute_transition

    log "Bulk transition complete"
}

main "$@"

仕組み

1

引数を解析する。 スクリプトは、JQL クエリ、遷移先のステータス、プロファイル、並列数、任意のコメントをコマンドラインフラグから読み取ります。--jql--transition はどちらも必須です。

2

一致する課題をプレビューする。 jira issue search の呼び出しで、JQL に一致するすべての課題を取得します。最初の 10 件が課題キー、要約、現在のステータスとあわせて表示されるため、クエリが正しいかどうかを確認できます。

3

ドライランによる安全確認。 既定ではスクリプトはドライランモードで動作し、プレビュー後に停止します。実際に遷移させるには --execute を指定します。この場合、YES の入力を求める確認プロンプトが表示されます。

4

一括遷移。 CLI の bulk transition コマンドが、一致したすべての課題を同時に処理します(既定は 4 並列)。レート制限とリトライは自動で処理されます。

5

任意のコメント。 --comment を使うと、遷移させたすべての課題にコメントを追加できます。監査証跡を残したいときや、一括変更のきっかけとなった課題へリンクしたいときに便利です。

関連ランブック

コピーしました