הפעלה והרחבה של GitHub Runners באירוח עצמי במאגרי worker ב-Cloud Run

במדריך הזה נסביר איך להשתמש ב-GitHub runners באירוח עצמי במאגרי עובדים כדי להריץ את תהליכי העבודה שמוגדרים במאגר GitHub, ואיך לשנות את גודל מאגר העובדים באמצעות שינוי אוטומטי של גודל מאגר העובדים על סמך מדדים חיצוניים של Cloud Run (CREMA).

מידע על GitHub runners באירוח עצמי

בתהליך עבודה של GitHub Actions, רצים הם המכונות שמבצעות משימות. לדוגמה, רץ יכול לשכפל את המאגר באופן מקומי, להתקין תוכנת בדיקה ואז להריץ פקודות שמעריכות את הקוד.

אתם יכולים להשתמש בrunners באירוח עצמי כדי להריץ GitHub Actions במופעים של מאגר עובדים ב-Cloud Run. במדריך הזה מוסבר איך להגדיל אוטומטית את מספר הרצים במאגר על סמך מספר המשימות שפועלות ומספר המשימות שלא נקבע להן מועד.

מטרות

במדריך הזה תלמדו:

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. מפעילים את ממשקי ה-API של Cloud Run,‏ Secret Manager,‏ Parameter Manager,‏ Artifact Registry ו-Cloud Build.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    הפעלת ממשקי ה-API

  7. מתקינים ומפעילים את ה-CLI של gcloud.
  8. עדכון רכיבים:
    gcloud components update
  9. מגדירים את משתני ההגדרה הבאים עבור CREMA שמשמשים במדריך הזה:
    PROJECT_ID=PROJECT_ID
    CREMA_SERVICE_ACCOUNT_NAME=crema-service-account@$PROJECT_ID.iam.gserviceaccount.com
    CREMA_REPO_NAME=crema
    AR_REGION=us-central1
    מחליפים את PROJECT_ID במזהה הפרויקט. Google Cloud
  10. החיובים על שירות ההרחבה של Cloud Run מבוססים על התדירות שבה מפעילים את ההרחבה. למידע נוסף, אפשר להשתמש במחשבון התמחור כדי להעריך את העלויות.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

כדי להגדיר את ה-runners באירוח עצמי, צריך הרשאה לערוך את ההגדרות במאגר GitHub. המאגר יכול להיות בבעלות משתמש או בבעלות ארגון.

‫GitHub ממליצה להשתמש ב-runners באירוח עצמי רק עם מאגרים פרטיים.

יצירת חשבון שירות בהתאמה אישית

במדריך הזה נעשה שימוש בחשבון שירות בהתאמה אישית עם ההרשאות המינימליות הנדרשות לשימוש במשאבים שהוקצו. כדי להגדיר את חשבון השירות:

gcloud iam service-accounts create crema-service-account \
  --display-name="CREMA Service Account"

הוספת GitHub runners באירוח עצמי

כדי להוסיף GitHub runners באירוח עצמי, פועלים לפי ההוראות במאמר adding self-hosted runners (הוספת runners באירוח עצמי) במסמכי התיעוד של GitHub.

זיהוי המאגר ב-GitHub

במדריך הזה, המשתנה GITHUB_REPO מייצג את שם המאגר. זה החלק בשם שמופיע אחרי שם הדומיין, גם במאגרי מידע של משתמשים אישיים וגם במאגרי מידע של ארגונים. לדוגמה:

  • אם כתובת ה-URL של הדומיין היא https://github.com/myuser/myrepo, אז GITHUB_REPO הוא myuser/myrepo.
  • אם כתובת ה-URL של הדומיין היא https://github.com/mycompany/ourrepo, אז GITHUB_REPO הוא mycompany/ourrepo.

יצירת טוקן גישה

יוצרים טוקן גישה ל-GitHub כדי להוסיף ולהסיר רצים באופן דינמי באמצעות אינטראקציה עם המאגר שבחרתם. כדי ליצור אסימון גישה ב-GitHub ולשמור אותו ב-Secret Manager, פועלים לפי השלבים הבאים:

  1. מוודאים שאתם מחוברים לחשבון GitHub.
  2. עוברים לדף Settings > Developer Settings > Personal Access Tokens > Tokens (classic) ב-GitHub.
  3. לוחצים על יצירת טוקן חדש ובוחרים באפשרות יצירת טוקן חדש (קלאסי).
  4. בקטע 'היקף האסימון', מסמנים את התיבה repo.
  5. לוחצים על יצירת אסימון.
  6. מעתיקים את הטוקן שנוצר.

מידע נוסף על אסימוני גישה זמין במאמר בנושא דרישות אימות במסמכי GitHub.

יצירת סוד לאסימון הגישה באמצעות Secret Manager

לוקחים את אסימון הסוד שיצרתם בשלב הקודם ומאחסנים אותו ב-Secret Manager. כדי להגדיר הרשאות גישה:

  1. יוצרים את הסוד ב-Secret Manager:

    echo -n "GITHUB_TOKEN" | gcloud secrets create github_runner_token --data-file=-
    

    מחליפים את GITHUB_TOKEN בערך שהעתקתם מ-GitHub.

  2. נותנים לחשבון השירות המותאם אישית roles/secretmanager.secretAccessor הרשאת גישה לסוד החדש שנוצר:

    gcloud secrets add-iam-policy-binding github_runner_token \
      --member "serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
      --role "roles/secretmanager.secretAccessor"
    

פריסת מאגר עובדים

יוצרים מאגר עובדים ב-Cloud Run כדי לעבד פעולות GitHub. המאגר הזה ישתמש בתמונה שמבוססת על התמונה actions/runner שנוצרה על ידי GitHub. כדי לפרוס מאגר עובדים, מבצעים את השלבים הבאים:

  1. משכפלים את המאגר לדוגמה למחשב המקומי כדי לאחזר את דוגמת הקוד לשימוש:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. עוברים לספרייה שמכילה את הקוד לדוגמה של Cloud Run:

    cd cloud-run-samples/github-runner/worker-pool-container
    
  3. פורסים את מאגר העובדים:

    gcloud run worker-pools deploy WORKER_POOL_NAME \
      --region us-central1 \
      --source . \
      --instances 1 \
      --set-env-vars GITHUB_REPO=GITHUB_REPO \
      --set-secrets GITHUB_TOKEN=github_runner_token:latest \
      --service-account $CREMA_SERVICE_ACCOUNT_NAME \
      --memory 2Gi \
      --cpu 4
    

    מחליפים את מה שכתוב בשדות הבאים:

    • WORKER_POOL_NAME: שם מאגר העובדים
    • WORKER_POOL_LOCATION: האזור של מאגר העובדים
    • GITHUB_REPO: שם מאגר GitHub

    אם זו הפעם הראשונה שאתם משתמשים בפריסות ממקורות ב-Cloud Run בפרויקט הזה, Cloud Run יציג לכם בקשה ליצור מאגר ברירת מחדל של Artifact Registry.

הסבר על דוגמת הקוד

מאגר העובדים מוגדר עם קובץ Docker שמבוסס על תמונת actions/runner שנוצרה על ידי GitHub:

FROM ghcr.io/actions/actions-runner:2.332.0

# Add scripts with right permissions.
USER root
# hadolint ignore=DL3045
COPY start.sh start.sh
RUN chmod +x start.sh

# Add start entrypoint with right permissions.
USER runner
ENTRYPOINT ["./start.sh"]

סקריפט העזר הזה פועל כשהקונטיינר מופעל, והוא רושם את עצמו במאגר שהוגדר כמופע זמני, באמצעות טוקן שאתם יוצרים.

# Configure the current runner instance with URL, token and name.
mkdir /home/docker/actions-runner && cd /home/docker/actions-runner
echo "GitHub Repo: ${GITHUB_REPO_URL} for ${RUNNER_PREFIX}-${RUNNER_SUFFIX}"
./config.sh --unattended --url ${GITHUB_REPO_URL} --pat ${GH_TOKEN} --name ${RUNNER_NAME}

# Function to cleanup and remove runner from Github.
cleanup() {
   echo "Removing runner..."
   ./config.sh remove --unattended --pat ${GH_TOKEN}
}

# Trap signals.
trap 'cleanup; exit 130' INT
trap 'cleanup; exit 143' TERM

# Run the runner.
./run.sh & wait $!

שימוש במאגר העובדים כדי לקבל משימות מפעולות GitHub

מופע מאגר העובדים מוכן לקבל משימות מ-GitHub Actions.

אם במאגר שלכם עדיין אין פעולות GitHub, פועלים לפי ההוראות שבמדריך למתחילים ליצירת זרימת העבודה הראשונה.

אם במאגר יש GitHub Actions, כדי לוודא שהשלמתם את ההגדרה של self-hosted runner, מפעילים GitHub Action במאגר.

אם פעולת GitHub לא משתמשת ב-runners באירוח עצמי, משנים את המשימה של פעולת GitHub מהערך runs-on לערך self-hosted.

אחרי שמגדירים פעולה לשימוש ב-runners באירוח עצמי, מריצים את הפעולה.

בממשק של GitHub, מוודאים שהפעולה הושלמה בהצלחה.

פריסת שירות CREMA של התאמה אוטומטית לעומס

פרסתם worker אחד במאגר המקורי, שמאפשר עיבוד של פעולה אחת בכל פעם. בהתאם לשימוש שלכם באינטגרציה רציפה (CI), יכול להיות שתצטרכו להגדיל את מספר המכונות ב-pool כדי לטפל בעומס עבודה.

אחרי שפורסים את מאגר העובדים עם GitHub Runner פעיל, מגדירים את קנה המידה האוטומטי של CREMA כדי להקצות מופעי עובדים על סמך סטטוס המשימה בתור הפעולות.

ההטמעה הזו מקשיבה לאירוע workflow_job. כשיוצרים משימה של תהליך עבודה, המערכת מגדילה את מאגר העובדים, וכשהמשימה מסתיימת, היא מקטינה אותו שוב. המאגר לא יתרחב מעבר למספר המקסימלי של המופעים שהגדרתם, ויתכווץ לאפס כשכל המשימות הפעילות יסתיימו.

אפשר להתאים את CREMA בהתאם לעומסי העבודה שלכם.

הגדרת התכונה לשינוי אוטומטי של גודל הקבוצה

במדריך הזה משתמשים ב-Parameter Manager כדי לאחסן את קובץ התצורה של CREMA בפורמט YAML.

  1. יוצרים פרמטר ב-Parameter Manager כדי לאחסן גרסאות של פרמטרים עבור CREMA:

    PARAMETER_ID=crema-config
    PARAMETER_REGION=global
    gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAML
    
  2. יוצרים קובץ YAML,‏ my-crema-config.yaml, בתיקיית האב כדי להגדיר את התצורה של שינוי הגודל האוטומטי:

    apiVersion: crema/v1
    kind: CremaConfig
    metadata:
      name: gh-demo
    spec:
      pollingInterval: 10
      triggerAuthentications:
        - metadata:
            name: github-trigger-auth
          spec:
            gcpSecretManager:
              secrets:
                - parameter: personalAccessToken
                  id: github_runner_token
                  version: latest
      scaledObjects:
        - spec:
            scaleTargetRef:
              name: projects/PROJECT_ID/locations/us-central1/workerpools/WORKER_POOL_NAME
            triggers:
              - type: github-runner
                name: GITHUB_RUNNER
                metadata:
                  owner: REPOSITORY_OWNER
                  runnerScope: repo
                  repos: REPOSITORY_NAME
                  targetWorkflowQueueLength: 1
                authenticationRef:
                  name: github-trigger-auth
            advanced:
              horizontalPodAutoscalerConfig:
                behavior:
                  scaleDown:
                    stabilizationWindowSeconds: 10
                    policies:
                      - type: Pods
                        value: 100
                        periodSeconds: 10
                  scaleUp:
                    stabilizationWindowSeconds: 10
                    policies:
                      - type: Pods
                        value: 2
                        periodSeconds: 10
    
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט Google Cloud
    • WORKER_POOL_NAME: השם של מאגר העובדים שפרסתם
    • GITHUB_RUNNER: השם של ה-GitHub Runner שהגדרתם
    • REPOSITORY_OWNER: הבעלים של מאגר GitHub
    • REPOSITORY_NAME: השם של מאגר GitHub
  3. מעלים את קובץ ה-YAML המקומי כגרסה חדשה של פרמטר:

    LOCAL_YAML_CONFIG_FILE=my-crema-config.yaml
    PARAMETER_VERSION=1
    
    gcloud parametermanager parameters versions create $PARAMETER_VERSION \
      --location=$PARAMETER_REGION \
      --parameter=$PARAMETER_ID \
      --payload-data-from-file=$LOCAL_YAML_CONFIG_FILE
    

מתן הרשאות נוספות לחשבון שירות מותאם אישית

כדי לשנות את גודל מאגר העובדים שציינתם בהגדרת ה-YAML, צריך להעניק את ההרשאות הבאות בחשבון השירות המותאם אישית:

  1. נותנים לחשבון השירות של CREMA הרשאה לקרוא מ-Parameter Manager:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/parametermanager.parameterViewer"
    
  2. מקצים לחשבון השירות של CREMA את התפקיד roles/run.developer במאגר העובדים:

    WORKER_POOL_NAME=WORKER_POOL_NAME
    WORKER_POOL_REGION=us-central1
    gcloud run worker-pools add-iam-policy-binding $WORKER_POOL_NAME \
      --region=$WORKER_POOL_REGION \
      --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/run.developer"
    

    מחליפים את WORKER_POOL_NAME בשם של מאגר העובדים.

  3. נותנים לחשבון השירות של CREMA הרשאה לכתוב מדדים:

     gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
       --role="roles/monitoring.metricWriter"
    
  4. נותנים לחשבון השירות של CREMA את התפקיד Service Account User:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/iam.serviceAccountUser"
    

פריסת השירות כדי להרחיב את עומסי העבודה

כדי לפרוס את השירות כדי להרחיב את מאגר העובדים, מריצים את הפקודה הבאה עם קובץ אימג' של קונטיינר שנבנה מראש:

SERVICE_NAME=my-crema-service
SERVICE_REGION=us-central1

CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0

gcloud run deploy $SERVICE_NAME \
  --image=${IMAGE} \
  --region=${SERVICE_REGION} \
  --service-account="${CREMA_SERVICE_ACCOUNT_NAME}" \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
  --labels=created-by=crema \
  --set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"

בדיקת שירות CREMA

כדי לוודא ששירות ההתאמה האוטומטית לעומס פועל בצורה תקינה, צריך לבדוק את הכרטיסייה Logs של שירות Cloud Run.

בכל פעם שהמדדים מתעדכנים, יומני השירות צריכים לכלול את הרשומות הבאות:

כל הודעה ביומן מסומנת בתווית של הרכיב שיצר אותה.

[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...

הסרת המשאבים

כדי להימנע מחיובים נוספים בחשבון Google Cloud , מוחקים את כל המשאבים שהצבתם באמצעות המדריך הזה.

מחיקת הפרויקט

אם יצרתם פרויקט חדש בשביל המדריך הזה, מוחקים את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שהוספתם במדריך הזה, תצטרכו למחוק את המשאבים שיצרתם לצורך המדריך.

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבי הדרכה

  1. מוחקים את שירות Cloud Run שפרסתם במדריך הזה. שירותי Cloud Run לא צוברים עלויות עד שהם מקבלים בקשות.

    כדי למחוק את שירות Cloud Run, מריצים את הפקודה הבאה:

    gcloud run services delete SERVICE-NAME

    מחליפים את SERVICE-NAME בשם השירות.

    אפשר גם למחוק שירותים של Cloud Run מGoogle Cloud המסוף.

  2. מסירים את הגדרת ברירת המחדל של האזור gcloud שהוספתם במהלך ההגדרה של המדריך:

     gcloud config unset run/region
    
  3. מסירים את הגדרות הפרויקט:

     gcloud config unset project
    
  4. מחיקת משאבים אחרים Google Cloud שנוצרו במדריך הזה:

המאמרים הבאים