Praktik terbaik untuk mempercepat build

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

Membuat container yang lebih ramping

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

Untuk membantu mengurangi ukuran image container, pisahkan pembangunan aplikasi, beserta alat yang digunakan untuk membangunnya, dari perakitan container runtime.

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

Menggunakan image Docker yang di-cache

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

Setiap image Docker terdiri dari lapisan bertumpuk. Menggunakan --cache-from akan membangun ulang semua lapisan dari lapisan yang diubah hingga akhir build; oleh karena itu, penggunaan --cache-from tidak bermanfaat jika Anda mengubah lapisan di tahap awal build Docker.

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

  • Anda memerlukan image Docker yang dibuat sebelumnya untuk di-cache.
  • Anda hanya dapat menggunakan --cache-from untuk build Docker; Anda tidak dapat menggunakannya untuk pembangun yang membuat jenis artefak lain.
  • Gambar yang di-cache harus diambil dari registry, yang dapat menambah waktu yang diperlukan untuk membangun.

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

YAML

  1. Di konfigurasi build, tambahkan petunjuk untuk:

    • Tarik image yang di-cache dari Artifact Registry. Langkah build docker pull menetapkan entrypoint ke bash, yang memungkinkan Anda menjalankan perintah dan mengabaikan error yang ditampilkan. Konfigurasi ini diperlukan saat Anda membuat image untuk pertama kalinya, dan docker pull tidak memiliki image yang ada untuk ditarik.
    • Tambahkan argumen --cache-from untuk menggunakan gambar tersebut saat membangun ulang.

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        entrypoint: 'bash'
        args: ['-c', 'docker pull ${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest || exit 0']
      - name: 'gcr.io/cloud-builders/docker'
        args: [
                  'build',
                  '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest',
                  '--cache-from', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest'
                  '.'
              ]
      images: ['${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest']
      
  2. Bangun image Anda menggunakan konfigurasi build sebelumnya:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Di konfigurasi build, tambahkan petunjuk untuk:

    • Tarik image yang di-cache dari Artifact Registry. Langkah build docker pull menetapkan entrypoint ke bash, yang memungkinkan Anda menjalankan perintah dan mengabaikan error yang ditampilkan. Konfigurasi ini diperlukan saat Anda membuat image untuk pertama kalinya, dan docker pull tidak memiliki image yang ada untuk ditarik.
    • Tambahkan argumen --cache-from untuk menggunakan gambar tersebut saat membangun ulang.
    {
        "steps": [
        {
            "name": "gcr.io/cloud-builders/docker",
            "entrypoint": "bash",
            "args": ["-c", "docker pull ${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest || exit 0"]
        },
        {
            "name": "gcr.io/cloud-builders/docker",
            "args": [
                "build",
                "-t",
                "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest",
                "--cache-from",
                "${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest",
                "."
            ]
        }
        ],
        "images": ["${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}:latest"]
    }
    
    where [IMAGE] is the name of your image.
    
  2. Bangun image Anda menggunakan konfigurasi build sebelumnya:

    gcloud builds submit --config cloudbuild.json .
    

Meng-cache direktori dengan Google Cloud Storage

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

Tidak seperti --cache-from, yang hanya untuk build Docker, caching Cloud Storage dapat digunakan untuk builder apa pun yang didukung oleh Cloud Build.

Gunakan langkah-langkah berikut untuk menyimpan direktori dalam cache menggunakan Cloud Storage:

YAML

  1. Dalam file konfigurasi build, tambahkan petunjuk untuk:

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

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

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Dalam file konfigurasi build, tambahkan petunjuk untuk:

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

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

    gcloud builds submit --config cloudbuild.json .
    

Menghindari upload file yang tidak perlu

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 contoh kode untuk developer project
  • Kode scaffolding, biner, file *.jar, atau aset web yang dikompilasi yang dihasilkan dan digunakan untuk pengembangan.
  • Dependensi pihak ketiga milik vendor untuk pengembangan lokal

Untuk menyiapkan file .gcloudignore guna menangani kasus ini, buat file di root project Anda 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 yang tidak disengaja yang masih dalam pengembangan aktif.

Langkah berikutnya