1. Giới thiệu
Tiện ích bảo mật Gemini CLI là một tiện ích Gemini CLI mã nguồn mở do Google xây dựng, có chức năng phân tích mã để tìm ra các rủi ro và lỗ hổng bảo mật. Bạn có thể dùng tiện ích Bảo mật với Gemini CLI để xác định các vấn đề bảo mật cục bộ, giống như khi dùng bất kỳ tiện ích Gemini CLI nào khác. Bạn cũng có thể gọi công cụ này để xem xét Yêu cầu hợp nhất trên GitHub. Trong lớp học lập trình này, chúng ta sẽ tìm hiểu cách sử dụng tiện ích Security trong kho lưu trữ GitHub.
Bạn sẽ thực hiện
- Định cấu hình quy trình xác thực an toàn từ GitHub đến Google Cloud
- Tạo quy trình GitHub Actions gọi Tiện ích bảo mật Gemini CLI
- Chạy quy trình đánh giá bảo mật trên một PR mới hoặc hiện có bằng cách sử dụng GitHub Actions
Kiến thức bạn sẽ học được
- Cách sử dụng Workload Identity Federation để xác thực an toàn từ GitHub Actions đến Google Cloud
- Tìm hiểu lợi ích của việc sử dụng Workload Identity Pool và Workload Identity Provider thay vì Gemini API để xác thực
- Cách chạy quy trình đánh giá bảo mật bằng PR
- Cách diễn giải các kết quả đánh giá bảo mật do tiện ích Bảo mật trả về
Bạn cần có
- Trình duyệt web
- Tài khoản và kho lưu trữ trên GitHub
- Một dự án trên Google Cloud
Lớp học lập trình này dành cho những nhà phát triển đã quen với quy trình CI/CD trên GitHub. Bạn không cần phải quen thuộc với Gemini CLI hoặc các tiện ích Gemini CLI. Nếu bạn muốn tìm hiểu cách hoạt động của tiện ích, hãy xem lớp học lập trình: Bắt đầu sử dụng tiện ích Gemini CLI.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách thiết lập Tiện ích bảo mật Gemini CLI trong kho lưu trữ GitHub. Chúng tôi sẽ không đề xuất mã để bạn mở một yêu cầu kéo đối với kho lưu trữ của mình nhằm kích hoạt việc tìm thấy lỗ hổng bảo mật.
2. Trước khi bắt đầu
Tạo hoặc chọn một dự án
- Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên đám mây.
- Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên đám mây của bạn. Tìm hiểu cách xác minh thông tin thanh toán.
- Mở Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud. Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Cloud của Google.

- Sau khi kết nối với Cloud Shell, hãy kiểm tra để đảm bảo bạn đã xác thực và dự án được đặt thành mã dự án của bạn bằng lệnh sau:
gcloud auth list
- Chạy lệnh sau để xác nhận rằng lệnh
gcloudđược định cấu hình để sử dụng dự án của bạn.
gcloud config list project
- Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project ${GOOGLE_CLOUD_PROJECT}
3. Thiết lập quy trình xác thực từ GitHub đến Google Cloud
Cách hoạt động

Workload Identity Federation là cách được đề xuất để xác thực từ GitHub Actions đến Google Cloud.
- Đối với mỗi quy trình chạy công việc của GitHub Actions, GitHub với tư cách là một Nhà cung cấp danh tính bên ngoài sẽ phát hành một JWT (Mã thông báo web JSON) đã ký. Mã thông báo này chứa "claims" (quyền sở hữu) như
repository,workflowvàjob_workflow_ref, đóng vai trò là thẻ căn cước kỹ thuật số cho người chạy cụ thể đó. Trong lớp học này, bạn sẽ tạo một quy trình GitHub Actions có một công việc sử dụng thao tácgoogle-github-actions/run-gemini-cli. Thao tác này sẽ yêu cầu một JWT từ GitHub và gửi mã thông báo này đến Dịch vụ mã thông báo bảo mật (STS) trong Google Cloud. - Bạn sẽ định cấu hình một Workload Identity Pool và một Provider trong Google Cloud bằng cách đặt URL của tổ chức phát hành thành URL chính thức của dịch vụ mã thông báo GitHub
https://token.actions.githubusercontent.comvà xác định "Attribute Mappings" (Ánh xạ thuộc tính), thường bao gồm tên kho lưu trữ và tên nhánh. STS của Google Cloud xác thực JWT dựa trên các quy tắc của Nhóm Workload Identity. Nếu mọi thứ đều ổn, bao gồm cả việc ánh xạ thuộc tính, thì STS sẽ trao đổi mã thông báo GitHub để lấy Mã truy cập liên kết của Google Cloud có thời hạn ngắn. - Giờ đây, thao tác
google-github-actions/run-gemini-clitrong quy trình GitHub Actions có thể sử dụng Mã truy cập liên kết Google Cloud có thời hạn ngắn để "mạo danh" một Tài khoản dịch vụ được kết nối với Workload Identity Pool. Tài khoản dịch vụ được kết nối cần có các vai trò và quyền IAM cần thiết để truy cập vào mọi tài nguyên và dịch vụ trên Google Cloud.
Lợi ích của việc sử dụng Workload Identity Federation thay vì Khoá Gemini API
Bạn có thể xác thực các lệnh gọi Gemini CLI bắt nguồn từ GitHub Actions bằng Khoá API Gemini. Việc này bao gồm việc tạo một bí mật mới của GitHub Actions có tên là GEMINI_API_KEY với giá trị khoá thích hợp. Tuy nhiên, bạn không nên làm như vậy vì những lý do bảo mật sau đây:
- Khoá API Gemini có thể có các quyền rộng rãi từ các liên kết vai trò IAM tương ứng. Khi bị xâm nhập, các khoá này sẽ mở ra quyền truy cập vào nhiều tài nguyên và dịch vụ của Google Cloud. Workload Identity Federation sử dụng tài khoản dịch vụ và mã truy cập ngắn hạn, giúp tăng cường đáng kể khả năng xác thực.
- Việc quản lý khoá Gemini API ở quy mô lớn cũng là một thách thức. Việc xác định quy trình nào đang sử dụng khoá được hiển thị sẽ mất thời gian. Việc xoay khoá theo cách thủ công cũng mất thời gian. Mặt khác, bạn có thể dễ dàng tra cứu, chỉnh sửa và xoá các nhóm Workload Identity và nhà cung cấp được liên kết với kho lưu trữ của mình trên Cloud Console.
- Với khoá Gemini API, bạn phải luôn kiểm tra kỹ để đảm bảo rằng bạn không vô tình để lộ khoá này trong bất kỳ nhật ký truy cập hoặc nhật ký gỡ lỗi nào. Với Workload Identity Federation, bạn không lưu trữ bất kỳ khoá bí mật nào của quy trình công việc GitHub Actions mà chỉ lưu trữ các biến. Các biến này vốn ít nhạy cảm hơn.
Định cấu hình GitHub Actions và Google Cloud
- Trong Cloud Shell, hãy đăng nhập vào tài khoản GitHub của bạn.
gh auth login
- Tạo một tệp mới
setup_workload_identity.shrồi sao chép và dán đoạn mã dưới đây vào đó.
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! 🚀"
- Biến tập lệnh thành một tệp thực thi.
chmod +x setup_workload_identity.sh
- Chạy tập lệnh.
./setup_workload_identity.sh --repo {OWNER/REPO} --project {GOOGLE_CLOUD_PROJECT}
4. Tạo quy trình công việc GitHub Actions
- Kiểm tra một kho lưu trữ GitHub mà bạn sở hữu.
git clone {YOUR_REPO}
cd {YOUR REPO}
- Tạo một quy trình GitHub Actions gọi lệnh dấu gạch chéo
/security:analyze-github-prbằng cách sao chép một tập lệnh quy trìnhymlmẫu từ kho lưu trữ/gemini-cli-extensions/security.
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
- Đẩy quy trình GitHub Actions lên nguồn từ xa của bạn trên GitHub.
git add .github/workflows/gemini-review.yml
git commit -m "add new gha workflow"
git push --set-upstream origin workflow
5. Chạy quy trình phân tích bảo mật trên các PR mới và hiện có
Bắt đầu một PR mới trong kho lưu trữ GitHub của bạn hoặc đăng một bình luận mới "@gemini-cli /review" với tư cách là chủ sở hữu hoặc người đóng góp của kho lưu trữ. Thao tác này sẽ bắt đầu quy trình đánh giá bảo mật trên PR. Tiện ích bảo mật Gemini CLI trong quy trình GitHub Actions mà bạn đã cam kết với kho lưu trữ sẽ gắn thẻ mọi vấn đề bảo mật mà tiện ích này tìm thấy theo các danh mục mức độ nghiêm trọng từ "Rất nghiêm trọng", "Nghiêm trọng", "Trung bình" đến "Thấp".
Sau đây là một ví dụ về quy trình đánh giá bảo mật đối với một PR mới và một ví dụ về quy trình đánh giá bảo mật đối với một PR hiện có.
6. Khám phá thêm
Bạn nên khám phá danh sách ngày càng mở rộng các lệnh tuỳ chỉnh có các chức năng bảo mật mới trong tiện ích Bảo mật của Gemini CLI và bắt đầu sử dụng tiện ích này trong quy trình làm việc của mình. Ví dụ:
/security:scan-depstham chiếu chéo các phần phụ thuộc của dự án với OSV.dev.
Hãy xem ghi chú phát hành để biết các tính năng mới nhất và bản sửa lỗi.
7. Xin chúc mừng
Xin chúc mừng! Bạn đã định cấu hình thành công kho lưu trữ GitHub để sử dụng Tiện ích bảo mật Gemini CLI nhằm phân tích các yêu cầu kéo để tìm rủi ro và lỗ hổng bảo mật.