Menggunakan Jenkins untuk build terdistribusi di Compute Engine


Tutorial ini menunjukkan kepada Anda cara:

  • Membuat sistem continuous integration Jenkins untuk menjalankan build menggunakan agen Jenkins on demand di Compute Engine.
  • Menyimpan artefak build di Cloud Storage
  • Menerapkan kebijakan siklus proses untuk memindahkan artefak build lama di Cloud Storage ke opsi penyimpanan yang lebih terjangkau.

Arsitektur

Diagram berikut menguraikan arsitektur tutorial.

Arsitektur yang menunjukkan cara akun layanan mengirim artefak melalui Compute Engine ke Cloud Storage.

Dalam diagram, akun layanan ditambahkan ke Jenkins agar dapat membuat instance agen dan mengirim artefak ke Cloud Storage untuk penyimpanan jangka panjang. Jenkins menyediakan instance dengan cepat ketika menjalankan build. Seiring bertambahnya usia artefak build, artefak build akan berpindah melalui berbagai kelas penyimpanan untuk membatasi biaya retensinya.

Tujuan

  • Membuat image dasar dengan Packer untuk menjalankan build Jenkins Anda.
  • Menyediakan Jenkins menggunakan Cloud Marketplace.
  • Mengonfigurasi Jenkins untuk men-deploy agen build efemeral.
  • Mengupload artefak build ke Cloud Storage.
  • Mengonfigurasi kebijakan siklus proses untuk mengoptimalkan biaya Cloud Storage Anda.

Biaya

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

  • Compute Engine
  • Cloud Storage

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. 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. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the Compute Engine API.

    Enable the API

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Enable the Compute Engine API.

    Enable the API

Menyiapkan lingkungan Anda

Di bagian ini, Anda akan mengonfigurasi infrastruktur dan identitas yang diperlukan untuk menyelesaikan tutorial. Anda dapat menjalankan tutorial selanjutnya dari dalam Cloud Shell.

Buka Cloud Shell

Mengonfigurasi IAM

Buat akun layanan Identity and Access Management (IAM) untuk mendelegasikan izin ke Jenkins. Dengan akun ini, Jenkins dapat menyimpan data di Cloud Storage dan meluncurkan instance di Compute Engine. Jenkins menjalankan build Anda dalam instance efemeral dan menyimpan artefak build di Cloud Storage.

Membuat akun layanan

  1. Buat akun layanan itu sendiri:

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. Simpan alamat email akun layanan dan ID project Google Cloud terkini dalam variabel lingkungan untuk digunakan dalam perintah selanjutnya:

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:jenkins" --format='value(email)')
    export PROJECT=$(gcloud info --format='value(config.project)')
  3. Ikat peran berikut ke akun layanan Anda:

    gcloud projects add-iam-policy-binding $PROJECT \
        --role roles/storage.admin --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.instanceAdmin.v1 \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.networkAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.securityAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/iam.serviceAccountActor \
        --member serviceAccount:$SA_EMAIL

Mendownload kunci akun layanan

Setelah memberikan izin yang sesuai untuk akun layanan, Anda harus membuat dan mendownload kuncinya. Simpan kunci di tempat yang aman. Anda akan menggunakannya di langkah berikutnya saat mengonfigurasi plugin JClouds untuk melakukan autentikasi dengan Compute Engine API.

  1. Buat file kunci:

    gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
  2. Di Cloud Shell, klik Lainnya , lalu klik Download file.

  3. Ketik jenkins-sa.json.

  4. Klik Download untuk menyimpan file di perangkat.

Membuat image agen Jenkins

Selanjutnya, Anda membuat image Compute Engine yang dapat digunakan kembali, yang berisi software dan alat yang diperlukan untuk dijalankan sebagai eksekutor Jenkins.

Membuat kunci SSH untuk Cloud Shell

Nantinya dalam tutorial ini, Anda menggunakan Packer untuk mem-build image, yang memerlukan perintah ssh untuk berkomunikasi dengan instance build Anda. Untuk mengaktifkan akses SSH, buat dan upload kunci SSH di Cloud Shell:

  1. Buat pasangan kunci SSH. Jika sudah ada, perintah ini menggunakan pasangan kunci tersebut; jika tidak, metode ini akan membuat kode baru:

    ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
  2. Tambahkan kunci SSH publik Cloud Shell ke metadata project Anda:

    gcloud compute project-info describe \
        --format=json | jq -r '.commonInstanceMetadata.items[] | select(.key == "ssh-keys") | .value' > sshKeys.pub
    echo "$USER:$(cat ~/.ssh/id_rsa.pub)" >> sshKeys.pub
    gcloud compute project-info add-metadata --metadata-from-file ssh-keys=sshKeys.pub

Membuat gambar dasar pengukuran

Langkah berikutnya adalah menggunakan Packer untuk membuat image virtual machine (VM) dasar pengukuran bagi agen build Anda, yang berfungsi sebagai efemeral build eksekutor di Jenkins. Agen Jenkins paling dasar hanya memerlukan Java untuk diinstal. Anda dapat menyesuaikan gambar dengan menambahkan perintah shell di bagian provisioners dalam konfigurasi Packer atau dengan menambahkan penyedia Packer lainnya.

  1. Di Cloud Shell, download dan ekstrak rilis Packer terbaru. Contoh berikut menggunakan Packer 1.7.10. Anda dapat memeriksa situs Hashicorp untuk melihat apakah ada versi yang lebih baru:

    wget https://releases.hashicorp.com/packer/1.7.10/packer_1.7.10_linux_amd64.zip
    unzip packer_1.7.10_linux_amd64.zip
  2. Buat file konfigurasi untuk build image Packer Anda:

    export PROJECT=$(gcloud info --format='value(config.project)')
    cat > jenkins-agent.json <<EOF
    {
      "builders": [
        {
          "type": "googlecompute",
          "project_id": "$PROJECT",
          "source_image_family": "ubuntu-2004-lts",
          "source_image_project_id": "ubuntu-os-cloud",
          "zone": "us-central1-a",
          "disk_size": "50",
          "image_name": "jenkins-agent-{{timestamp}}",
          "image_family": "jenkins-agent",
          "ssh_username": "ubuntu"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": ["sudo apt-get update && sudo apt-get install -y default-jdk"]
        }
      ]
    }
    EOF
    
  3. Buat image dengan menjalankan Packer:

    ./packer build jenkins-agent.json

    Setelah build selesai, nama disk image akan ditampilkan dengan format jenkins-agent-[TIMESTAMP], tempat [TIMESTAMP] yang merupakan epoch waktu saat build dimulai.

    ==> Builds finished. The artifacts of successful builds are:
    --> googlecompute: A disk image was created: jenkins-agent-1612997575
    

Menginstal Jenkins

Di bagian ini, Anda menggunakan Cloud Marketplace untuk menyediakan instance Jenkins. Anda dapat menyesuaikan instance ini untuk menggunakan image agen yang Anda buat di bagian sebelumnya.

  1. Buka solusi Cloud Marketplace untuk Jenkins.

  2. Klik Launch.

  3. Ubah kolom Machine Type menjadi 4 vCPUs 15 GB Memory, n1-standard-4.

    Pemilihan jenis mesin untuk deployment Jenkins.

  4. Klik Deploy dan tunggu hingga instance Jenkins Anda selesai disediakan. Setelah selesai, Anda akan melihat:

    Jenkins telah di-deploy.

  5. Buka instance Jenkins di browser dengan mengklik link Site Address.

  6. Login ke Jenkins menggunakan Admin user dan Admin password yang ditampilkan di panel detail.

    Panel detail dengan kredensial dan detail deployment lainnya.

Instance Jenkins Anda sekarang siap digunakan.

Mengonfigurasi plugin Jenkins

Jenkins mengharuskan plugin untuk membuat agen on demand di Compute Engine dan untuk menyimpan artefak di Cloud Storage. Anda perlu menginstal dan mengonfigurasi plugin ini.

Menginstal plugin

  1. Pada UI Jenkins, pilih Manage Jenkins.
  2. Klik Manage Plugins.
  3. Klik tab Available.
  4. Gunakan panel Filter untuk menemukan plugin berikut dan pilih kotak di sampingnya:

    • Plugin Compute Engine
    • Plugin Cloud Storage

    Gambar berikut menunjukkan plugin Cloud Storage yang dipilih:

    Plugin Cloud Storage.

  5. Klik Download sekarang dan instal setelah mulai ulang.

  6. Klik kotak centang Restart Jenkins saat penginstalan selesai dan tidak ada tugas yang sedang berjalan. Jenkins memulai ulang dan menyelesaikan penginstalan plugin.

Membuat kredensial plugin

Anda harus membuat Google Credentials untuk plugin baru:

  1. Login ke Jenkins lagi, lalu klik Manage Jenkins.
  2. Klik Kedensial.
  3. Klik Jenkins pada Store.
  4. Di panel utama UI, klik Global credentials (unrestricted).
  5. Buat kredensial Google:

    1. Klik Add Credentials.
    2. Setel Kind ke Akun Layanan Google dari kunci pribadi.
    3. Di kolom Project Name, masukkan ID project Google Cloud Anda.
    4. Klik Choose File.
    5. Pilih file jenkins-sa.json yang sebelumnya Anda download dari Cloud Shell.
    6. Klik OK.

      Kredensial kunci JSON.

  6. Klik Jenkins.

Mengonfigurasi plugin Compute Engine

Konfigurasikan plugin Compute Engine dengan kredensial yang digunakan untuk menyediakan instance agen Anda.

  1. Klik Manage Jenkins.
  2. Klik Manage Nodes and Clouds.
  3. Klik Configure Clouds.
  4. Klik Add a new Cloud.
  5. Klik Compute Engine.
  6. Tetapkan setelan berikut dan ganti [YOUR_PROJECT_ID] dengan ID project Google Cloud Anda:

    • Nama: gce
    • ID Project: [YOUR_PROJECT_ID]
    • Batas Instance: 8
  7. Pilih akun layanan dari menu drop-down Kredensial Akun Layanan. Akun tersebut tercantum sebagai ID project Google Cloud Anda.

Mengonfigurasi konfigurasi instance Jenkins

Setelah plugin Compute Engine dikonfigurasi, Anda dapat mengonfigurasi konfigurasi instance Jenkins untuk berbagai konfigurasi build yang Anda inginkan.

  1. Di halaman Configure Clouds, klik Tambahkan untuk Konfigurasi Instance.
  2. Masukkan setelan Umum berikut:

    • Nama: ubuntu-2004
    • Deskripsi: Ubuntu agent
    • Label: ubuntu-2004
  3. Masukkan informasi berikut untuk setelan Lokasi:

    • Region<: us-central1
    • Zone: us-central1-f
  4. Klik Lanjutan.

  5. Untuk Machine Configuration, pilih Machine Type dari n1-standard-1.

  6. Pada bagian Networking, pilih setelan berikut:

    • Network: Biarkan dalam setelan default.
    • Subnetwork: Biarkan dalam setelan default.
    • Pilih Lampirkan IP Eksternal?.
  7. Pilih opsi berikut untuk setelan Boot Disk:

    • Untuk Image project, pilih project Google Cloud Anda.
    • Untuk Image name, pilih image yang telah Anda buat sebelumnya menggunakan Packer.
  8. Klik Save untuk mempertahankan perubahan konfigurasi Anda.

    Konfigurasi Compute Engine untuk Jenkins.

Membuat tugas Jenkins untuk menguji konfigurasi

Jenkins dikonfigurasi untuk meluncurkan instance secara otomatis saat tugas yang dipicu memerlukan agen dengan label ubuntu-2004. Buat tugas yang menguji apakah konfigurasi berfungsi seperti yang diharapkan.

  1. Klik Create new job di antarmuka Jenkins.
  2. Masukkan test sebagai nama item.
  3. Klik Freestyle project, lalu klik OK.
  4. Centang kotak Execute concurrent build jika diperlukan dan Batasi tempat project dapat berjalan.
  5. Di kolom Label Expression, masukkan ubuntu-2004.
  6. Di bagian Build, klik Add build step.
  7. Klik Execute Shell.
  8. Di kotak perintah, masukkan string pengujian:

    echo "Hello world!"

    Halo Dunia mengetik di command box untuk Jenkins.

  9. Klik Save.

  10. Klik Build Now untuk memulai build.

    Build Now

Mengupload artefak build ke Cloud Storage

Anda mungkin ingin menyimpan artefak build untuk analisis atau pengujian di masa mendatang. Konfigurasi tugas Jenkins Anda untuk membuat artefak dan menguploadnya ke Cloud Storage. Log build diupload ke bucket yang sama.

  1. Di Cloud Shell, buat bucket penyimpanan untuk artefak Anda:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-jenkins-artifacts
  2. Pada daftar tugas di UI Jenkins, klik test.

  3. Klik Konfigurasikan.

  4. Di bagian Build, tetapkan kolom teks Perintah ke:

    env > build_environment.txt
  5. Di bagian Post-build Actions, klik Add post-build action.

  6. Klik Plugin Cloud Storage.

  7. Di kolom Storage Location, masukkan jalur artefak, dengan mengganti ID project Google Cloud Anda dengan [YOUR_PROJECT_ID]:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
  8. Klik Add Operation.

  9. Klik Classic Upload.

  10. Di kolom File Pattern, masukkan build_environment.txt.

  11. Di kolom Storage Location, masukkan jalur penyimpanan, dengan mengganti ID project Google Cloud Anda dengan [YOUR_PROJECT_ID]:

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER

    Tindakan pasca-build untuk plugin Cloud Storage.

  12. Klik Save.

  13. Klik Build Now untuk memulai build baru. Build ini berjalan pada instance Compute Engine yang Anda sediakan sebelumnya. Setelah selesai, build akan mengupload file artefak, build_environment.txt, ke bucket Cloud Storage yang dikonfigurasi.

  14. Di Cloud Shell, lihat artefak build menggunakan gsutil:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil cat gs://$PROJECT-jenkins-artifacts/test/2/build_environment.txt

Mengonfigurasi Object Lifecycle Management

Anda akan lebih cenderung mengakses artefak build terbaru. Untuk menghemat biaya pada objek yang jarang diakses, gunakan object lifecycle management untuk memindahkan artefak dari performa kelas penyimpanan yang lebih tinggi ke kelas penyimpanan berbiaya lebih rendah dan berlatensi lebih tinggi.

  1. Di Cloud Shell, buat konfigurasi siklus proses untuk mentransisi semua objek ke Nearline storage setelah 30 hari dan objek Nearline ke Coldline storage setelah 365 hari.

    cat > artifact-lifecycle.json <<EOF
    {
    "lifecycle": {
      "rule": [
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "NEARLINE"
        },
        "condition": {
          "age": 30,
          "matchesStorageClass": ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
        }
      },
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "COLDLINE"
        },
        "condition": {
          "age": 365,
          "matchesStorageClass": ["NEARLINE"]
        }
      }
    ]
    }
    }
    EOF
  2. Upload file konfigurasi ke bucket penyimpanan artefak Anda:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil lifecycle set artifact-lifecycle.json gs://$PROJECT-jenkins-artifacts

Pembersihan

  1. Hapus agen Jenkins yang masih berjalan:

    gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
  2. Menggunakan Cloud Deployment Manager, hapus instance Jenkins:

    gcloud deployment-manager deployments delete jenkins-1
  3. Hapus bucket Cloud Storage:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
  4. Hapus akun layanan:

    export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:jenkins" --format='value(email)')
    gcloud iam service-accounts delete $SA_EMAIL

Langkah selanjutnya