از افزونه امنیتی Gemini CLI برای بررسی‌های روابط عمومی GitHub استفاده کنید

۱. مقدمه

افزونه امنیتی Gemini CLI یک افزونه متن‌باز Gemini CLI ساخته گوگل است که کد را برای خطرات و آسیب‌پذیری‌های امنیتی تجزیه و تحلیل می‌کند. شما می‌توانید از افزونه امنیتی به همراه Gemini CLI برای شناسایی مشکلات امنیتی به صورت محلی استفاده کنید، همانطور که با هر افزونه Gemini CLI دیگر این کار را انجام می‌دهید. همچنین می‌توانید آن را برای بررسی درخواست‌های Pull در GitHub فراخوانی کنید. در این آزمایشگاه کد، نحوه استفاده از افزونه امنیتی در مخزن GitHub شما را بررسی خواهیم کرد.

کاری که انجام خواهید داد

  • پیکربندی احراز هویت امن از گیت‌هاب به گوگل کلود
  • یک گردش کار GitHub Actions ایجاد کنید که افزونه امنیتی Gemini CLI را فراخوانی کند.
  • با استفاده از GitHub Actions، یک بررسی امنیتی روی یک PR جدید یا موجود اجرا کنید.

آنچه یاد خواهید گرفت

  • نحوه استفاده از Workload Identity Federation برای احراز هویت امن از GitHub Actions به Google Cloud
  • مزایای استفاده از Workload Identity Pool و Workload Identity Provider را نسبت به کلید API Gemini برای احراز هویت بیاموزید.
  • نحوه اجرای بررسی امنیتی با PRها
  • نحوه تفسیر بررسی‌های امنیتی برگردانده شده توسط افزونه امنیتی

آنچه نیاز دارید

  • یک مرورگر وب
  • یک حساب کاربری و مخزن گیت‌هاب
  • یک پروژه ابری گوگل

این آزمایشگاه کد برای توسعه‌دهندگانی طراحی شده است که با گردش کار CI/CD در GitHub آشنا هستند. انتظار نمی‌رود که با Gemini CLI یا افزونه‌های Gemini CLI آشنایی داشته باشید. اگر می‌خواهید نحوه کار افزونه‌ها را بیاموزید، آزمایشگاه کد را بررسی کنید: شروع کار با افزونه‌های Gemini CLI .

در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه افزونه امنیتی Gemini CLI را در مخزن گیت‌هاب خود راه‌اندازی کنید. ما کدی را برای باز کردن یک PR در مخزن خود برای فعال کردن یافتن آسیب‌پذیری امنیتی پیشنهاد نمی‌کنیم.

۲. قبل از شروع

ایجاد یا انتخاب پروژه

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. نحوه تأیید صورتحساب را بیاموزید.
  3. Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود را باز کنید. در بالای کنسول Google Cloud روی Activate Cloud Shell کلیک کنید.

تصویر دکمه فعال کردن Cloud Shell

  1. پس از اتصال به Cloud Shell، با استفاده از دستور زیر، بررسی کنید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است:
gcloud auth list
  1. برای تأیید اینکه دستور gcloud برای استفاده از پروژه شما پیکربندی شده است، دستور زیر را اجرا کنید.
gcloud config list project
  1. اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project ${GOOGLE_CLOUD_PROJECT}

۳. تنظیم احراز هویت از گیت‌هاب به گوگل کلود

چگونه کار می‌کند؟

گردش کار اقدامات گیت‌هاب

فدراسیون هویت بار کاری (Workload Identity Federation ) روش پیشنهادی برای احراز هویت از GitHub Actions به Google Cloud است.

  1. برای هر کار (job) که توسط GitHub Actions workflow اجرا می‌شود ، GitHub به عنوان یک ارائه دهنده هویت خارجی، یک JWT (توکن وب JSON) امضا شده صادر می‌کند. این توکن شامل "claims" هایی مانند repository ، workflow و job_workflow_ref است که به عنوان یک کارت شناسایی دیجیتال برای آن اجرا کننده خاص عمل می‌کنند. در این آزمایش، شما یک گردش کار GitHub Actions با یک job ایجاد خواهید کرد که از اکشن google-github-actions/run-gemini-cli استفاده می‌کند، که یک JWT را از GitHub درخواست کرده و این توکن را به سرویس توکن امنیتی (STS) در Google Cloud ارسال می‌کند.
  2. شما با تنظیم URL صادرکننده به آدرس رسمی سرویس توکن GitHub به آدرس https://token.actions.githubusercontent.com و تعریف "نگاشت‌های ویژگی" خود، که معمولاً شامل نام مخزن و شاخه‌ها می‌شود، یک Workload Identity Pool و یک Provider را در Google Cloud پیکربندی خواهید کرد. Google Cloud STS، JWT را بر اساس قوانین Workload Identity Pool اعتبارسنجی می‌کند. اگر همه چیز، از جمله نگاشت‌های ویژگی، بررسی شود، STS توکن GitHub را با یک Google Cloud Federated Access Token کوتاه مدت مبادله می‌کند.
  3. اکنون اکشن google-github-actions/run-gemini-cli در گردش کار GitHub Actions شما می‌تواند از توکن دسترسی فدرال گوگل کلود (Google Cloud Federated Access Token) که عمر کوتاهی دارد، برای "جعل هویت" یک حساب سرویس متصل به Workload Identity Pool استفاده کند. حساب سرویس متصل باید نقش‌ها و مجوزهای IAM لازم را برای دسترسی به هرگونه منابع و سرویس‌های گوگل کلود داشته باشد.

مزایای استفاده از Workload Identity Federation نسبت به Gemini API Key

می‌توان فراخوانی‌های Gemini CLI را که از GitHub Actions سرچشمه می‌گیرند، با استفاده از کلید API Gemini تأیید اعتبار کرد، که شامل ایجاد یک رمز جدید GitHub Actions با نام GEMINI_API_KEY با مقدار کلید مناسب است. با این حال، این کار به دلایل امنیتی زیر توصیه نمی‌شود:

  • کلیدهای API Gemini می‌توانند مجوزهای گسترده‌ای از اتصالات نقش IAM مربوطه خود داشته باشند. در صورت نفوذ، دسترسی به طیف وسیعی از منابع و خدمات Google Cloud را فراهم می‌کنند. فدراسیون هویت بار کاری از حساب‌های سرویس و توکن‌های دسترسی کوتاه‌مدت استفاده می‌کند که به طور قابل توجهی احراز هویت را محدود می‌کند.
  • مدیریت کلیدهای API Gemini در مقیاس بزرگ نیز چالش برانگیز است. شناسایی اینکه کدام گردش‌های کاری از یک کلید در معرض خطر استفاده می‌کنند، زمان‌بر است. چرخاندن دستی کلیدها نیز زمان‌بر است. از طرف دیگر، می‌توانید به راحتی استخرها و ارائه دهندگان هویت بار کاری مرتبط با مخزن خود را از کنسول ابری جستجو، ویرایش و حذف کنید.
  • با کلیدهای API Gemini، شما همیشه باید دوباره بررسی کنید که آنها را به طور تصادفی در هیچ لاگ دسترسی یا اشکال‌زدایی افشا نکنید. با فدراسیون هویت بار کاری، شما هیچ راز گردش کار GitHub Actions را ذخیره نمی‌کنید، بلکه متغیرهایی را ذخیره می‌کنید که ذاتاً حساسیت کمتری دارند.

پیکربندی GitHub Actions و Google Cloud

  1. در Cloud Shell خود، وارد حساب GitHub خود شوید.
gh auth login
  1. یک فایل جدید setup_workload_identity.sh ایجاد کنید و کد زیر را در آن کپی و جایگذاری کنید.
set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Helper functions
print_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

print_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

print_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

print_error() {
    echo -e "${RED}❌ $1${NC}"
}

print_header() {
    echo -e "${BLUE}🚀 $1${NC}"
}

# Default values
GOOGLE_CLOUD_PROJECT=""
GOOGLE_CLOUD_LOCATION="global"
GITHUB_REPO=""
POOL_NAME=""
PROVIDER_NAME=""

# Show help
show_help() {
    cat << EOF
Universal Direct Workload Identity Federation Setup for GitHub Actions

USAGE:
    $0 --repo OWNER/REPO [OPTIONS]

REQUIRED:
    -r, --repo OWNER/REPO       GitHub repository (e.g., google/my-repo)
    -p, --project GOOGLE_CLOUD_PROJECT    Google Cloud project ID

OPTIONS:
    --pool-name NAME           Custom workload identity pool name (default: auto-generated)
    --provider-name NAME       Custom workload identity provider name (default: auto-generated)
    -h, --help                 Show this help

EXAMPLES:
    # Basic setup for a repository
    $0 --repo google/my-repo --project my-gcp-project

    # Custom pool name
    $0 --repo google/my-repo --project my-gcp-project --pool-name my-pool

    # Custom pool and provider names
    $0 --repo google/my-repo --project my-gcp-project --pool-name my-pool --provider-name my-provider

ABOUT DIRECT WORKLOAD IDENTITY FEDERATION:
    This script sets up Direct Workload Identity Federation (preferred method).
    - No intermediate service accounts required
    - Direct authentication from GitHub Actions to GCP resources
    - Maximum token lifetime of 10 minutes
    - You grant permissions directly to the Workload Identity Pool on GCP resources

EOF
}

# Parse command line arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        -r|--repo)
            GITHUB_REPO="$2"
            shift 2
            ;;
        -p|--project)
            GOOGLE_CLOUD_PROJECT="$2"
            shift 2
            ;;
        --pool-name)
            POOL_NAME="$2"
            shift 2
            ;;
        --provider-name)
            PROVIDER_NAME="$2"
            shift 2
            ;;
        -l|--location)
            GOOGLE_CLOUD_LOCATION="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            print_error "Unknown option: $1"
            echo "Use --help for usage information."
            exit 1
            ;;
    esac
done

# Validate required arguments
if [[ -z "${GITHUB_REPO}" ]]; then
    print_error "Repository is required. Use --repo OWNER/REPO"
    echo ""
    echo "💡 To find your repository name:"
    echo "   1. Go to your GitHub repository"
    echo "   2. The URL shows: https://github.com/OWNER/REPOSITORY"
    echo "   3. Use: OWNER/REPOSITORY (e.g., google/golang)"
    echo ""
    echo "Use --help for usage information."
    exit 1
fi
if [[ -z "${GOOGLE_CLOUD_PROJECT}" ]]; then
    print_error "GCP project is required. Use --project GOOGLE_CLOUD_PROJECT"
    echo ""
    echo "💡 To find your project ID:"
    echo "   1. Go to your Google Cloud console"
    echo "   2. The URL displays: https://console.cloud.google.com/welcome?project=GOOGLE_CLOUD_PROJECT"
    echo ""
    echo "Use --help for usage information."
    exit 1
fi

# Validate repository format
if [[ ! "${GITHUB_REPO}" =~ ^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$ ]]; then
    print_error "Invalid repository format '${GITHUB_REPO}'"
    echo "Expected format: owner/repo (e.g., google/my-repo)"
    exit 1
fi

# Extract repository components
REPO_OWNER=$(echo "${GITHUB_REPO}" | cut -d'/' -f1)

# Generate unique names based on repository
REPO_HASH_INPUT=$(echo -n "${GITHUB_REPO}")
REPO_HASH_SHA=$(echo "${REPO_HASH_INPUT}" | shasum -a 256)
REPO_HASH=$(echo "${REPO_HASH_SHA}" | cut -c1-8)

# Use custom pool name if provided, otherwise generate one
if [[ -z "${POOL_NAME}" ]]; then
    POOL_NAME="github-${REPO_HASH}"
fi

# Use custom provider name if provided, otherwise generate one
if [[ -z "${PROVIDER_NAME}" ]]; then
    PROVIDER_NAME="gh-${REPO_HASH}"
fi

print_header "Starting Direct Workload Identity Federation setup"
echo "📦 Repository: ${GITHUB_REPO}"
echo "☁️ Project: ${GOOGLE_CLOUD_PROJECT}"
echo "🏊 Pool: ${POOL_NAME}"
echo "🆔 Provider: ${PROVIDER_NAME}"
echo ""

# Verify gcloud authentication
print_info "Verifying gcloud authentication..."
GCLOUD_AUTH_LIST_RAW=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
GCLOUD_AUTH_LIST=$(echo "${GCLOUD_AUTH_LIST_RAW}" | head -1)
if [[ -z "${GCLOUD_AUTH_LIST}" ]]; then
    print_error "No active gcloud authentication found"
    echo "Please run: gcloud auth login"
    exit 1
fi

# Test project access
if ! gcloud projects describe "${GOOGLE_CLOUD_PROJECT}" > /dev/null 2>&1; then
    print_error "Cannot access project '${GOOGLE_CLOUD_PROJECT}'"
    echo "Please verify:"
    echo "  1. Project ID is correct"
    echo "  2. You have permissions on this project"
    echo "  3. Project exists and is not deleted"
    exit 1
fi

print_success "Authentication and project access verified"

# Step 1: Enable required APIs
print_header "Step 1: Enabling required Google Cloud APIs"
required_apis=(
    "aiplatform.googleapis.com"
    "cloudaicompanion.googleapis.com"
    "cloudresourcemanager.googleapis.com"
    "cloudtrace.googleapis.com"
    "iam.googleapis.com"
    "iamcredentials.googleapis.com"
    "logging.googleapis.com"
    "monitoring.googleapis.com"
    "sts.googleapis.com"
)
gcloud services enable "${required_apis[@]}" --project="${GOOGLE_CLOUD_PROJECT}"
print_success "APIs enabled successfully."

# Step 2: Create Workload Identity Pool
print_header "Step 2: Creating Workload Identity Pool"

if ! gcloud iam workload-identity-pools describe "${POOL_NAME}" \
    --project="${GOOGLE_CLOUD_PROJECT}" \
    --location="${GOOGLE_CLOUD_LOCATION}" &> /dev/null; then
    print_info "Creating Workload Identity Pool: ${POOL_NAME}"
    gcloud iam workload-identity-pools create "${POOL_NAME}" \
        --project="${GOOGLE_CLOUD_PROJECT}" \
        --location="${GOOGLE_CLOUD_LOCATION}" \
        --display-name="GitHub Actions Pool"
    print_success "Workload Identity Pool created"
else
    print_info "Workload Identity Pool '${POOL_NAME}' exists. Verifying state..."
    # Fetch the current state of the existing pool.
    POOL_STATE=$(gcloud iam workload-identity-pools describe "${POOL_NAME}" \
        --project="${GOOGLE_CLOUD_PROJECT}" \
        --location="${GOOGLE_CLOUD_LOCATION}" \
        --format="value(state)")

    if [[ "${POOL_STATE}" == "ACTIVE" ]]; then
        # Pool exists and is in the correct state.
        print_success "Workload Identity Pool already exists and is ACTIVE."
    else
        if [[ "${POOL_STATE}" == "DELETED" ]]; then
        # Pool exists but is DELETED. Undelete the pool. 
        print_warning "Workload Identity Pool already exists but is in a DELETED state. Running 'undelete'."
        gcloud iam workload-identity-pools undelete "${POOL_NAME}" \
            --project="${GOOGLE_CLOUD_PROJECT}" \
            --location="${GOOGLE_CLOUD_LOCATION}"
        else
        # Pool exists but is in an unexpected state.
        print_error "Pool '${POOL_NAME}' is in an unexpected state: '${POOL_STATE}'. Expected states are: {'ACTIVE', 'DELETED'}. Exiting"
        exit 1

        fi
    fi
fi

# Get the pool ID
WIF_POOL_ID=$(gcloud iam workload-identity-pools describe "${POOL_NAME}" \
    --project="${GOOGLE_CLOUD_PROJECT}" \
    --location="${GOOGLE_CLOUD_LOCATION}" \
    --format="value(name)")

# Step 3: Create Workload Identity Provider
print_header "Step 3: Creating Workload Identity Provider"
ATTRIBUTE_CONDITION="assertion.repository_owner == '${REPO_OWNER}'"

if ! gcloud iam workload-identity-pools providers describe "${PROVIDER_NAME}" \
    --project="${GOOGLE_CLOUD_PROJECT}" \
    --location="${GOOGLE_CLOUD_LOCATION}" \
    --workload-identity-pool="${POOL_NAME}" &> /dev/null; then
    print_info "Creating Workload Identity Provider: ${PROVIDER_NAME}"
    gcloud iam workload-identity-pools providers create-oidc "${PROVIDER_NAME}" \
        --project="${GOOGLE_CLOUD_PROJECT}" \
        --location="${GOOGLE_CLOUD_LOCATION}" \
        --workload-identity-pool="${POOL_NAME}" \
        --display-name="${PROVIDER_NAME}" \
        --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository,attribute.repository_owner=assertion.repository_owner" \
        --attribute-condition="${ATTRIBUTE_CONDITION}" \
        --issuer-uri="https://token.actions.githubusercontent.com"
    print_success "Workload Identity Provider created"
else
    print_info "Workload Identity Provider '${PROVIDER_NAME}' exists. Verifying state..."
    # Fetch the current state of the existing provider.
    PROVIDER_STATE=$(gcloud iam workload-identity-pools providers describe "${PROVIDER_NAME}" \
        --project="${GOOGLE_CLOUD_PROJECT}" \
        --location="${GOOGLE_CLOUD_LOCATION}" \
        --workload-identity-pool="${POOL_NAME}" \
        --format="value(state)")

    if [[ "${PROVIDER_STATE}" == "ACTIVE" ]]; then
        # Provider exists and is in the correct state.
        print_success "Workload Identity Provider already exists and is ACTIVE."
    else
        if [[ "${PROVIDER_STATE}" == "DELETED" ]]; then
        # Provider exists but is DELETED. Undelete the provider. 
        print_warning "Workload Identity Provider already exists but is in a DELETED state. Running 'undelete'."
        gcloud iam workload-identity-pools providers undelete "${PROVIDER_NAME}" \
            --project="${GOOGLE_CLOUD_PROJECT}" \
            --location="${GOOGLE_CLOUD_LOCATION}" \
            --workload-identity-pool="${POOL_NAME}"
        else
        # Provider exists but is in an unexpected state.
        print_error "Provider '${PROVIDER_NAME}' is in an unexpected state: '${PROVIDER_STATE}'. Expected states are: {'ACTIVE', 'DELETED'}. Exiting"
        exit 1

        fi
    fi
fi

# Step 4: Grant required permissions to the Workload Identity Pool
print_header "Step 4: Granting required permissions to Workload Identity Pool"
PRINCIPAL_SET="principalSet://iam.googleapis.com/${WIF_POOL_ID}/attribute.repository/${GITHUB_REPO}"

print_info "Skipped: Granting required permissions directly to the Workload Identity Pool..."

# Step 5: Create and Configure Service Account for Gemini CLI
print_header "Step 5: Create and Configure Service Account for Gemini CLI"
SERVICE_ACCOUNT_NAME="gemini-cli-${REPO_HASH}"
SERVICE_ACCOUNT_EMAIL="${SERVICE_ACCOUNT_NAME}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com"

# Create service account if it doesn't exist
if ! gcloud iam service-accounts describe "${SERVICE_ACCOUNT_EMAIL}" --project="${GOOGLE_CLOUD_PROJECT}" &> /dev/null; then
    print_info "Creating Service Account: ${SERVICE_ACCOUNT_NAME}"
    gcloud iam service-accounts create "${SERVICE_ACCOUNT_NAME}" \
        --project="${GOOGLE_CLOUD_PROJECT}" \
        --display-name="Gemini CLI Service Account"
    print_success "Service Account created: ${SERVICE_ACCOUNT_EMAIL}"
else
    print_success "Service Account already exists: ${SERVICE_ACCOUNT_EMAIL}"
fi

# Grant permissions to the service account on the project
print_info "Granting 'Cloud AI Companion User' role to Service Account..."
gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/cloudaicompanion.user" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --condition=None

# Allow the service account to generate an access tokens
print_info "Granting 'Service Account Token Creator' role to Service Account..."

gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/iam.serviceAccountTokenCreator" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --condition=None

# Grant logging permissions to the service account
print_info "Granting 'Logging Writer' role to Service Account..."
gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/logging.logWriter" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --condition=None

# Grant monitoring permissions to the service account
print_info "Granting 'Monitoring Editor' role to Service Account..."
gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/monitoring.editor" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --condition=None

# Grant tracing permissions to the service account
print_info "Granting 'Cloud Trace Agent' role to Service Account..."
gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/cloudtrace.agent" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --condition=None

# Grant Vertex AI permissions to the service account
print_info "Granting 'Vertex AI User' role to Service Account..."
gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/aiplatform.user" \
    --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --condition=None

# Allow the Workload Identity Pool to impersonate the Service Account
print_info "Allowing GitHub Actions from '${GITHUB_REPO}' to impersonate the Service Account..."
gcloud iam service-accounts add-iam-policy-binding "${SERVICE_ACCOUNT_EMAIL}" \
    --project="${GOOGLE_CLOUD_PROJECT}" \
    --role="roles/iam.workloadIdentityUser" \
    --member="${PRINCIPAL_SET}"

print_success "GitHub Actions can now impersonate ${SERVICE_ACCOUNT_NAME}"

# Get the full provider name for output
WIF_PROVIDER_FULL=$(gcloud iam workload-identity-pools providers describe "${PROVIDER_NAME}" \
    --project="${GOOGLE_CLOUD_PROJECT}" \
    --location="${GOOGLE_CLOUD_LOCATION}" \
    --workload-identity-pool="${POOL_NAME}" \
    --format="value(name)")


# Step 6: Output configuration

print_header "🎉 Setup Complete!"
echo ""
print_success "Direct Workload Identity Federation has been configured for your repository!"
echo ""

print_header "Permissions Granted"
echo ""
print_success "The following permissions have been automatically granted to your repository:"
echo "• roles/logging.logWriter - Write logs to Cloud Logging"
echo "• roles/monitoring.editor - Create and update metrics in Cloud Monitoring"
echo "• roles/cloudtrace.agent - Send traces to Cloud Trace"
echo "• roles/aiplatform.user - Use Vertex AI for model inference"

echo ""
print_success "A Service Account (${SERVICE_ACCOUNT_EMAIL}) was created with the following roles:"
echo "• roles/cloudaicompanion.user - Use Code Assist for model inference"
echo "• roles/iam.serviceAccountTokenCreator"
echo ""


# Check for `gh` CLI and set variables automatically if available
if command -v gh &> /dev/null; then
    print_info "The 'gh' CLI is installed. Setting variables automatically..."

    gh variable set GCP_WIF_PROVIDER --body "${WIF_PROVIDER_FULL}" --repo "${GITHUB_REPO}"
    gh variable set GOOGLE_CLOUD_PROJECT --body "${GOOGLE_CLOUD_PROJECT}" --repo "${GITHUB_REPO}"
    gh variable set GOOGLE_CLOUD_LOCATION --body "${GOOGLE_CLOUD_LOCATION}" --repo "${GITHUB_REPO}"
    gh variable set SERVICE_ACCOUNT_EMAIL --body "${SERVICE_ACCOUNT_EMAIL}" --repo "${GITHUB_REPO}"
    gh variable set GOOGLE_GENAI_USE_VERTEXAI --body "true" --repo "${GITHUB_REPO}"

    print_success "GitHub variables have been set automatically!"
else
    print_warning "The 'gh' CLI was not found. Either install it and rerun this script OR set the below variables manually."
    echo "  For manual setup, go to https://github.com/${GITHUB_REPO}/settings/variables/actions and add the following repository variables:"
    echo ""
    echo "🔑 Variable Name: GCP_WIF_PROVIDER"
    echo "   Variable Value: ${WIF_PROVIDER_FULL}"
    echo ""
    echo "☁️  Variable Name: GOOGLE_CLOUD_PROJECT"
    echo "   Variable Value: ${GOOGLE_CLOUD_PROJECT}"
    echo ""
    echo "☁️ Variable Name: GOOGLE_CLOUD_LOCATION"
    echo "   Variable Value: ${GOOGLE_CLOUD_LOCATION}"
    echo ""
    echo "☁️ Variable Name: SERVICE_ACCOUNT_EMAIL"
    echo "   Variable Value: ${SERVICE_ACCOUNT_EMAIL}"
    echo ""
fi

print_success "Setup completed successfully! 🚀"
  1. اسکریپت را به یک فایل اجرایی تبدیل کنید.
chmod +x setup_workload_identity.sh
  1. اسکریپت را اجرا کنید.
./setup_workload_identity.sh --repo {OWNER/REPO} --project {GOOGLE_CLOUD_PROJECT}

۴. یک گردش کار GitHub Actions ایجاد کنید

  1. مخزن گیت‌هاب متعلق به خودتان را بررسی کنید.
git clone {YOUR_REPO}
cd {YOUR REPO}
  1. با کپی کردن یک اسکریپت yml نمونه از مخزن /gemini-cli-extensions/security ، یک گردش کار GitHub Actions ایجاد کنید که دستور اسلش /security:analyze-github-pr را فراخوانی کند.
git checkout -b workflow
mkdir .github/ && cd .github/
mkdir workflows/ && cd workflows/
curl -L https://raw.githubusercontent.com/gemini-cli-extensions/security/refs/heads/main/.github/workflows/gemini-review.yml -o gemini-review.yml
  1. گردش کار GitHub Actions را به سرور اصلی خود در GitHub منتقل کنید.
git add .github/workflows/gemini-review.yml
git commit -m "add new gha workflow"
git push --set-upstream origin workflow

۵. اجرای گردش کار تحلیل امنیتی روی PR های جدید و موجود

یک PR جدید در مخزن گیت‌هاب خود شروع کنید یا یک نظر جدید با عنوان "@gemini-cli /review" به عنوان مالک یا مشارکت‌کننده مخزن ارسال کنید. این کار یک بررسی امنیتی روی PR آغاز می‌کند. افزونه امنیتی Gemini CLI از گردش کار GitHub Actions که شما به مخزن خود کامیت کرده‌اید، هر مسئله امنیتی را که پیدا کند، بر اساس دسته‌بندی‌های شدت از "بحرانی"، "زیاد"، "متوسط" تا "کم" برچسب‌گذاری می‌کند.

در اینجا مثالی از بررسی امنیتی یک PR جدید و مثالی از بررسی امنیتی یک PR موجود آورده شده است.

۶. کاوش بیشتر

ما شما را تشویق می‌کنیم که فهرست رو به رشدی از دستورات سفارشی با قابلیت‌های امنیتی جدید در افزونه Gemini CLI Security را بررسی کنید و استفاده از آن را در گردش‌های کاری خود شروع کنید. به عنوان مثال:

  • /security:scan-deps وابستگی‌های پروژه شما را با OSV.dev ارجاع متقابل می‌دهد.

برای اطلاع از آخرین ویژگی‌ها و رفع اشکالات ، یادداشت‌های انتشار را نیز بررسی کنید.

۷. تبریک

تبریک می‌گوییم، شما با موفقیت مخزن گیت‌هاب خود را پیکربندی کرده‌اید تا از افزونه امنیتی Gemini CLI برای تجزیه و تحلیل PRها جهت شناسایی خطرات و آسیب‌پذیری‌های امنیتی استفاده کند.