이 튜토리얼은 공개 및 비공개 GitHub 저장소 모두에 적용됩니다. 미리보기 자체가 공개되지만 모호한 경우 URL로 제공됩니다.
목표
- Cloud Run 서비스 만들기
- GitHub에서 소스 제어 기반 지속적 통합 구현하기
- Secret Manager를 통해 보안 비밀에 대한 액세스 권한을 생성하고 관리하기
- 커스텀 Cloud Builder 배포하기
- GitHub pull 요청에 따라 빌드를 호출하는 Cloud Build 트리거 만들기
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud Build, and Secret Manager APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud Build, and Secret Manager APIs.
필요한 역할
튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
Cloud Build 편집자(
roles/cloudbuild.builds.editor
) -
Cloud Run 관리자(
roles/run.admin
) -
서비스 계정 만들기(
roles/iam.serviceAccountCreator
) -
Secret Manager 관리자(
roles/secretmanager.admin
)
역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.
코드 샘플 검색
이 튜토리얼에서 쉽게 사용할 수 있도록 템플릿을 기반으로 한 Hello World 애플리케이션의 복사본이 포함된 새 GitHub 저장소를 만들게 될 것입니다. 그런 다음 커스텀 Cloud Build 구성을 사용하여 이 저장소에 새 파일을 추가하게 됩니다.
- GitHub에 로그인하여 템플릿 저장소로 이동하세요.
- '이 템플릿 사용'을 클릭하여 이 템플릿을 사용하여 새 저장소를 만듭니다.
- 저장소 이름을
helloworld-python
으로 지정합니다. - 저장소에 '공개' 또는 '비공개'를 선택합니다.
- 템플릿에서 저장소 만들기를 클릭합니다.
- 저장소 이름을
저장소에 새 Cloud Build 구성 파일을 만듭니다(전체 안내).
- 저장소 페이지에서 파일 추가 > 새 파일 만들기를 클릭합니다.
- 새 파일의 이름을
cloudbuild.yaml
로 지정합니다. 아래 코드를
cloudbuild.yaml
에 복사합니다.기본 선택인 '
main
분기에 직접 커밋' 선택을 유지합니다.새 파일 커밋을 클릭합니다.
빌드 트리거를 사용하여 서비스 배포
이 튜토리얼에서는 저장소의 기본 분기를 업데이트할 때마다 자동으로 빌드를 시작하도록 빌드 트리거를 설정하는 방법을 보여줍니다. 변경사항을 배포할 때마다 Cloud Build를 호출하여 서비스를 수동으로 배포할 수도 있습니다.
이 튜토리얼에서는 cloudbuild.yaml
파일을 사용하여 myservice
라는 샘플 서비스를 배포합니다.
Cloud Run 관리자 및 서비스 계정 사용자 역할을 Cloud Build 서비스 계정에 부여합니다(전체 안내).
Google Cloud Console에서 Cloud Build 계정 설정 페이지로 이동합니다.
Cloud Run 관리자 역할을 사용 설정합니다.
확인 대화상자에서 모든 서비스 계정에 액세스 권한 부여를 클릭합니다.
GitHub 계정을 Cloud Build에 연결합니다(전체 안내).
Google Cloud Console에서 Cloud Build 트리거 페이지로 이동합니다.
저장소 연결을 클릭합니다.
GitHub(Cloud Build GitHub 앱)를 소스로 선택하고 인증 및 승인 대화상자를 따라 단계별로 진행합니다.
'GITHUB_USER_NAME/helloworld-python' 저장소를 선택합니다.
저장소 연결을 클릭합니다.
'트리거 만들기(선택사항)'에서 트리거 만들기를 클릭합니다.
Cloud Build 트리거를 만듭니다(전체 안내).
- Cloud Build 트리거 페이지에서 트리거 만들기를 클릭합니다.
- 다음 세부정보를 입력합니다.
- 이름:
prod-deploy
- 이벤트: 분기에 푸시
- 소스 저장소: 'GITHUB_USER_NAME/helloworld-python'
- 소스 분기:
^main$
- 빌드 구성: Cloud Build 구성 파일(yaml 또는 json)
- Cloud Build 구성 파일 위치:
cloudbuild.yaml
- 이름:
- 만들기를 클릭합니다.
새 트리거를 수동으로 실행하세요.
- 새 트리거 목록에서 실행을 클릭합니다.
- 팝업에서 분기 이름(
main
)을 확인하고 트리거 실행을 클릭합니다. - Cloud Build 기록으로 이동하여 빌드 진행 상황을 확인합니다.
- 빌드가 완료될 때까지 기다립니다.
배포에 성공했는지 확인합니다.
Google Cloud Console에서 Cloud Run 페이지로 이동합니다.
서비스가 배포에 성공했음을 나타내는 녹색 체크표시가 있는지 확인합니다.
버전 탭을 클릭하고 'myservice-00001-'으로 시작하는 트래픽을 100% 제공하는 하나의 버전이 서비스에 포함되어 있는지 확인합니다.
서비스 URL을 클릭하고 서비스에 'Hello World!'가 표시되는지 확인합니다.
토큰 및 구성 만들기
이전 섹션에서 만든 prod-deploy 트리거는 기본 분기에 푸시가 수행될 때 서비스를 배포합니다. 이제 저장소에서 pull 요청이 생성되거나 업데이트될 때마다 실행되는 두 번째 트리거를 만듭니다.
새 트리거가 설정되면 미리보기가 배포되지만 pull 요청에는 미리보기로 연결되는 정보가 포함되지 않습니다. 이 기능을 설정하려면 다음과 같은 추가 구성 단계를 완료해야 합니다.
- GitHub 토큰을 만듭니다.
- 이 토큰을 Secret Manager에 저장합니다.
- Cloud Build의 단계로 사용할 커스텀 이미지를 만듭니다.
GitHub 토큰 생성 및 저장
- pull 요청에 다시 쓸 수 있도록 GitHub 토큰을 만드세요(전체 안내).
- GitHub 개인 액세스 토큰 설정 페이지로 이동합니다.
- 새 토큰 생성을 클릭합니다.
- 다음 세부정보를 입력합니다.
- 참고:
preview-deploy
- 만료: 30일
- 범위:
- 공개 저장소의 경우:
repo:status
('액세스 커밋 상태') - 비공개 저장소:
repo
('비공개 저장소 전체 제어')
- 공개 저장소의 경우:
- 참고:
- 토큰 생성을 클릭합니다.
- 생성된 토큰의 값을 복사합니다.
Secret Manager에 GitHub 토큰을 저장합니다.
Google Cloud Console에서 Secret Manager 페이지로 이동합니다.
보안 비밀 만들기를 클릭합니다.
다음 세부정보를 입력합니다.
- 이름:
github_token
- 보안 비밀 값: GitHub에서 복사한 토큰 값을 붙여넣습니다.
- 이름:
보안 비밀 만들기를 클릭합니다.
Cloud Build에서 이 보안 비밀에 액세스하도록 허용하세요.
새 브라우저 탭의 Google Cloud Console에서 Cloud Build 설정 페이지로 이동합니다.
'서비스 계정 이메일' 값을 복사합니다.
- 이메일은
PROJECT_NUM@cloudbuild.gserviceaccount.com
입니다.
- 이메일은
Secret Manager로 돌아가서 권한 탭을 클릭하고
추가를 클릭합니다.- 새 주 구성원:
PROJECT_NUM@cloudbuild.gserviceaccount.com
- 역할: Secret Manager 보안 비밀 접근자
- 새 주 구성원:
저장을 클릭합니다.
GitHub에서는 개인 액세스 토큰의 만료 설정을 권장하며 토큰이 만료되도록 설정되면 알림 이메일을 전송합니다. 배포 미리보기를 계속 사용하는 경우 토큰을 다시 생성할 때 github_token
의 새 버전을 만듭니다. 다음 단계의 빌더는 최신 버전의 토큰을 검색하므로 미리보기가 계속 작동합니다.
Cloud Build용 새 이미지 만들기
pull 요청에 '배포 미리보기' 알림을 작성하는 스크립트는 Python 문서 샘플에 있습니다. 소스 코드에 이 스크립트를 추가하는 대신 선택적으로 이 스크립트를 프로젝트 내의 컨테이너에 빌드하고 해당 컨테이너를 Cloud Build 구성의 단계로 실행할 수 있습니다.
Cloud Shell을 사용하거나 로컬 머신(git
및 Google Cloud CLI를 설치 및 구성한 경우)을 사용하여 다음 안내를 완료할 수 있습니다. 아래 안내에서는 이러한 방법을 모두 보여줍니다.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- 프로젝트를 사용하도록 Google Cloud CLI를 구성합니다.
PROJECT_ID
는 프로젝트 ID로 바꿉니다. Cloud Shell을 사용하는 경우 Google Cloud API 호출을 수행하기 위해 Google Cloud CLI를 승인해야 할 수 있습니다. 계속하려면 승인을 클릭합니다.export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID
- 새 컨테이너 이미지를 만듭니다.
git clone https://github.com/GoogleCloudPlatform/python-docs-samples cd python-docs-samples/ gcloud builds submit --tag gcr.io/$PROJECT_ID/deployment-previews run/deployment-previews
- 컨테이너가 생성되었는지 확인합니다.
gcloud container images list
- 클론된 저장소를 삭제합니다.
cd .. rm -rf python-docs-samples
새 Cloud Build 구성 추가
저장소에는 기본 분기에서 사용되는 cloudbuild.yaml
파일이 이미 있습니다. 이제 이 새로운 트리거에 대한 새 구성을 만듭니다.
GitHub 저장소 페이지에서 파일 추가 > 새 파일 만들기를 클릭합니다.
- 새 파일의 이름을
cloudbuild-preview.yaml
로 지정합니다. - 아래의 코드를 복사하여 새 파일에 붙여넣으세요.
- 새 파일의 이름을
저장소의 기본 분기에 변경사항을 커밋합니다.
보조 트리거 만들기
모든 기초 작업이 준비되었으므로 새 트리거를 만듭니다.
새 Cloud Build 트리거를 만듭니다(전체 안내).
Google Cloud Console에서 Cloud Build 트리거 페이지로 이동합니다.
트리거 만들기를 클릭합니다.
다음 세부정보를 입력합니다.
- 이름:
preview-deploy
- 이벤트: pull 요청
- 소스 저장소: 'GITHUB_USER_NAME/helloworld-python'
- 기본 분기:
^main$
- 댓글 관리: 소유자 및 공동작업자를 제외하고 필수 항목
- 저장소 소유자의 경우 미리보기는 생성한 pull 요청에 자동으로 빌드됩니다.
- 모든 사용자가 변경사항을 미리 볼 수 있게 하려면 '필요하지 않음'을 선택하는 것이 보안에 미치는 영향에 대하여 자세히 읽어보세요.
- 구성: Cloud Build 구성 파일
- Cloud Build 구성 파일 위치:
cloudbuild-preview.yaml
- 이름:
만들기를 클릭합니다.
성공 여부 확인
이 새 트리거는 새 pull 요청이 생성되면 실행되므로 새 pull 요청을 만들어 테스트해야 합니다.
- 저장소로 이동하여 새 분기에서
app.py
를 시각적으로 변경합니다.app.py
로 이동하고 연필 아이콘( )을 클릭합니다.- 예를 들어 'Hello'를 'Greetings'로 변경하세요.
- 이 커밋에 대한 새 분기를 만들고 가져오기 요청을 시작합니다를 선택한 후 변경 제안을 클릭합니다.
이 분기를 사용하여 새 pull 요청을 만듭니다.
트리거가 올바르게 구성되었다면 pull 요청을 만드는 즉시 새 확인이 표시됩니다.
확인 이름은 트리거의 이름과 프로젝트 ID입니다. 세부정보 > Google Cloud Build에 대한 자세한 내용 보기를 클릭하여 빌드 진행 상태를 확인합니다.
트리거가 실패하고 빌드를 다시 제출해야 하는 경우 또는 pull 요청에 다른 변경사항을 적용하려는 경우 동일한 분기에 변경사항을 커밋해야 합니다. pull 요청에 대한 새 커밋마다 새 빌드가 트리거됩니다.
트리거가 완료되면 pull 요청에 대해 '배포 미리보기'라는 새 상태 확인이 표시됩니다. 계정이 사용 중인 토큰을 소유하고 있기 때문에 표시된 아이콘은 사용자의 아바타입니다.
세부정보를 클릭하여 미리보기로 이동합니다. 표시된 URL은 원래 서비스 URL과 동일하지만 'pr-1---' 프리픽스가 붙습니다.
원래의 서비스 URL로 이동하면 원본 콘텐츠가 표시됩니다.
서비스 버전 목록을 확인하여 Cloud Run에서 서비스 상태를 확인합니다. 이제 원본과 미리보기라는 두 가지 버전 제공 트래픽이 있습니다.
분기에 새 커밋을 추가하여 pull 요청을 계속 변경합니다. 커밋할 때마다
preview-deploy
트리거가 실행되어 서비스의 새 버전을 만들고 이 버전은 동일한 URL에서 제공됩니다.변경사항을 병합할 준비가 되면 pull 요청 병합을 클릭합니다. 원래
prod-deploy
트리거가 실행되고 pull 요청의 변경사항이 원래 URL에 반영됩니다.새 버전은 주 URL에서 트래픽의 100% 를 제공하지만, pull 요청의 미리보기 URL이 pull 요청의 가장 최신 커밋에 여전히 연결되어 있으므로 링크는 계속해서 작동합니다.
제한사항
만들 수 있는 버전 URL 수에는 제한이 있습니다. 저장소에 1,000개를 초과하는 pull 요청이 있을 것으로 예상되는 경우 cloudbuild-cleanup.yaml
에 표시된 대로 태그를 삭제하는 프로세스를 고려하세요.
코드 이해하기
cloudbuild.yaml
이 코드는 Cloud Build에서 제공하는 샘플 cloudbuild.yaml
에 기반하지만 update-traffic
을 실행하는 네 번째 단계가 있습니다.
cloudbuild.yaml
의 구성은 트래픽 분할에 변경사항을 적용합니다.
--to-latest
매개변수는 Cloud Run 페이지의 이 버전을 즉시 제공 체크박스와 동일한 기능을 제공합니다. 이렇게 하면 이 서비스 버전이 100%의 트래픽을 즉시 제공합니다.
cloudbuild-preview.yaml
이 코드는 cloudbuild.yaml
과 유사하지만 추가 단계가 있습니다.
서비스 이미지를 빌드하고 푸시한 후
cloudbuild-preview.yaml
은--no-traffic
플래그를 사용하여 서비스를 배포합니다. 즉, 이 버전이 최신 버전이지만 트래픽을 처리하는 데 사용되지는 않습니다.cloudbuild-preview.yaml
은 pull 요청 번호를 기반으로 커스텀 태그를 추가합니다. 이 경우 문자열에 'pr-' 프리픽스가 붙고 마지막에는 pull 요청 수로 끝납니다.이 시점에서 버전 URL은 작동 중이지만 pull 요청을 제출한 사용자는 이를 확인할 수 없습니다. 이는 GitHub 자체에서 로그에 연결된 링크만 볼 수 있고 Cloud Build 로그를 볼 수 없기 때문입니다. 충분한 권한이 있는 Cloud Build 프로젝트의 인증된 사용자만 로그를 볼 수 있습니다.
cloudbuild-preview.yaml
은 Cloud Build에서 제공하는 기본 대체 매개변수를 사용하여check_status.py
스크립트를 실행합니다. GitHub 저장소로 작업할 때 pull 요청 번호, 저장소 이름, 커밋 SHA와 같은 여러 매개변수를 사용할 수 있습니다.
이 트리거를 다시 실행하려면 GitHub에서 다른 커밋을 제출하세요. Console의 Cloud Build 페이지에서 이 트리거를 다시 실행할 수 없습니다.
cloudbuild-cleanup.yaml
이 코드는 cloudbuild.yaml
대신 사용할 수 있으며 삭제 기능이 추가되었습니다. 초기 단계에서 배포를 수행하며, 기능은 다음과 같이 확장됩니다.
Discovery API 및 GitHub API를 사용하여 종료된 pull 요청에 대한 서비스 태그를 확인합니다. 최소한 병합된 pull 요청이 있으므로 이 트리거는 실행됩니다.
식별된 태그를 삭제하세요.
check_status.py
check_status.py
스크립트는 Cloud Run 서비스, GitHub 저장소와 커밋에 대한 제공된 정보를 가져온 뒤 다음 작업을 수행합니다.
- Google API Python 클라이언트를 사용하여 서비스 이름, 태그, 버전 URL을 검색합니다.
- Secret Manager에서 제공하는 환경 변수에서 GitHub 토큰을 검색합니다.
- Python용 GitHub Client API를 사용하여 검색된 버전 URL에 연결되는 특정 커밋의 상태를 만듭니다.
삭제
이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다. 또한 튜토리얼을 위해 생성된 GitHub 구성을 삭제해야 합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
튜토리얼 리소스 삭제
이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다.
- Cloud Run 콘솔로 이동합니다.
- 'myservice' 목록을 선택하고 삭제를 클릭합니다.
- 확인 대화상자에서 삭제를 클릭합니다.
이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.
- Container Registry에서 가져온
gcr.io/PROJECT_ID/deployment-preview
라는 이름의 배포 미리보기 컨테이너 이미지 삭제 - Container Registry에서 가져온
gcr.io/PROJECT_ID/helloworld
라는 이름의 helloworld 컨테이너 이미지 삭제 - Cloud Build 트리거 삭제
- Secret Manager 보안 비밀 삭제
- Container Registry에서 가져온
튜토리얼 구성 삭제
GitHub에서 구성을 삭제하려면 GitHub에서 Google Cloud Build 애플리케이션을 삭제해야 합니다.
- GitHub 애플리케이션 설정으로 이동합니다.
- Google Cloud Build 목록에서 구성을 클릭합니다.
- Danger Zone 섹션에서 Uninstall(제거)를 클릭합니다.
- 확인 대화상자에서 확인을 클릭합니다.
생성된 GitHub 토큰도 삭제해야 합니다.
- GitHub 개인 액세스 토큰 페이지로 이동합니다.
- preview-deploy 목록에서 삭제를 클릭합니다.
- 확인 대화상자에서 이 토큰이 무엇인지 알고 있으며 삭제합니다를 클릭합니다.
GitHub 저장소도 삭제해야 합니다.
- 생성된 GitHub 저장소로 이동하여 설정 탭을 클릭합니다.
- Danger Zone 섹션에서 Delete this repository(이 저장소 삭제)를 클릭합니다.
- 확인 대화상자에서 저장소의 전체 이름을 입력하고 결과를 이해했으며 이 저장소를 삭제합니다.를 클릭합니다.
다음 단계
- Cloud Run의 롤백, 점진적 출시, 트래픽 마이그레이션에 대해 자세히 알아보기
- Cloud Build의 GitHub 앱 트리거에 대해 자세히 알아보기