Praktik terbaik untuk mempercepat waktu build

Halaman ini memberikan praktik terbaik untuk mempercepat waktu build Cloud Build.

Membuat container yang lebih ramping

Saat Anda memasukkan aplikasi ke dalam container, file yang tidak diperlukan saat runtime, seperti dependensi waktu build dan file perantara, dapat disertakan secara tidak sengaja dalam image container. File yang tidak diperlukan ini dapat memperbesar ukuran image container serta menambah waktu dan biaya saat image berpindah antara registry image container dan runtime container.

Untuk membantu mengurangi ukuran image container, pisahkan build aplikasi, beserta alat yang digunakan untuk mem-build-nya, dari perakitan container runtime.

Untuk mengetahui informasi selengkapnya, lihat Membuat container yang lebih ramping.

Menggunakan cache Kaniko

Cache Kaniko adalah fitur Cloud Build yang meng-cache artefak build container dengan menyimpan dan mengindeks lapisan perantara dalam registry image container, seperti Container Registry milik Google, tempat lapisan tersebut tersedia untuk digunakan oleh build berikutnya. Untuk mengetahui informasi selengkapnya, lihat Menggunakan cache Kaniko.

Menggunakan image Docker yang di-cache

Cara termudah untuk meningkatkan kecepatan build image Docker Anda adalah dengan menentukan image cache yang dapat digunakan untuk build berikutnya. Anda dapat menentukan image yang di-cache dengan menambahkan argumen --cache-from di file konfigurasi build, yang akan menginstruksikan Docker untuk mem-build menggunakan image tersebut sebagai sumber cache.

Setiap image Docker terdiri dari lapisan yang ditumpuk. Penggunaan --cache-from akan membangun ulang semua lapisan dari lapisan yang diubah hingga akhir build. Oleh karena itu, penggunaan --cache-from tidak akan bermanfaat jika Anda mengubah lapisan dalam tahap awal build Docker.

Sebaiknya selalu gunakan --cache-from untuk build Anda, tetapi perhatikan peringatan berikut:

  • Anda memerlukan image Docker yang telah dibangun sebelumnya untuk disimpan dalam cache.
  • Anda hanya dapat menggunakan --cache-from untuk build Docker; Anda tidak dapat menggunakannya untuk builder yang membuat jenis artefak lainnya.
  • Image yang di-cache harus diambil dari registry, yang dapat menambah waktu yang diperlukan untuk mem-build.

Langkah-langkah berikut menjelaskan cara membangun menggunakan gambar yang di-cache sebelumnya:

YAML

  1. Dalam konfigurasi build Anda, tambahkan petunjuk untuk:

    • Ambil image yang di-cache dari Container Registry. Perhatikan bahwa langkah build docker pull di bawah menetapkan entrypoint ke bash, yang memungkinkan Anda menjalankan perintah dan mengabaikan error yang ditampilkan. Hal ini diperlukan saat Anda membuat gambar untuk pertama kalinya, dan docker pull tidak memiliki gambar yang sudah ada untuk diambil.
    • Tambahkan argumen --cache-from agar dapat menggunakan image tersebut untuk proses build ulang.

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        entrypoint: 'bash'
        args: ['-c', 'docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0']
      - name: 'gcr.io/cloud-builders/docker'
        args: [
                  'build',
                  '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
                  '--cache-from', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
                  '.'
              ]
      images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']
      

      dengan [IMAGE_NAME] adalah nama gambar Anda.

  2. Build image Anda menggunakan konfigurasi build di atas:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Dalam konfigurasi build Anda, tambahkan petunjuk untuk:

    • Ambil image yang di-cache dari Container Registry. Perhatikan bahwa langkah build docker pull di bawah menetapkan entrypoint ke bash, yang memungkinkan Anda menjalankan perintah dan mengabaikan error yang ditampilkan. Hal ini diperlukan saat Anda membuat gambar untuk pertama kalinya, dan docker pull tidak memiliki gambar yang sudah ada untuk diambil.
    • Tambahkan argumen --cache-from agar dapat menggunakan image tersebut untuk proses build ulang.

      {
          "steps": [
          {
              "name": "gcr.io/cloud-builders/docker",
              "entrypoint": "bash",
              "args": ["-c", "docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0"]
          },
          {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                  "build",
                  "-t",
                  "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest",
                  "--cache-from",
                  "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest",
                  "."
              ]
          }
          ],
          "images": ["gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest"]
      }
      

      dengan [IMAGE_NAME] adalah nama gambar Anda.

  2. Build image Anda menggunakan konfigurasi build di atas:

    gcloud builds submit --config cloudbuild.json .
    

Menyimpan cache direktori dengan Google Cloud Storage

Untuk meningkatkan kecepatan build, gunakan kembali hasil dari build sebelumnya. Anda dapat menyalin hasil build sebelumnya ke bucket Google Cloud Storage, menggunakan hasilnya untuk penghitungan yang lebih cepat, lalu menyalin kembali hasil baru ke bucket. Gunakan metode ini saat build membutuhkan waktu yang lama dan menghasilkan file dalam jumlah kecil yang tidak membutuhkan waktu untuk menyalin ke dan dari Google Cloud Storage.

Tidak seperti --cache-from, yang hanya untuk build Docker, penyimpanan dalam cache Google Cloud Storage dapat digunakan untuk builder yang didukung oleh Cloud Build.

Gunakan langkah-langkah berikut untuk meng-cache direktori menggunakan Google Cloud Storage:

YAML

  1. Di file konfigurasi build, tambahkan petunjuk untuk:

    • Salin hasil build sebelumnya dari bucket Google Cloud Storage.
    • Gunakan hasil untuk build saat ini.
    • Salin kembali hasil baru ke dalam bucket.

      steps:
      - name: gcr.io/cloud-builders/gsutil
        args: ['cp', 'gs://mybucket/results.zip', 'previous_results.zip']
      # operations that use previous_results.zip and produce new_results.zip
      - name: gcr.io/cloud-builders/gsutil
        args: ['cp', 'new_results.zip', 'gs://mybucket/results.zip']
      
  2. Build kode Anda menggunakan konfigurasi build di atas:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Di file konfigurasi build, tambahkan petunjuk untuk:

    • Salin hasil build sebelumnya dari bucket Google Cloud Storage.
    • Gunakan hasil untuk build saat ini.
    • Salin kembali hasil baru ke dalam bucket.

      {
          "steps": [
          {
              "name": "gcr.io/cloud-builders/gsutil",
              "args": ["cp", "gs://mybucket/results.zip", "previous_results.zip"]
          },
          {
              // operations that use previous_results.zip and produce new_results.zip
          },
          {
              "name": "gcr.io/cloud-builders/gsutil",
              "args": ["cp", "new_results.zip", "gs://mybucket/results.zip"]
          }
          ]
      }
      
  2. Build kode Anda menggunakan konfigurasi build di atas:

    gcloud builds submit --config cloudbuild.json .
    

Menghindari upload file yang tidak dibutuhkan

Saat build dipicu, direktori kode Anda diupload untuk digunakan oleh Cloud Build.

Anda dapat mengecualikan file yang tidak diperlukan oleh build dengan file .gcloudignore untuk mengoptimalkan waktu upload.

Contoh file yang biasanya dikecualikan meliputi:

  • Dokumentasi dan kode contoh untuk developer proyek
  • Membuat kode scaffolding, biner, file *.jar, atau aset web kompilasi yang digunakan untuk pengembangan.
  • Dependensi pihak ketiga yang divendor untuk pengembangan lokal

Untuk menyiapkan file .gcloudignore guna menangani kasus ini, buat file di root project dengan konten seperti:

.git
dist
node_modules
vendor
*.jar

Mengecualikan kode yang dikompilasi dan dependensi pihak ketiga juga menghasilkan proses build yang lebih konsisten dan mengurangi risiko deployment kode secara tidak sengaja yang masih dalam pengembangan aktif.

Langkah selanjutnya