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, runner 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 pada instance kumpulan pekerja Cloud Run. Tutorial ini menunjukkan cara menskalakan kumpulan runner secara otomatis berdasarkan jumlah tugas yang berjalan dan tidak terjadwal.

Tujuan

Dalam tutorial ini, Anda akan:

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut Google Cloud:

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

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

Sebelum memulai

  1. Login keakun Anda. Google Cloud Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  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. Aktifkan Cloud Run, Secret Manager, Parameter Manager, Artifact Registry, dan Cloud Build API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin serviceusage.services.enable. Pelajari cara memberikan peran.

    Aktifkan API

  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 Google Cloud project Anda.
  10. Anda akan dikenai biaya untuk layanan penskalaan Cloud Run berdasarkan frekuensi Anda memicu penskalaan. Untuk mengetahui informasi selengkapnya, perkirakan biaya dengan kalkulator harga.

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 hanya 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 yang dihosting sendiri runner 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.

Membuat token akses

Buat token akses GitHub untuk menambahkan dan menghapus runner 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 GitHub's Settings > Developer Settings > Personal Access Tokens > Tokens (classic).
  3. Klik Generate new token, lalu pilih Generate new token (classic).
  4. Untuk cakupan token, centang kotak repo.
  5. Klik Generate token.
  6. Salin token yang dibuat.

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

Membuat secret untuk token akses Anda menggunakan Secret Manager

Ambil token secret yang Anda buat pada langkah sebelumnya, dan simpan di Secret Manager. Untuk menetapkan 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 GitHub Actions. Kumpulan 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 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 kumpulan pekerja
    • GITHUB_REPO: nama repo 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.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"]

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 GitHub Actions

Instance kumpulan pekerja Anda siap menerima tugas dari GitHub Actions.

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

Jika repo Anda memiliki GitHub Actions, pastikan Anda telah menyelesaikan penyiapan runner yang dihosting sendiri dengan memanggil GitHub Action di repositori Anda.

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

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

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 kumpulan untuk menangani lonjakan pekerjaan yang harus dilakukan.

Setelah Anda men-deploy kumpulan pekerja dengan runner GitHub aktif, konfigurasikan autoscaler 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 meningkatkan skala kumpulan pekerja, dan setelah tugas selesai, tugas tersebut akan menurunkan skala lagi. Tindakan ini tidak akan menskalakan kumpulan di luar jumlah maksimum instance yang Anda konfigurasi, dan akan menskalakan ke nol saat semua tugas yang berjalan telah selesai.

Anda dapat mengadaptasi CREMA berdasarkan workload Anda.

Mengonfigurasi autoscaler

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

  1. Buat parameter di Parameter Manager 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 autoscaler:

    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: ID Google Cloud project
    • WORKER_POOL_NAME: nama kumpulan 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 pekerja 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. Beri akun layanan CREMA Anda peran roles/run.developer di kumpulan pekerja:

    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"
    

    Ganti WORKER_POOL_NAME dengan nama kumpulan pekerja.

  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. Beri akun layanan CREMA Anda peran pengguna akun layanan:

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

Men-deploy layanan untuk menskalakan workload Anda

Untuk men-deploy layanan guna menskalakan kumpulan pekerja Anda, 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 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"

Menguji layanan CREMA Anda

Untuk memverifikasi bahwa layanan penskalaan otomatis Anda berfungsi dengan benar, periksa tab Logs 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

Untuk menghindari biaya tambahan ke Google Cloud akun 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 sudah 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. Di Google Cloud Konsol, buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang Anda ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource tutorial

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

    Untuk menghapus layanan Cloud Run Anda, jalankan perintah berikut:

    gcloud run services delete SERVICE-NAME

    Ganti SERVICE-NAME dengan nama layanan Anda.

    Anda juga dapat menghapus layanan Cloud Run dari Google Cloud konsol.

  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. Hapusresource lain yang dibuat dalam tutorial ini: Google Cloud

Langkah berikutnya