아티팩트 빌드, 테스트, 배포

이 페이지에서는 Cloud Build의 공식 빌더 이미지를 사용하여 소스 코드 및 종속 항목을 가져오도록 빌드 구성을 작성하고, 아티팩트를 빌드, 테스트, 배포하는 방법을 설명합니다.

이미 빌드 구성 파일이 있고 Cloud Build에서 빌드를 실행하려면 수동으로 빌드 시작빌드 자동화를 읽어보세요.

시작하기 전에

종속 항목 가져오기

docker, git, npm, gsutil과 같은 도구를 실행하는 빌드 단계를 사용하여 소스 코드를 가져오거나 종속 항목을 설치합니다.

docker

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['pull', 'gcr.io/$PROJECT_ID/latest-image']

git

steps:
- name: 'gcr.io/cloud-builders/git'
  args: ['clone', 'https://github.com/GoogleCloudPlatform/cloud-builders']

npm

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']

gsutil

steps:
- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://mybucket/remotefile.zip', 'localfile.zip']

컨테이너 이미지 빌드

Docker 컨테이너 이미지를 빌드하려면 docker 명령어를 호출할 수 있는 빌드 단계를 사용합니다. 이 빌드 단계에 전달된 인수는 docker에 바로 전달되므로 이 빌드 단계에서 모든 docker 명령어를 실행할 수 있습니다.

빌드 구성 파일에 다음에 대한 안내를 추가합니다.

  • docker 빌더를 호출하고 Docker build 명령어를 호출하는 인수를 전달합니다. 다음 빌드 구성에서는 Docker 빌드 단계를 두 번 호출하여 두 이미지를 빌드합니다. 이 이미지의 소스 코드 파일은 .으로 표시하는 빌드 시 현재 작업 디렉터리에 있습니다. gcr.io/my-project/image2의 소스 코드는 빌드 시 현재 작업 디렉터리 내부의 디렉터리, 즉 subdirectory에 있습니다.
  • images 필드를 추가하여 생성된 이미지를 Container Registry에 푸시합니다.

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/image1', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/image2', '.']
  dir: 'subdirectory'
images: ['gcr.io/my-project/image1', 'gcr.io/my-project/image2']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": ["build", "-t", "gcr.io/my-project/image1", "."]
    },
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": ["build", "-t", "gcr.io/my-project/image2", "."],
      "dir": "subdirectory"
    }
  ],
  "images": ["gcr.io/my-project/image1", "gcr.io/my-project/image2"]
}

컨테이너가 아닌 아티팩트 빌드

Cloud Build는 빌드를 실행하는 데 사용할 수 있는 공통 언어와 도구에 지원되는 빌드 단계를 제공합니다.

컨테이너가 아닌 아티팩트를 빌드하려면 maven, gradle, go, bazel과 같은 빌더를 실행하는 빌드 단계 섹션을 추가하세요.

maven

steps:
- name: 'gcr.io/cloud-builders/mvn'
  args: ['install']
- name: 'gcr.io/cloud-builders/mvn'
  args: ['package']

gradle

steps:
- name: 'gcr.io/cloud-builders/gradle'
  args: ['build']

go

steps:
- name: 'gcr.io/cloud-builders/go'
  args: ['build', 'my-package']

bazel

steps:
- name: 'gcr.io/cloud-builders/bazel'
  args: ['build', '//path/to:target']

단위 테스트 및 통합 테스트 실행

소스 코드를 사용할 수 있는 경우 단위 테스트 및 통합 테스트를 빌드 단계로 실행할 수 있습니다. 각 빌드 단계는 cloudbuild라는 로컬 Docker 네트워크에 연결된 컨테이너를 사용하여 실행됩니다. 통합 테스트가 작동하려면 네트워크 이름을 지정해야 합니다.

단위 테스트, Docker 이미지를 빌드하는 Dockerfile, 실행 중인 이미지에 대해 실행되는 통합 테스트를 사용하는 JavaScript 애플리케이션이 있다고 가정해 보세요.

이 애플리케이션에 대한 단위 테스트 및 통합 테스트를 실행하려면 빌드 구성 파일에서 다음 작업을 수행하는 방법에 대한 지침을 추가하세요.

  • 빌드 실행에 필요한 종속 항목 설치
  • 단위 테스트 실행
  • 애플리케이션의 Docker 이미지 빌드
  • Docker compose를 사용하여 백그라운드에서 애플리케이션 및 종속 항목 실행
  • 실행 중인 Docker compose 스택에 대한 통합 테스트 실행
  • 새로 빌드한 이미지를 Container Registry에 푸시

    steps:
    - name: 'gcr.io/cloud-builders/npm'
      args: ['install']
    - name: 'gcr.io/cloud-builders/npm'
      args: ['run', 'test:unit']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/$PROJECT_ID/gcb-docker-compose:latest', '.']
    - name: 'docker/compose:1.15.0'
      args: ['up', '-d']
      env:
      - 'PROJECT_ID=$PROJECT_ID'
    - name: 'gcr.io/cloud-builders/npm'
      args: ['run', 'test:integration']
      env:
      - 'HOST=counter' # name of the running container
      - 'PORT=50051'
    images: ['gcr.io/$PROJECT_ID/gcb-docker-compose:latest']
    

아티팩트 배포

Cloud Build는 지속적 배포 파이프라인의 일부로 명령줄 도구를 사용하여 배포를 수행할 수 있습니다.

다음 단계에 따라 GKE, App Engine, Cloud Functions, Firebase에 배포하세요.

Kubernetes Engine

GKE에 배포하려면 gke-deploy 빌드 단계를 호출합니다.

  1. GKE API를 사용 설정합니다.

  2. 클러스터를 만듭니다.

  3. 서비스 계정에 GKE 역할을 추가합니다.

    1. Cloud Build 설정 페이지를 엽니다.

      Cloud Build 설정 페이지 열기

      서비스 계정 권한 페이지가 표시됩니다.

      서비스 계정 권한 페이지의 스크린샷

    2. Kubernetes Engine 개발자 역할의 상태를 사용 설정됨으로 설정합니다.

  4. 빌드 구성 파일에서 다음과 같이 연속된 빌드 단계 중 하나를 추가합니다.

    • 이미지를 참조하는 자체 Kubernetes 구성 파일을 제공하는 경우 다음 빌드 단계를 추가합니다.

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: ["build", "-t", "gcr.io/[PROJECT-ID]/[IMAGE]", "."]
      - name: 'gcr.io/cloud-builders/docker'
        args: ["push", "gcr.io/[PROJECT-ID]/[IMAGE]"]
      - name: 'gcr.io/cloud-builders/gke-deploy:stable'
        args:
        - run
        - --filename=[CONFIG]
        - --image=gcr.io/[PROJECT-ID]/[IMAGE]:[TAG]
        - --location=[LOCATION]
        - --cluster=[CLUSTER]
      
    • 이미지에 대한 Kubernetes 구성 파일이 없는 경우 다음 빌드 단계를 추가합니다.

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: ["build", "-t", "gcr.io/[PROJECT-ID]/[IMAGE]", "."]
      - name: 'gcr.io/cloud-builders/docker'
        args: ["push", "gcr.io/[PROJECT-ID]/[IMAGE]"]
      - name: 'gcr.io/cloud-builders/gke-deploy:stable'
        args:
        - run
        - --image=gcr.io/[PROJECT-ID]/[IMAGE]:[TAG]
        - --location=[LOCATION]
        - --cluster=[CLUSTER]
      

이 빌드는 docker 빌드 단계를 호출하여 Docker 이미지를 만들고 Container Registry로 푸시합니다. 그런 다음 gke-deploy 빌드 단계를 호출하여 GKE 클러스터에 배포합니다.

이 빌드 구성 예시를 사용하려면 다음 정보를 제공하세요.

  • [PROJECT-ID] - GCP 프로젝트의 프로젝트 ID
  • [IMAGE] - 이미지의 이름(원하는 버전 또는 커밋 SHA에 해당하는 [TAG])
  • [CLUSTER] - 인증 정보가 요청된 클러스터의 이름
  • [LOCATION] - 클러스터의 리전/영역
  • [CONFIG] - gke-deploy run에서 사용할 Kubernetes 구성 파일(있는 경우)

App Engine

컨테이너 이미지에서 App Engine으로 애플리케이션을 배포하려면 gcloud app deploy 명령어에 인수를 사용하여 gcloud 빌드 단계를 호출합니다.

  1. App Engine API를 사용 설정합니다.

  2. 서비스 계정에 App Engine 역할을 추가합니다.

    1. Cloud Build 설정 페이지를 엽니다.

      Cloud Build 설정 페이지 열기

      서비스 계정 권한 페이지가 표시됩니다.

      서비스 계정 권한 페이지의 스크린샷

    2. App Engine 관리자 역할의 상태를 사용 설정됨으로 설정합니다.

  3. gcloud app deploy를 사용하는 빌드 구성 파일을 만듭니다.

    steps:
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['app', 'deploy']
      timeout: '1600s'
    

gcloud 빌드 단계는 gcloud app deploy 명령어를 호출하여 소스 코드로 컨테이너 이미지를 빌드한 다음 이미지를 App Engine에 배포합니다.

Cloud Functions

애플리케이션을 Cloud Functions에 배포하려면 gcloud functions deploy를 호출하는 gcloud 빌드 단계를 호출합니다.

  1. Cloud Functions API를 사용 설정합니다.

  2. 서비스 계정에 Cloud Functions 역할을 추가합니다.

    1. Cloud Build 설정 페이지를 엽니다.

      Cloud Build 설정 페이지 열기

      서비스 계정 권한 페이지가 표시됩니다.

      서비스 계정 권한 페이지의 스크린샷

    2. Cloud Functions 개발자 역할의 상태를 사용 설정됨으로 설정합니다.

    3. 모든 서비스 계정에 대한 액세스 권한 부여를 선택하여 이 페이지에서 프로젝트의 모든 서비스 계정에 서비스 계정 사용자 역할을 부여합니다.

  3. gcloud functions deploy를 사용하는 빌드 구성 파일을 만듭니다.

    steps:
    - name: 'gcr.io/cloud-builders/gcloud'
      args:
      - functions
      - deploy
      - [FUNCTION_NAME]
      - --source=.
      - --trigger-http
    

이는 애플리케이션 소스 코드를 빌드하고 gcloud functions deploy를 호출하여 애플리케이션을 Cloud Functions에 배포합니다.

Cloud Run

애플리케이션을 Cloud Run에 배포하려면 gcloud beta run deploy를 호출하는 gcloud 빌드 단계를 호출합니다.

  1. Cloud Run API를 사용 설정합니다.

  2. 서비스 계정에 Cloud Run 역할을 추가합니다.

    1. Cloud Build 설정 페이지를 엽니다.

      Cloud Build 설정 페이지 열기

      서비스 계정 권한 페이지가 표시됩니다.

      서비스 계정 권한 페이지의 스크린샷

    2. Cloud Run Admin 역할의 상태를 사용 설정됨으로 설정합니다.

    3. 모든 서비스 계정에 대한 액세스 권한 부여를 선택하여 이 페이지에서 프로젝트의 모든 서비스 계정에 서비스 계정 사용자 역할을 부여합니다.

  3. gcloud beta run deploy를 사용하는 빌드 구성 파일을 만듭니다.

    steps:
      # build the container image
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/$PROJECT_ID/[SERVICE-NAME]', '.']
      # push the container image to Container Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'gcr.io/$PROJECT_ID/[SERVICE-NAME]']
      # Deploy container image to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['beta', 'run', 'deploy', '[SERVICE-NAME]', '--image', 'gcr.io/$PROJECT_ID/[SERVICE-NAME]', '--region', '[REGION]', '--platform', 'managed']
    images:
    - gcr.io/$PROJECT_ID/[SERVICE-NAME]
    

[SERVICE-NAME][REGION]을 배포하려는 Cloud Run 서비스의 이름과 리전으로 바꿉니다.

GKE의 Cloud Run을 사용하는 경우 managed 대신 gke를 사용하고 --region 매개변수 대신 --cluster--cluster-location을 사용합니다.

이는 애플리케이션 소스 코드를 빌드하고 gcloud run deploy를 호출하여 애플리케이션을 Cloud Run에 배포합니다.

Cloud Run에 이미지를 배포하는 방법에 대한 자세한 내용은 Cloud Run에 배포를 참조하세요.

Firebase

Firebase 커스텀 빌드 단계를 만들어 빌드에서 Firebase를 사용할 수 있습니다.

Firebase 빌드 단계를 만들려면 다음 예시를 통해 Dockerfile 및 빌드 구성 파일을 만드세요.

다음 콘텐츠를 포함한 Dockerfile을 만듭니다. 이는 빌드에서 호출할 때 Firebase 명령줄 도구인 firebase를 설치합니다.

# use latest Node LTS (Boron)
FROM node:boron
# install Firebase CLI
RUN npm install -g firebase-tools

ENTRYPOINT ["/usr/local/bin/firebase"]

다음 콘텐츠가 포함된 cloudbuild.yaml이라는 빌드 구성을 만듭니다. 이 빌드 구성은 Dockerfile을 사용하여 firebase-toolsfirebase로 컨테이너화합니다. 그러면 빌드가 컨테이너화된 이미지를 나중에 빌드에서 사용할 수 있게 Container Registry로 푸시합니다.

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/[PROJECT_ID]/firebase', '.' ]
images:
- 'gcr.io/[PROJECT_ID]/firebase'

Dockerfilecloudbuild.yaml이 동일한 디렉터리에 있는 상태에서 셸이나 터미널 창에서 다음 명령어를 실행합니다.

gcloud builds submit --config=cloudbuild.yaml .

gcloud builds 명령어는 현재 디렉터리(.로 지정됨)의 cloudbuild.yaml 빌드 구성과 소스를 사용하는 빌드를 Cloud Build에 제출합니다. 이 빌드는 환경에 firebase 도구를 설치합니다. 그러면 이 도구가 컨테이너화되어 Container Registry에 푸시됩니다.

빌드에서 firebase를 호출하려면 빌드 구성에 gcr.io/[PROJECT_ID]/firebase 빌드 단계를 추가하세요.

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'install' ]
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'test' ]
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'run', 'build.prod' ]
- name: 'gcr.io/[PROJECT_ID]/firebase'
  args: [ 'deploy', '-P', 'js-demo-fe-staging', '--token', '[FIREBASE_TOKEN]']

이 빌드 구성을 사용하려면 생성한 Firebase 인증 토큰에 해당하는 [FIREBASE_TOKEN] 값을 지정하세요.

빌드 구성 파일의 예

GitHub에서 트리거되는 빌드

다음 구성은 GitHub에서 트리거되는 간단한 빌드를 보여줍니다. 이러한 유형의 구성은 일반적으로 CI/CD 파이프라인에서 사용됩니다.

예를 들면 다음과 같습니다.

  • 종속 항목을 설치하고 단위 테스트를 실행하기 위해 npm 빌드 단계가 호출됩니다.
  • 애플리케이션의 Docker 이미지를 빌드하고 이미지를 Container Registry로 푸시하기 위해 docker 빌드 단계가 호출됩니다.
  • 빌드된 이미지를 Kubernetes 클러스터에 배포하기 위해 gke-deploy 빌드 단계가 호출됩니다.

YAML

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
- name: 'gcr.io/cloud-builders/npm'
  args: ['test']
- name: 'gcr.io/cloud-builders/docker'
  args: ["build", "-t", "gcr.io/my-project/my-image:$REVISION_ID", "."]
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "gcr.io/my-project/my-image:$REVISION_ID"]
- name: 'gcr.io/cloud-builders/gke-deploy:stable'
  args:
  - 'run'
  - '--image=gcr.io/my-project/my-image:$REVISION_ID'
  - '--location=us-east4-b'
  - '--cluster=my-cluster'

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/npm",
        "args": [
            "install"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/npm",
        "args": [
            "test"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "gcr.io/my-project/my-image:$REVISION_ID",
            "."
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "gcr.io/my-project/my-image:$REVISION_ID"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/gke-deploy:stable",
        "args": [
            "run",
            "--image=gcr.io/my-project/my-image:$REVISION_ID",
            "--location=us-east4-b",
            "--cluster=my-cluster"
        ]
    }
    ]
}

이미지를 푸시하지 않고 빌드 요청 작성하기

Docker 이미지를 생성하지 않고 Cloud Build를 사용하여 임의의 작업을 수행할 수 있습니다.

아래 예시를 참조하세요.

  • docker를 사용하여 분석 도구 빌드
  • data-to-analyze 디렉터리에서 일부 데이터 가져오기
  • 분석 결과를 Cloud Storage 버킷으로 푸시

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'analyzer', '.']

- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://my-data-warehouse/data-to-analyze.tgz', '.']

- name: 'debian'
  args: ['tar', '-xzf', 'data-to-analyze.tgz']

- name: 'analyzer'
  args: ['--output=results.csv']
  dir: 'data-to-analyze'

- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'data-to-analyze/results.csv', 'gs://my-data-warehouse/results.tgz']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": [
        "build",
        "-t",
        "analyzer",
        "."
      ]
    },
    {
      "name": "gcr.io/cloud-builders/gsutil",
      "args": [
        "cp",
        "gs://my-data-warehouse/data-to-analyze.tgz",
        "."
      ],
    },
    {
      "name": "debian",
      "args": [
        "tar",
        "-xzf",
        "data-to-analyze.tgz"
      ],
    },
    {
      "name": "analyzer",
      "args": [
        "--output=results.csv"
      ],
      "dir": "data-to-analyze"
    },
    {
      "name": "gcr.io/cloud-builders/gsutil",
      "args": [
        "cp",
        "data-to-analyze/results.csv",
        "gs://my-data-warehouse/results.tgz"
      ]
    }
  ]
}

다음 단계