빌드 속도 향상을 위한 권장사항

이 페이지에서는 Cloud Build 빌드의 속도를 높이는 모범 사례를 확인할 수 있습니다.

간소화된 컨테이너 빌드

애플리케이션을 컨테이너화할 때 런타임에 필요하지 않은 파일(예: 빌드타임 종속 항목 및 중간 파일)이 실수로 컨테이너 이미지에 포함될 수 있습니다. 이렇게 불필요한 파일 때문에 컨테이너 이미지 크기가 커지고, 이미지가 컨테이너 이미지 레지스트리와 컨테이너 런타임 사이를 이동할 때 시간과 비용이 추가로 발생할 수 있습니다.

컨테이너 이미지 크기를 줄이려면 애플리케이션 빌드 단계를 애플리케이션을 빌드하는 데 사용하는 도구와 함께 런타임 컨테이너 어셈블리 단계에서 분리해야 합니다.

자세한 내용은 간소화된 컨테이너 빌드를 참조하세요.

캐시된 Docker 이미지 사용

Docker 이미지의 빌드 속도를 높이는 가장 쉬운 방법은 후속 빌드에 사용할 수 있는 캐시된 이미지를 지정하는 것입니다. 빌드 구성 파일에 --cache-from 인수를 추가하여 캐시된 이미지를 지정할 수 있습니다. 그러면 Docker가 해당 이미지를 캐시 소스로 사용하여 빌드합니다.

각 Docker 이미지는 누적 레이어로 구성됩니다. --cache-from을 사용하면 변경된 레이어의 모든 레이어가 빌드가 끝날 때까지 다시 빌드됩니다. 따라서 Docker 빌드의 초기 단계에서 레이어를 변경하는 경우 --cache-from을 사용하면 효과적이지 않습니다.

빌드에 항상 --cache-from을 사용하는 것이 좋지만 다음과 같은 주의사항에 유의해야 합니다.

  • 캐시 소스로 사용할 이전에 빌드된 Docker 이미지가 필요합니다.
  • --cache-from은 Docker 빌드에만 사용할 수 있으며, 다른 종류의 아티팩트를 만드는 빌더에는 사용할 수 없습니다.
  • 캐시된 이미지는 레지스트리에서 검색해야 하므로 빌드하는 데 걸리는 시간이 늘어날 수 있습니다.

다음 단계에서는 이전에 캐시된 이미지를 사용하여 빌드하는 방법을 설명합니다.

YAML

  1. 빌드 구성에 다음에 대한 지침을 추가합니다.

    • 캐시된 이미지를 Container Registry에서 가져옵니다. 아래의 docker pull 빌드 단계는 entrypointbash로 설정하므로 사용자는 명령어를 실행하고 반환된 오류를 무시할 수 있습니다. 이 단계는 이미지를 처음으로 빌드할 때와 docker pull이 가져올 이미지가 없을 때 반드시 수행해야 합니다.
    • 해당 이미지를 사용하여 다시 빌드하려면 --cache-from 인수를 추가합니다.

      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']
      

      여기서 [IMAGE_NAME]은 이미지의 이름입니다.

  2. 위의 빌드 구성을 사용하여 이미지를 빌드합니다.

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 빌드 구성에 다음에 대한 지침을 추가합니다.

    • 캐시된 이미지를 Container Registry에서 가져옵니다. 아래의 docker pull 빌드 단계는 entrypointbash로 설정하므로 사용자는 명령어를 실행하고 반환된 오류를 무시할 수 있습니다. 이 단계는 이미지를 처음으로 빌드할 때와 docker pull이 가져올 이미지가 없을 때 반드시 수행해야 합니다.
    • 해당 이미지를 사용하여 다시 빌드하려면 --cache-from 인수를 추가합니다.

      {
          "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"]
      }
      

      여기서 [IMAGE_NAME]은 이미지의 이름입니다.

  2. 위의 빌드 구성을 사용하여 이미지를 빌드합니다.

    gcloud builds submit --config cloudbuild.json .
    

Google Cloud Storage를 사용한 디렉토리 캐싱

빌드 속도를 높이려면 이전 빌드의 결과를 다시 사용하세요. 이전 빌드의 결과를 Google Cloud Storage 버킷에 복사하고 결과를 사용하여 더 빠른 계산을 수행한 다음 새 결과를 버킷에 다시 복사할 수 있습니다. 빌드에 시간이 오래 걸리지만 생성되는 파일 수가 적어 Google Cloud Storage 안팎으로 해당 파일을 복사하는 데 시간이 걸리지 않는 경우에 이 방법을 사용하세요.

Docker 빌드에만 사용할 수 있는 --cache-from과 달리 Google Cloud Storage 캐싱은 Cloud Build에서 지원하는 모든 빌더에 사용할 수 있습니다.

Google Cloud Storage를 사용하여 디렉터리를 캐싱하려면 다음 단계를 따르세요.

YAML

  1. 빌드 구성 파일에 다음에 대한 지침을 추가합니다.

    • Google Cloud Storage 버킷에서 이전 빌드의 결과를 복사합니다.
    • 해당 결과를 현재 빌드에 사용합니다.
    • 새 결과를 버킷에 다시 복사합니다.

      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. 위의 빌드 구성을 사용하여 코드를 빌드합니다.

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 빌드 구성 파일에 다음에 대한 지침을 추가합니다.

    • Google Cloud Storage 버킷에서 이전 빌드의 결과를 복사합니다.
    • 해당 결과를 현재 빌드에 사용합니다.
    • 새 결과를 버킷에 다시 복사합니다.

      {
          "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. 위의 빌드 구성을 사용하여 코드를 빌드합니다.

    gcloud builds submit --config cloudbuild.json .
    

불필요한 파일 업로드 방지

빌드를 트리거하면 코드 디렉터리는 Cloud Build가 사용할 수 있도록 업로드됩니다.

.gcloudignore 파일을 사용하여 빌드에 필요 없는 파일을 제외하면 업로드 시간을 최적화할 수 있습니다.

자주 제외되는 파일은 다음과 같습니다.

  • 프로젝트 개발자용 문서와 샘플 코드
  • 생성된 스캐폴딩 코드, 바이너리, *.jar 파일 또는 개발에 사용한 컴파일된 웹 애셋
  • 벤더링된 로컬 개발용 타사 종속 항목

이를 위해 .gcloudignore 파일을 준비하려면 다음과 같은 내용으로 프로젝트 루트에서 파일을 생성해야 합니다.

.git
dist
node_modules
vendor
*.jar

컴파일한 코드와 타사 종속 항목을 제외하면 빌드 프로세스의 일관성을 개선하고 개발 중인 코드를 실수로 배포하는 위험을 줄일 수도 있습니다.

다음 단계