Menjalankan dan menskalakan runner GitHub yang dihosting sendiri di pool worker Cloud Run

Tutorial ini menunjukkan cara menggunakan runner GitHub yang dihosting sendiri di kumpulan pekerja untuk menjalankan alur kerja yang ditentukan di repositori GitHub Anda, dan menskalakan kumpulan pekerja Anda dengan Penskalaan Otomatis Metrik Eksternal Cloud Run (CREMA).

Tentang runner GitHub yang dihosting sendiri

Dalam alur kerja GitHub Actions, runner adalah mesin yang menjalankan tugas. Misalnya, pelari dapat meng-clone repositori Anda secara lokal, menginstal software pengujian, lalu menjalankan perintah yang mengevaluasi kode Anda.

Anda dapat menggunakan runner yang dihosting sendiri untuk menjalankan GitHub Actions di instance kumpulan pekerja Cloud Run. Tutorial ini menunjukkan cara menskalakan kumpulan pelari secara otomatis berdasarkan jumlah tugas yang sedang berjalan dan yang belum dijadwalkan.

Tujuan

Dalam tutorial ini, Anda akan:

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih sebagai berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  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. Enable the Cloud Run, Secret Manager, Parameter Manager, Artifact Registry, and Cloud Build APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  7. Instal dan lakukan inisialisasi gcloud CLI.
  8. Perbarui komponen:
    gcloud components update
  9. Tetapkan variabel konfigurasi berikut untuk CREMA yang digunakan dalam tutorial ini:
    PROJECT_ID=PROJECT_ID
    CREMA_SERVICE_ACCOUNT_NAME=crema-service-account@$PROJECT_ID.iam.gserviceaccount.com
    CREMA_REPO_NAME=crema
    AR_REGION=us-central1
    Ganti PROJECT_ID dengan ID project Google Cloud Anda.
  10. Anda akan dikenai biaya untuk layanan penskalaan Cloud Run berdasarkan seberapa sering Anda memicu penskalaan. Untuk mengetahui informasi selengkapnya, perkirakan biaya dengan kalkulator harga.
  11. Peran yang diperlukan

    Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:

    Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

    Anda memerlukan izin untuk mengedit setelan di repositori GitHub guna mengonfigurasi runner yang dihosting sendiri. Repositori dapat dimiliki pengguna, atau repositori yang dimiliki organisasi.

    GitHub merekomendasikan penggunaan runner yang dihosting sendiri dengan repositori pribadi saja.

    Membuat akun layanan kustom

    Tutorial ini menggunakan akun layanan kustom dengan izin minimum yang diperlukan untuk menggunakan resource yang disediakan. Untuk menyiapkan akun layanan, lakukan hal berikut:

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

Menambahkan runner GitHub yang dihosting sendiri

Untuk menambahkan runner GitHub yang dihosting sendiri, ikuti petunjuk dalam menambahkan runner yang dihosting sendiri di dokumentasi GitHub.

Mengidentifikasi repositori GitHub

Dalam tutorial ini, variabel GITHUB_REPO mewakili nama repositori. Ini adalah bagian nama yang Anda temukan setelah nama domain untuk repositori pengguna pribadi dan repositori organisasi. Contoh:

  • Jika URL domain Anda adalah https://github.com/myuser/myrepo, GITHUB_REPO adalah myuser/myrepo.
  • Jika URL domain Anda adalah https://github.com/mycompany/ourrepo, GITHUB_REPO adalah mycompany/ourrepo.

Buat token akses

Buat token akses GitHub untuk menambahkan dan menghapus pelari secara dinamis dengan berinteraksi dengan repositori yang Anda pilih. Untuk membuat token akses di GitHub dan menyimpannya di Secret Manager, ikuti langkah-langkah berikut:

  1. Pastikan Anda login ke akun GitHub Anda.
  2. Buka halaman Settings > Developer Settings > Personal Access Tokens > Tokens (classic) GitHub.
  3. Klik Buat token baru, lalu pilih Buat token baru (klasik).
  4. Untuk cakupan token, centang kotak repo.
  5. Klik Generate token.
  6. Salin token yang dihasilkan.

Untuk mengetahui informasi selengkapnya tentang token akses, lihat Persyaratan autentikasi dalam dokumentasi GitHub.

Buat secret untuk token akses Anda menggunakan Secret Manager

Ambil token rahasia yang Anda buat di langkah sebelumnya, lalu simpan di Secret Manager. Untuk menyetel izin akses, ikuti langkah-langkah berikut:

  1. Buat secret di Secret Manager:

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

    Ganti GITHUB_TOKEN dengan nilai yang Anda salin dari GitHub.

  2. Beri roles/secretmanager.secretAccessor ke akun layanan kustom Anda untuk mengakses secret yang baru dibuat:

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

Men-deploy kumpulan pekerja

Buat kumpulan pekerja Cloud Run untuk memproses tindakan GitHub. Pool ini akan menggunakan image berdasarkan image actions/runner yang dibuat GitHub. Untuk men-deploy kumpulan pekerja, ikuti langkah-langkah berikut:

  1. Clone repositori contoh ke komputer lokal Anda untuk mengambil contoh kode yang akan digunakan:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Ubah ke direktori yang memuat kode contoh Cloud Run:

    cd cloud-run-samples/github-runner/worker-pool-container
    
  3. Deploy kumpulan pekerja:

    gcloud beta 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
    

    Ganti kode berikut:

    • WORKER_POOL_NAME: nama kumpulan pekerja
    • WORKER_POOL_LOCATION: region worker pool
    • GITHUB_REPO: nama repositori GitHub

    Jika ini adalah pertama kalinya Anda menggunakan deployment sumber Cloud Run di project ini, Cloud Run akan meminta Anda untuk membuat repositori Artifact Registry default.

Memahami contoh kode

Kumpulan pekerja dikonfigurasi dengan Dockerfile yang didasarkan pada image actions/runner yang dibuat GitHub:

FROM ghcr.io/actions/actions-runner:2.330.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"]

Skrip helper ini berjalan saat container dimulai, mendaftarkan dirinya ke repositori yang dikonfigurasi sebagai instance sementara, menggunakan token yang Anda buat.

# 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 $!

Menggunakan kumpulan pekerja untuk menerima tugas dari tindakan GitHub

Instance kumpulan pekerja Anda siap menerima tugas dari GitHub Actions.

Jika repo Anda belum memiliki tindakan GitHub, ikuti petunjuk di panduan memulai untuk membuat alur kerja pertama Anda.

Jika repo Anda memiliki tindakan GitHub, verifikasi bahwa Anda telah menyelesaikan penyiapan runner yang dihosting sendiri dengan memanggil tindakan GitHub di repositori Anda.

Jika tindakan GitHub Anda tidak menggunakan runner yang dihosting sendiri, ubah tugas tindakan GitHub Anda dari nilai runs-on menjadi self-hosted.

Setelah mengonfigurasi tindakan untuk menggunakan runner yang dihosting sendiri, jalankan tindakan.

Konfirmasi bahwa tindakan berhasil diselesaikan di antarmuka GitHub.

Men-deploy layanan CREMA autoscaler

Anda men-deploy satu pekerja di kumpulan asli, yang memungkinkan pemrosesan satu tindakan dalam satu waktu. Bergantung pada penggunaan Continuous Integration (CI), Anda mungkin perlu menskalakan pool untuk menangani lonjakan pekerjaan yang harus dilakukan.

Setelah men-deploy kumpulan pekerja dengan peluncur GitHub yang aktif, konfigurasi penskalaan otomatis CREMA untuk menyediakan instance pekerja berdasarkan status tugas dalam antrean tindakan.

Implementasi ini memproses peristiwa workflow_job. Saat Anda membuat tugas alur kerja, tugas tersebut akan menskalakan kumpulan pekerja, dan setelah tugas selesai, tugas tersebut akan menskalakannya kembali. Penskalaan tidak akan melampaui jumlah maksimum instance yang Anda konfigurasi, dan akan diskalakan ke nol saat semua tugas yang sedang berjalan telah selesai.

Anda dapat menyesuaikan CREMA berdasarkan workload Anda.

Mengonfigurasi penskala otomatis

Tutorial ini menggunakan Parameter Manager untuk menyimpan file konfigurasi YAML untuk CREMA.

  1. Buat parameter di Pengelola Parameter untuk menyimpan versi parameter untuk CREMA:

    PARAMETER_ID=crema-config
    PARAMETER_REGION=global
    gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAML
    
  2. Buat file YAML, my-crema-config.yaml di direktori induk untuk menentukan konfigurasi penskala otomatis:

    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
    
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud project ID
    • WORKER_POOL_NAME: nama pool pekerja yang Anda deploy
    • GITHUB_RUNNER: nama runner GitHub yang Anda konfigurasi
    • REPOSITORY_OWNER: pemilik repositori GitHub
    • REPOSITORY_NAME: nama repositori GitHub
  3. Upload file YAML lokal Anda sebagai versi parameter baru:

    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
    

Memberikan izin tambahan ke akun layanan kustom Anda

Untuk menskalakan kumpulan worker yang Anda tentukan dalam konfigurasi YAML, berikan izin berikut pada akun layanan kustom:

  1. Beri akun layanan CREMA Anda izin untuk membaca dari Parameter Manager:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/parametermanager.parameterViewer"
    
  2. Berikan peran roles/run.developer kepada akun layanan CREMA Anda di kumpulan pekerja:

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

    Ganti WORKER_POOL_NAME dengan nama kumpulan worker.

  3. Beri akun layanan CREMA Anda izin untuk menulis metrik:

     gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \
       --role="roles/monitoring.metricWriter"
    
  4. Berikan peran pengguna akun layanan kepada akun layanan CREMA Anda:

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

Men-deploy layanan untuk menskalakan beban kerja Anda

Untuk men-deploy layanan guna menskalakan kumpulan pekerja, jalankan perintah berikut dengan image container yang telah dibuat sebelumnya:

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 beta 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-22/runtimes/java21 \
  --labels=created-by=crema \
  --set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"

Buat nilai rahasia webhook

Untuk membuat nilai rahasia guna mengakses webhook GitHub, lakukan hal berikut:

  1. Buat secret Secret Manager untuk mengelola akses ke webhook GitHub Anda.

    echo -n "WEBHOOK_SECRET" | gcloud secrets create github_webhook_secret --data-file=-
    

    Ganti WEBHOOK_SECRET dengan nilai string arbitrer.

  2. Berikan akses ke secret untuk akun layanan penskala otomatis:

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

Membuat webhook GitHub

Untuk membuat webhook GitHub, ikuti langkah-langkah berikut:

  1. Pastikan Anda login ke akun GitHub Anda.
  2. Buka repositori GitHub Anda.
  3. Klik Setelan.
  4. Di bagian Code and automation, klik Webhooks.
  5. Klik Tambahkan webhook.
  6. Masukkan:

    1. Di Payload URL, masukkan URL layanan CREMA Cloud Run yang Anda deploy, my-crema-service.
    2. Untuk Jenis konten, pilih application/json.
    3. Untuk Secret, masukkan nilai WEBHOOK_SECRET yang Anda buat sebelumnya.
    4. Untuk SSL verification, pilih Enable SSL verification.
    5. Untuk Peristiwa mana yang ingin Anda gunakan untuk memicu webhook ini?, pilih Izinkan saya memilih setiap peristiwa.
    6. Dalam pemilihan peristiwa, pilih Tugas alur kerja. Batalkan pilihan opsi lainnya.
    7. Klik Tambahkan webhook.

Menguji layanan CREMA Anda

Untuk memverifikasi bahwa layanan penskalaan otomatis Anda berfungsi dengan benar, periksa tab Log layanan Cloud Run.

Anda akan melihat log berikut di log layanan Anda setiap kali metrik diperbarui:

Setiap pesan log diberi label dengan komponen yang memancarkannya.

[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 ...

Pembersihan

Agar tidak menimbulkan biaya tambahan pada akun Google Cloud Anda, hapus semua resource yang Anda deploy dengan tutorial ini.

Menghapus project

Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan perlu mempertahankannya tanpa perubahan yang Anda tambahkan dalam tutorial ini, hapus resource yang Anda buat untuk tutorial.

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus resource tutorial

  1. Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini. Layanan Cloud Run tidak menimbulkan biaya hingga menerima permintaan.

    Untuk menghapus layanan Cloud Run, jalankan perintah berikut:

    gcloud run services delete SERVICE-NAME

    Ganti SERVICE-NAME dengan nama layanan Anda.

    Anda juga dapat menghapus layanan Cloud Run dari konsolGoogle Cloud .

  2. Hapus konfigurasi region default gcloud yang Anda tambahkan selama penyiapan tutorial:

     gcloud config unset run/region
    
  3. Hapus konfigurasi project:

     gcloud config unset project
    
  4. Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:

Langkah berikutnya