Slack 알림 구성

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

시작하기 전에

  • Enable the Cloud Build, Compute Engine, Cloud Run, Pub/Sub, and Secret Manager APIs.

    Enable the APIs

Slack 알림 구성

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

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

  1. 원하는 Slack 작업공간에 대해 Slack 앱을 만듭니다.

  2. 수신 웹훅을 활성화하여 Cloud Build의 메시지를 Slack에 게시합니다.

  3. Slack 앱으로 이동하여 수신 웹훅의 URL을 찾습니다. URL은 다음과 비슷하게 표시됩니다.

    http://hooks.slack.com/services/...
    
  4. 수신 웹훅 URL을 Secret Manager에 저장합니다.

    1. Google Cloud Console에서 보안 비밀 관리자 페이지를 엽니다.

      보안 비밀 페이지 열기

    2. 보안 비밀 만들기를 클릭합니다.

    3. 보안 비밀의 이름을 입력합니다.

    4. 보안 비밀 값 아래에서 Slack 앱의 수신 웹훅 URL을 추가합니다.

    5. 보안 비밀을 저장하려면 보안 비밀 만들기를 클릭합니다.

  5. Cloud Run 서비스 계정에 프로젝트의 편집자 역할이 있을 수 있지만 편집자 역할로는 Secret Manager에 있는 보안 비밀에 액세스할 수 없습니다. Cloud Run 서비스 계정에 보안 비밀에 대한 액세스 권한을 부여해야 합니다.

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

      IAM 페이지 열기

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

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

      project-number-compute@developer.gserviceaccount.com
      

      Compute Engine 기본 서비스 계정을 기록해 둡니다.

    3. Google Cloud Console에서 보안 비밀 관리자 페이지를 엽니다.

      보안 비밀 페이지 열기

    4. Slack 앱의 보안 비밀이 포함된 보안 비밀 이름을 클릭합니다.

    5. 권한 탭에서 구성원 추가를 클릭합니다.

    6. 프로젝트와 연결된 Compute Engine 기본 서비스 계정을 구성원으로 추가합니다.

    7. Secret Manager 보안 비밀 접근자 권한을 역할로 선택합니다.

    8. 저장을 클릭합니다.

  6. 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. 저장을 클릭합니다.

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

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

    apiVersion: cloud-build-notifiers/v1
    kind: SlackNotifier
    metadata:
      name: example-slack-notifier
    spec:
      notification:
        filter: build.status == Build.Status.SUCCESS
        params:
          buildStatus: $(build.status)
        delivery:
          webhookUrl:
            secretRef: webhook-url
        template:
          type: golang
          uri: gs://example-gcs-bucket/slack.json
      secrets:
      - name: webhook-url
        value: projects/project-id/secrets/secret-name/versions/latest
    

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

    • buildStatus는 사용자 정의 매개변수입니다. 이 매개변수는 빌드 상태인 $(build.status) 값을 사용합니다.
    • webhook-url은 Secret Manager에 저장된 Slack 웹훅 URL 경로를 참조하기 위해 이 예시에 사용된 구성 변수입니다. 여기에서 지정하는 변수 이름은 secrets 아래의 name 필드와 일치해야 합니다.
    • project-id는 Google Cloud 프로젝트의 ID입니다.
    • secret-name은 Slack 웹훅 URL이 포함된 보안 비밀의 이름입니다.
    • uri 필드는 slack.json 파일을 참조합니다. 이 파일은 Cloud Storage에서 호스팅되는 JSON 템플릿을 포함하며 Slack 공간에 대한 알림 메시지를 나타냅니다.

      JSON 템플릿 파일은 Slack의 blockkit 기능을 활용합니다. 템플릿 파일의 예시를 보려면 cloud-build-notifiers 저장소의 slack.json 파일을 참조하세요.

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

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

  8. 알리미 구성 파일을 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은 구성 파일의 이름입니다.
  9. Cloud Run에 알리미를 배포합니다.

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

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

    • service-name은 이미지를 배포할 Cloud Run 서비스의 이름입니다.
    • config-path는 Slack 알리미인 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에서 찾을 수 있습니다.

  10. 프로젝트에서 인증 토큰을 만들도록 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 프로젝트 번호입니다.
  11. 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 프로젝트 내의 고유 이름을 사용할 수 있습니다.

  12. 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입니다.

  13. cloud-builds 주제를 만들어 알리미의 빌드 업데이트 메시지를 수신합니다.

    gcloud pubsub topics create cloud-builds
    
  14. 알리미에 대해 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 프로젝트 알림이 이제 설정되었습니다. 다음에 빌드를 호출하면 구성한 필터와 빌드가 일치할 경우 Slack에서 알림이 수신됩니다.

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}$")

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

다음 단계