HTTP 알림 구성

Cloud Build는 Slack 또는 SMTP 서버와 같은 원하는 채널에 알림을 전송하여 빌드 업데이트를 알릴 수 있습니다. 이 페이지에서는 HTTP 알리미를 사용하여 알림을 구성하는 방법을 설명합니다.

시작하기 전에

  • Enable the Cloud Build, Cloud Run, and Pub/Sub APIs.

    Enable the APIs

HTTP 알림 구성

다음 섹션에서는 HTTP 알리미를 사용하여 POST 요청을 지정된 수신자 URL로 보내는 HTTP 알림을 수동으로 구성하는 방법을 설명합니다. 대신 구성을 자동화하려면 알림 구성 자동화를 참조하세요.

HTTP 알림을 구성하려면 다음 안내를 따르세요.

HTTP 알리미를 사용하여 지정된 받는 사람 URL로 POST 요청을 보내려면 다음 안내를 따르세요.

  1. Cloud Run 서비스 계정에 Cloud Storage 버킷에서 읽을 수 있는 권한을 부여합니다.

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM 페이지 열기

    2. 프로젝트와 연결된 Compute Engine 기본 서비스 계정을 찾습니다.

      Compute Engine 기본 서비스 계정은 다음과 비슷하게 표시됩니다.

      project-number-compute@developer.gserviceaccount.com
      
    3. Compute Engine 기본 서비스 계정이 있는 행에서 연필 아이콘을 클릭합니다. 수정 액세스 탭이 표시됩니다.

    4. 다른 역할 추가를 클릭합니다.

    5. 다음 역할을 추가합니다.

      • 스토리지 객체 뷰어
    6. 저장을 클릭합니다.

  2. 알리미 구성 파일을 작성하여 HTTP 알리미를 구성하고 빌드 이벤트로 필터링합니다.

    다음 알리미 구성 파일 예시에서 filter 필드는 사용 가능한 변수 build와 함께 Common Expression Language를 사용하여 SUCCESS 상태의 빌드 이벤트를 필터링합니다.

    apiVersion: cloud-build-notifiers/v1
    kind: HTTPNotifier
    metadata:
      name: example-http-notifier
    spec:
      notification:
        filter: build.status == Build.Status.SUCCESS
        params:
          buildStatus: $(build.status)
        delivery:
          # The `http(s)://` protocol prefix is required.
          url: url
        template:
          type: golang
          uri: gs://example-gcs-bucket/http.json
    

    각 항목의 의미는 다음과 같습니다.

    • buildStatus는 사용자 정의 매개변수입니다. 이 매개변수는 빌드 상태인 $(build.status) 값을 사용합니다.
    • url은 요청의 URL을 지정하기 위해 이 예시에서 사용되는 구성 변수입니다.
    • url은 수신자 서버로 지정할 URL입니다.
    • uri 필드는 http.json 파일을 참조합니다. 이 파일은 Cloud Storage에서 호스팅되는 JSON 템플릿을 참조하며 웹훅 엔드포인트에 대한 JSON 페이로드를 나타냅니다.

      템플릿 파일의 예시를 보려면 cloud-build-notifiers 저장소의 http.json 파일을 참조하세요.

    예시를 보려면 HTTP 알리미의 알리미 구성 파일을 참조하세요.

    필터링할 수 있는 추가 필드는 빌드 리소스를 참조하세요. 추가적인 필터링 예시에 대해서는 CEL을 사용하여 빌드 이벤트 필터링을 참조하세요.

  3. 알리미 구성 파일을 Cloud Storage 버킷에 업로드합니다.

    1. Cloud Storage 버킷이 없으면 다음 명령어를 실행하여 버킷을 만듭니다. 여기서 bucket-name은 버킷에 지정할 이름으로, 이름 지정 요구사항이 적용됩니다.

      gcloud storage buckets create gs://bucket-name/
      
    2. 버킷에 알리미 구성 파일을 업로드합니다.

      gcloud storage cp config-file-name gs://bucket-name/config-file-name
      

      각 항목의 의미는 다음과 같습니다.

      • bucket-name은 버킷의 이름입니다.
      • config-file-name은 알리미 구성 파일의 이름입니다.
  4. Cloud Run에 알리미를 배포합니다.

     gcloud run deploy service-name \
       --image=us-east1-docker.pkg.dev/gcb-release/cloud-build-notifiers/http:latest \
       --update-env-vars=CONFIG_PATH=config-path,PROJECT_ID=project-id
    

    각 항목의 의미는 다음과 같습니다.

    • service-name은 이미지를 배포할 Cloud Run 서비스의 이름입니다.

    • config-path는HTTP 알리미의 구성 파일 경로입니다(예: gs://bucket-name/config-file-name).

    • project-id는 Google Cloud 프로젝트의 ID입니다.

    gcloud run deploy 명령어는 Cloud Build 소유 Artifact Registry에서 호스팅된 이미지의 최신 버전을 가져옵니다. Cloud Build는 9개월 동안 알리미 이미지를 지원합니다. 9개월이 지나면 Cloud Build는 이미지 버전을 삭제합니다. 이전 이미지 버전을 사용하려면 gcloud run deploy 명령어의 image 속성에 이미지 태그의 전체 시맨틱 버전을 지정해야 합니다. 이전 이미지 버전 및 태그는 Artifact Registry에서 찾을 수 있습니다.

  5. 프로젝트에서 인증 토큰을 만들도록 Pub/Sub 권한을 부여합니다.

     gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com \
       --role=roles/iam.serviceAccountTokenCreator
    

    각 항목의 의미는 다음과 같습니다.

    • project-id는 Google Cloud 프로젝트의 ID입니다.
    • project-number는 Google Cloud 프로젝트 번호입니다.
  6. Pub/Sub 구독 ID를 나타내는 서비스 계정을 만듭니다.

    gcloud iam service-accounts create cloud-run-pubsub-invoker \
      --display-name "Cloud Run Pub/Sub Invoker"
    

    cloud-run-pubsub-invoker 또는 Google Cloud 프로젝트 내의 고유 이름을 사용할 수 있습니다.

  7. cloud-run-pubsub-invoker 서비스 계정에 Cloud Run Invoker 권한을 부여합니다.

    gcloud run services add-iam-policy-binding service-name \
       --member=serviceAccount:cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com \
       --role=roles/run.invoker
    

    각 항목의 의미는 다음과 같습니다.

    • service-name은 이미지를 배포할 Cloud Run 서비스의 이름입니다.
    • project-id는 Google Cloud 프로젝트의 ID입니다.
  8. cloud-builds 주제를 만들어 알리미의 빌드 업데이트 메시지를 수신합니다.

    gcloud pubsub topics create cloud-builds
    
  9. 알리미에 대해 Pub/Sub 푸시 구독자를 만듭니다.

     gcloud pubsub subscriptions create subscriber-id \
       --topic=cloud-builds \
       --push-endpoint=service-url \
       --push-auth-service-account=cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com
    

    각 항목의 의미는 다음과 같습니다.

    • subscriber-id는 구독에 지정하려는 이름입니다.
    • service-url은 Cloud Run에서 생성된 새 서비스에 대한 URL입니다.
    • project-id는 Google Cloud 프로젝트의 ID입니다.

Cloud Build 프로젝트 알림이 이제 설정되었습니다. 다음에 빌드를 호출하면 구성한 필터와 빌드가 일치할 경우 지정된 URL의 받는 사람 HTTP 서버가 빌드 리소스와 일치하는 JSON 페이로드를 수신합니다.

CEL을 사용하여 빌드 이벤트 필터링

Cloud Build는 트리거 ID, 이미지 목록 또는 대체 값과 같은 빌드 이벤트와 연결된 필드에 액세스하기 위해 빌드 리소스에 나열된 필드에서 build 변수로 CEL을 사용합니다. filter 문자열을 사용하여 빌드 리소스에 나열된 필드를 사용해서 빌드 구성 파일의 빌드 이벤트를 필터링할 수 있습니다. 필드와 연결된 정확한 구문을 찾으려면 cloudbuild.proto 파일을 참조하세요.

트리거 ID로 필터링

트리거 ID로 필터링하려면 build.build_trigger_id를 사용하여 filter 필드에 트리거 ID 값을 지정합니다. 여기서 trigger-id는 문자열인 트리거 ID입니다.

filter: build.build_trigger_id == trigger-id

상태별 필터링

상태를 기준으로 필터링하려면 build.status를 사용하여 filter 필드에서 필터링할 빌드 상태를 지정합니다.

다음 예시는 filter 필드를 사용하여 SUCCESS 상태인 빌드 이벤트를 필터링하는 방법을 보여줍니다.

filter: build.status == Build.Status.SUCCESS

또한 여러 상태로 빌드를 필터링할 수 있습니다. 다음 예시에서는 filter 필드를 사용하여 SUCCESS, FAILURE, TIMEOUT 상태의 빌드 이벤트를 필터링하는 방법을 보여줍니다.

filter: build.status in [Build.Status.SUCCESS, Build.Status.FAILURE, Build.Status.TIMEOUT]

필터링할 수 있는 추가 상태 값을 보려면 빌드 리소스 참조 아래에서 상태를 참조하세요.

태그 기준 필터링

태그를 필터링하려면 build.tags를 사용하여 filter 필드에 태그 값을 지정합니다. 여기서 tag-name은 태그의 이름입니다.

filter: tag-name in build.tags

size를 사용하여 빌드 이벤트에 지정된 태그 수에 따라 필터링할 수 있습니다. 다음 예시에서 filter 필드는 v1로 지정된 한 개의 태그를 사용하여 정확히 지정된 태그 2개가 있는 빌드 이벤트를 필터링합니다.

filter: size(build.tags) == 2 && "v1" in build.tags

이미지로 필터링

이미지로 필터링하려면 build.images를 사용하여 filter 필드에 이미지 값을 지정합니다. 여기서 image-name은 Artifact Registry에 나열된 이미지의 전체 이름입니다(예: us-east1-docker.pkg.dev/my-project/docker-repo/image-one)

filter: image-name in build.images

다음 예시에서 filter는 이미지 이름으로 us-east1-docker.pkg.dev/my-project/docker-repo/image-one 또는 us-east1-docker.pkg.dev/my-project/docker-repo/image-two가 지정된 빌드 이벤트를 필터링합니다.

filter: "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images || "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images

시간별 필터링

filter 필드에 build.create_time, build.start_time 또는 build.finish_time 옵션 중 하나를 지정하여 빌드의 생성 시간, 시작 시간 또는 종료 시간을 기준으로 빌드 이벤트를 필터링할 수 있습니다.

다음 예시에서 filtertimestamp를 사용하여 빌드 만들기 요청 시간이 2020년 7월 20일 오전 6:00인 빌드 이벤트를 필터링합니다.

filter: build.create_time == timestamp("2020-07-20:T06:00:00Z")

또한 시간 비교로 빌드 이벤트를 필터링할 수도 있습니다. 다음 예시에서 filter 필드는 timestamp를 사용하여 시작 시간이 2020년 7월 20일 오전 6:00부터 2020년 7월 30일 오전 6:00 사이인 빌드 이벤트를 필터링합니다.

filter: timestamp("2020-07-20:T06:00:00Z") >= build.start_time && build.start_time <= timestamp("2020-07-30:T06:00:00Z")

CEL에서 시간대가 표현되는 방식을 자세히 알아보려면 시간대의 언어 정의를 참조하세요.

빌드 기간을 기준으로 필터링하려면 duration을 사용하여 타임스탬프를 비교할 수 있습니다. 다음 예시에서 filter 필드는 duration을 사용하여 최소 5분 동안 실행되는 빌드가 있는 빌드 이벤트를 필터링합니다.

filter: build.finish_time - build.start_time >= duration("5m")

대체 항목 기준 필터링

build.substitutions를 사용해서 filter 필드에 대체 변수를 지정하여 대체 항목으로 필터링할 수 있습니다. 다음 예시에서 filter 필드는 대체 변수 substitution-variable이 포함된 빌드를 나열하고 substitution-variable이 지정된 substitution-value와 일치하는지 확인합니다.

filter: build.substitutions[substitution-variable] == substitution-value

각 항목의 의미는 다음과 같습니다.

  • substitution-variable은 대체 변수의 이름입니다.
  • substitution-value는 대체 값의 이름입니다.

또한 기본 대체 변수 값으로 필터링할 수 있습니다. 다음 예시에서 filter 필드에는 브랜치 이름이 master인 빌드와 저장소 이름이 github.com/user/my-example-repo인 빌드가 나열됩니다. 기본 대체 변수 BRANCH_NAMEREPO_NAMEbuild.substitutions에 키로 전달됩니다.

filter: build.substitutions["BRANCH_NAME"] == "master" && build.substitutions["REPO_NAME"] == "github.com/user/my-example-repo"

정규 표현식을 사용하여 문자열로 필터링하려면 기본 제공되는 matches 함수를 사용할 수 있습니다. 아래 예시에서 filter 필드는 상태가 FAILURE 또는 TIMEOUT이고 v{DIGIT}.{DIGIT}.{3 DIGITS}) 정규 표현식과 일치하는 값으로 빌드 대체 변수가 TAG_NAME인 빌드를 필터링합니다.

filter: build.status in [Build.Status.FAILURE, Build.Status.TIMEOUT] && build.substitutions["TAG_NAME"].matches("^v\\d{1}\\.\\d{1}\\.\\d{3}$")

기본 대체 값 목록을 보려면 기본 대체 항목 사용을 참조하세요.

다음 단계