Cloud Build는 Slack 또는 SMTP 서버와 같은 원하는 채널에 알림을 전송하여 빌드 업데이트를 알릴 수 있습니다. 이 페이지에서는 Slack 알리미를 사용하여 알림을 구성하는 방법을 설명합니다.
시작하기 전에
-
Enable the Cloud Build, Compute Engine, Cloud Run, Pub/Sub, and Secret Manager APIs.
Slack 알림 구성
다음 섹션에서는 Slack 알리미를 사용하여 Slack 알림을 수동으로 구성하는 방법을 설명합니다. 대신 구성을 자동화하려면 알림 구성 자동화를 참조하세요.
Slack 알림을 구성하려면 다음 안내를 따르세요.
원하는 Slack 작업공간에 대해 Slack 앱을 만듭니다.
수신 웹훅을 활성화하여 Cloud Build의 메시지를 Slack에 게시합니다.
Slack 앱으로 이동하여 수신 웹훅의 URL을 찾습니다. URL은 다음과 비슷하게 표시됩니다.
http://hooks.slack.com/services/...
수신 웹훅 URL을 Secret Manager에 저장합니다.
Google Cloud 콘솔에서 Secret Manager 페이지를 엽니다.
보안 비밀 만들기를 클릭합니다.
보안 비밀의 이름을 입력합니다.
보안 비밀 값 아래에서 Slack 앱의 수신 웹훅 URL을 추가합니다.
보안 비밀을 저장하려면 보안 비밀 만들기를 클릭합니다.
Cloud Run 서비스 계정에 프로젝트의 편집자 역할이 있을 수 있지만 편집자 역할로는 Secret Manager에 있는 보안 비밀에 액세스할 수 없습니다. Cloud Run 서비스 계정에 보안 비밀에 대한 액세스 권한을 부여해야 합니다.
Google Cloud 콘솔에서 IAM 페이지로 이동합니다.
프로젝트와 연결된 Compute Engine 기본 서비스 계정을 찾습니다.
Compute Engine 기본 서비스 계정은 다음과 비슷하게 표시됩니다.
project-number-compute@developer.gserviceaccount.com
Compute Engine 기본 서비스 계정을 기록해 둡니다.
Google Cloud 콘솔에서 Secret Manager 페이지를 엽니다.
Slack 앱의 보안 비밀이 포함된 보안 비밀 이름을 클릭합니다.
권한 탭에서 구성원 추가를 클릭합니다.
프로젝트와 연결된 Compute Engine 기본 서비스 계정을 구성원으로 추가합니다.
Secret Manager 보안 비밀 접근자 권한을 역할로 선택합니다.
저장을 클릭합니다.
Cloud Run 서비스 계정에 Cloud Storage 버킷에서 읽을 수 있는 권한을 부여합니다.
Google Cloud 콘솔에서 IAM 페이지로 이동합니다.
프로젝트와 연결된 Compute Engine 기본 서비스 계정을 찾습니다.
Compute Engine 기본 서비스 계정은 다음과 비슷하게 표시됩니다.
project-number-compute@developer.gserviceaccount.com
Compute Engine 기본 서비스 계정이 있는 행에서 연필 아이콘을 클릭합니다. 수정 액세스 탭이 표시됩니다.
다른 역할 추가를 클릭합니다.
다음 역할을 추가합니다.
- 스토리지 객체 뷰어
저장을 클릭합니다.
알리미 구성 파일을 작성하여 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의 블록킷 기능을 활용합니다. 템플릿 파일의 예시를 보려면 cloud-build-notifiers 저장소의
slack.json
파일을 참조하세요.
예시를 보려면 Slack 알리미의 알리미 구성 파일을 참조하세요.
필터링할 수 있는 추가 필드는 빌드 리소스를 참조하세요. 추가적인 필터링 예시에 대해서는 CEL을 사용하여 빌드 이벤트 필터링을 참조하세요.
알리미 구성 파일을 Cloud Storage 버킷에 업로드합니다.
Cloud Storage 버킷이 없으면 다음 명령어를 실행하여 버킷을 만듭니다. 여기서 bucket-name은 버킷에 지정할 이름으로, 이름 지정 요구사항이 적용됩니다.
gsutil mb gs://bucket-name/
버킷에 알리미 구성 파일을 업로드합니다.
gsutil cp config-file-name gs://bucket-name/config-file-name
각 항목의 의미는 다음과 같습니다.
bucket-name
은 버킷의 이름입니다.config-file-name
은 구성 파일의 이름입니다.
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에서 찾을 수 있습니다.프로젝트에서 인증 토큰을 만들도록 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 프로젝트 번호입니다.
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 프로젝트 내의 고유 이름을 사용할 수 있습니다.cloud-run-pubsub-invoker
서비스 계정에 Cloud RunInvoker
권한을 부여합니다.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입니다.
cloud-builds
주제를 만들어 알리미의 빌드 업데이트 메시지를 수신합니다.gcloud pubsub topics create cloud-builds
알리미에 대해 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
옵션 중 하나를 지정하여 빌드의 생성 시간, 시작 시간 또는 종료 시간을 기준으로 빌드 이벤트를 필터링할 수 있습니다.
다음 예시에서 filter
는 timestamp
를 사용하여 빌드 만들기 요청 시간이 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_NAME
및 REPO_NAME
은 build.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}$")`
기본 대체 값 목록을 보려면 기본 대체 항목 사용을 참조하세요.
다음 단계
- Cloud Build 알리미 알아보기
- 빌드 알림 구독하는 방법 알아보기
- Cloud Build 빌드 구성 파일 작성 방법을 알아보세요.