GitHub PR incelemeleri için Gemini CLI Security Extension'ı kullanma

1. Giriş

Gemini CLI Security Extension, Google tarafından geliştirilen ve kodu güvenlik riskleri ile güvenlik açıkları açısından analiz eden bir açık kaynaklı Gemini CLI uzantısıdır. Güvenlik sorunlarını yerel olarak belirlemek için Gemini CLI ile Güvenlik uzantısını diğer Gemini CLI uzantılarında olduğu gibi kullanabilirsiniz. GitHub'daki çekme isteklerini incelemek için de kullanabilirsiniz. Bu codelab'de, GitHub deponuzda güvenlik uzantısını nasıl kullanacağınızı ele alacağız.

Yapacaklarınız

  • GitHub'dan Google Cloud'a güvenli kimlik doğrulamayı yapılandırma
  • Gemini CLI Security Extension'ı çağıran bir GitHub Actions iş akışı oluşturun
  • GitHub Actions'ı kullanarak yeni veya mevcut bir çekme isteğinde güvenlik incelemesi çalıştırma

Neler öğreneceksiniz?

  • GitHub Actions'tan Google Cloud'a güvenli kimlik doğrulama için Workload Identity federasyonunu kullanma
  • Kimlik doğrulama için Gemini API anahtarı yerine Workload Identity havuzu ve Workload Identity sağlayıcı kullanmanın avantajları hakkında bilgi edinin.
  • PR'lerle güvenlik incelemesi yapma
  • Güvenlik uzantısı tarafından döndürülen güvenlik incelemelerini yorumlama

Gerekenler

  • Web tarayıcısı
  • GitHub hesabı ve deposu
  • Google Cloud projesi

Bu codelab, GitHub'daki CI/CD iş akışına aşina olan geliştiriciler için tasarlanmıştır. Gemini CLI veya Gemini CLI uzantılarını bilmeniz beklenmez. Uzantıların nasıl çalıştığını öğrenmek istiyorsanız Getting Started with Gemini CLI Extensions (Gemini CLI Uzantılarını Kullanmaya Başlama) adlı codelab'e göz atın.

Bu codelab'de, GitHub deponuzda Gemini CLI Security Extension'ı nasıl ayarlayacağınızı öğreneceksiniz. Güvenlik açığı bulgusunu tetiklemek için deponuzda PR açmanızı önermeyiz.

2. Başlamadan önce

Proje oluşturun veya seçin

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Faturalandırmayı nasıl doğrulayacağınızı öğrenin.
  3. Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i açın. Google Cloud Console'un üst kısmından Cloud Shell'i etkinleştir'i tıklayın.

Cloud Shell'i etkinleştir düğmesinin resmi

  1. Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını kontrol edin:
gcloud auth list
  1. gcloud komutunun projenizi kullanacak şekilde yapılandırıldığını doğrulamak için aşağıdaki komutu çalıştırın.
gcloud config list project
  1. Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project ${GOOGLE_CLOUD_PROJECT}

3. GitHub'dan Google Cloud'a kimlik doğrulama ayarlama

İşleyiş şekli

GitHub Actions iş akışı

GitHub Actions'tan Google Cloud'da kimlik doğrulaması yapmak için Workload Identity Federation kullanılması önerilir.

  1. Harici bir kimlik sağlayıcı olarak GitHub, her GitHub Actions iş akışı çalıştırma işi için imzalı bir JWT (JSON Web Jetonu) yayınlar. Bu jeton, söz konusu koşucu için dijital kimlik kartı görevi gören repository, workflow ve job_workflow_ref gibi "talepler" içerir. Bu laboratuvarda, google-github-actions/run-gemini-cli işlemini kullanan bir iş içeren GitHub Actions iş akışı oluşturacaksınız. Bu iş akışı, GitHub'dan bir JWT isteyecek ve bu jetonu Google Cloud'daki Güvenlik Jetonu Hizmeti'ne (STS) gönderecek.
  2. Google Cloud'da bir Workload Identity Pool ve bir Sağlayıcı yapılandıracaksınız. Bunu yapmak için veren URL'sini resmi GitHub jetonu hizmeti URL'si https://token.actions.githubusercontent.com olarak ayarlayın ve genellikle depo ve dal adlarını içeren "Özellik Eşlemelerinizi" tanımlayın. Google Cloud STS, JWT'yi Workload Identity Pool kurallarına göre doğrular. Özellik eşlemeleri de dahil olmak üzere her şey doğruysa STS, GitHub jetonunu kısa ömürlü bir Google Cloud Federated Access Token ile değiştirir.
  3. Artık GitHub Actions iş akışınızdaki google-github-actions/run-gemini-cli işlemi, Workload Identity havuzuna bağlı bir hizmet hesabının kimliğine bürünmek için kısa ömürlü Google Cloud Federated Access Token'ı kullanabilir. Bağlı hizmet hesabının, Google Cloud kaynaklarına ve hizmetlerine erişmek için gerekli IAM rollerine ve izinlerine sahip olması gerekir.

Gemini API anahtarı yerine Workload Identity federasyonunu kullanmanın avantajları

GitHub Actions'dan başlatılan Gemini CLI çağrılarını, uygun anahtar değerine sahip GEMINI_API_KEY adlı yeni bir GitHub Actions sırrı oluşturarak Gemini API anahtarıyla kimlik doğrulamak mümkündür. Ancak bu durum, aşağıdaki güvenlik nedenleriyle önerilmez:

  • Gemini API anahtarları, ilgili IAM rol bağlamalarından geniş izinlere sahip olabilir. Bu hesaplar saldırıya uğradığında çok çeşitli Google Cloud kaynaklarına ve hizmetlerine erişim sağlanır. Workload Identity Federation, hizmet hesaplarını ve kısa ömürlü erişim jetonlarını kullanarak kimlik doğrulama sürecini önemli ölçüde sıkılaştırır.
  • Gemini API anahtarlarının büyük ölçekte yönetilmesi de zordur. Hangi iş akışlarının açığa çıkarılmış bir anahtar kullandığını belirlemek zaman alır. Anahtarları manuel olarak döndürmek de zaman alır. Diğer yandan, Cloud Console'dan deponuzla ilişkili Workload Identity havuzlarını ve sağlayıcılarını kolayca arayabilir, düzenleyebilir ve silebilirsiniz.
  • Gemini API anahtarlarını kullanırken, bunları herhangi bir erişim veya hata ayıklama günlüğünde yanlışlıkla kullanıma sunmadığınızı her zaman iki kez kontrol etmeniz gerekir. İş Yükü Kimliği Federasyonu ile GitHub Actions iş akışlarının sırlarını değil, doğası gereği daha az hassas olan değişkenleri depolarsınız.

GitHub Actions ve Google Cloud'u yapılandırma

  1. Cloud Shell'inizde GitHub hesabınıza giriş yapın.
gh auth login
  1. Yeni bir dosya oluşturun setup_workload_identity.sh ve aşağıdaki kodu kopyalayıp dosyaya yapıştırın.
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. Komut dosyasını yürütülebilir hale getirin.
chmod +x setup_workload_identity.sh
  1. Komut dosyasını çalıştırın.
./setup_workload_identity.sh --repo {OWNER/REPO} --project {GOOGLE_CLOUD_PROJECT}

4. GitHub Actions iş akışı oluşturma

  1. Sahibi olduğunuz bir GitHub deposunu inceleyin.
git clone {YOUR_REPO}
cd {YOUR REPO}
  1. /gemini-cli-extensions/security deposundan bir örnek iş akışı yml komut dosyasını kopyalayarak /security:analyze-github-pr eğik çizgi komutunu çağıran bir GitHub Actions iş akışı oluşturun.
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 iş akışını GitHub'daki uzak kaynağınıza gönderin.
git add .github/workflows/gemini-review.yml
git commit -m "add new gha workflow"
git push --set-upstream origin workflow

5. Yeni ve mevcut çekme isteklerinde güvenlik analizi iş akışını çalıştırma

GitHub deponuzda yeni bir PR başlatın veya depo sahibi ya da katkıda bulunan olarak "@gemini-cli /review" yorumunu gönderin. Bu işlem, çekme isteğiyle ilgili güvenlik incelemesini başlatır. Deponuza gönderdiğiniz GitHub Actions iş akışındaki Gemini CLI Güvenlik Uzantısı, bulduğu güvenlik sorunlarını "Kritik", "Yüksek", "Orta" ve "Düşük" önem derecesine göre etiketler.

Yeni bir PR'deki güvenlik incelemesi örneği ve mevcut bir PR'deki güvenlik incelemesi örneği aşağıda verilmiştir.

6. Daha fazla keşif

Gemini KSA Güvenlik uzantısındaki yeni güvenlik özelliklerini içeren ve giderek büyüyen özel komut listesini incelemenizi ve iş akışlarınızda kullanmaya başlamanızı öneririz. Örneğin:

  • /security:scan-deps projenizin bağımlılıklarını OSV.dev ile çapraz referanslandırır.

En yeni özellikler ve hata düzeltmeleri için sürüm notlarına da göz atın.

7. Tebrikler

Tebrikler, GitHub deponuzu Gemini CLI Security Extension'ı kullanarak güvenlik riskleri ve güvenlik açıkları için çekme isteklerini analiz edecek şekilde başarıyla yapılandırdınız.