배포 미리보기 구성


이 튜토리얼에서는 Cloud Run 버전 URL을 사용하여 Cloud Build 트리거를 통해 GitHub pull 요청의 미리보기를 구현하는 방법을 보여줍니다. 미리보기를 사용하면 서비스의 서비스 중인 버전 또는 '프로덕션' 버전을 변경하지 않고도 서비스에 잠재적인 변경사항을 배포할 수 있습니다. 진행 중인 pull 요청의 0% 트래픽 버전을 배포하면 병합하기 전에 변경사항을 미리 보고 프로덕션에 가까운 환경에서 의도한 대로 작동하는지 확인할 수 있습니다.

이 튜토리얼은 공개 및 비공개 GitHub 저장소 모두에 적용됩니다. 미리보기 자체가 공개되지만 모호한 경우 URL로 제공됩니다.

목표

  • Cloud Run 서비스 만들기
  • GitHub에서 소스 제어 기반 지속적 통합 구현하기
  • Secret Manager를 통해 보안 비밀에 대한 액세스 권한을 생성하고 관리하기
  • 커스텀 Cloud Builder 배포하기
  • GitHub pull 요청에 따라 빌드를 호출하는 Cloud Build 트리거 만들기

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Cloud Run, Cloud Build, and Secret Manager 사용 설정

    API 사용 설정

  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Cloud Run, Cloud Build, and Secret Manager 사용 설정

    API 사용 설정

필요한 역할

튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

코드 샘플 검색

이 튜토리얼에서 쉽게 사용할 수 있도록 템플릿을 기반으로 한 Hello World 애플리케이션의 복사본이 포함된 새 GitHub 저장소를 만들게 될 것입니다. 그런 다음 커스텀 Cloud Build 구성을 사용하여 이 저장소에 새 파일을 추가하게 됩니다.

  1. GitHub에 로그인하여 템플릿 저장소로 이동하세요.
  2. '이 템플릿 사용'을 클릭하여 이 템플릿을 사용하여 새 저장소를 만듭니다.
    1. 저장소 이름을 helloworld-python으로 지정합니다.
    2. 저장소에 '공개' 또는 '비공개'를 선택합니다.
    3. 템플릿에서 저장소 만들기를 클릭합니다.
  3. 저장소에 새 Cloud Build 구성 파일을 만듭니다(전체 안내).

    1. 저장소 페이지에서 파일 추가 > 새 파일 만들기를 클릭합니다.
    2. 새 파일의 이름을 cloudbuild.yaml로 지정합니다.
    3. 아래 코드를 cloudbuild.yaml에 복사합니다.

      steps:
        - id: "build image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "build",
              "-t",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
              ".",
            ]
      
        - id: "push image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "push",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        - id: "deploy prod service"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "deploy",
              "${_SERVICE_NAME}",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
              "--allow-unauthenticated",
              "--image",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        # Force the new revision to serve 100% of traffic.
        - id: "ensure prod service live"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "services",
              "update-traffic",
              "${_SERVICE_NAME}",
              "--to-latest",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
            ]
      
      substitutions:
        _SERVICE_NAME: myservice
        _REGION: us-central1
      
      options:
        logging: CLOUD_LOGGING_ONLY
    4. 기본 선택인 'main 분기에 직접 커밋' 선택을 유지합니다.

    5. 새 파일 커밋을 클릭합니다.

빌드 트리거를 사용하여 서비스 배포

이 튜토리얼에서는 저장소의 기본 분기를 업데이트할 때마다 자동으로 빌드를 시작하도록 빌드 트리거를 설정하는 방법을 보여줍니다. 변경사항을 배포할 때마다 Cloud Build를 호출하여 서비스를 수동으로 배포할 수도 있습니다.

이 튜토리얼에서는 cloudbuild.yaml 파일을 사용하여 myservice라는 샘플 서비스를 배포합니다.

  1. Cloud Run 관리자 및 서비스 계정 사용자 역할을 Cloud Build 서비스 계정에 부여합니다(전체 안내).

    1. Google Cloud Console에서 Cloud Build 계정 설정 페이지로 이동합니다.

      Cloud Build 계정 설정 페이지로 이동

    2. Cloud Run 관리자 역할을 사용 설정합니다.

    3. 확인 대화상자에서 모든 서비스 계정에 액세스 권한 부여를 클릭합니다.

  2. GitHub 계정을 Cloud Build에 연결합니다(전체 안내).

    1. Google Cloud Console에서 Cloud Build 트리거 페이지로 이동합니다.

      Cloud Build 대시보드 페이지로 이동

    2. 저장소 연결을 클릭합니다.

    3. GitHub(Cloud Build GitHub 앱)를 소스로 선택하고 인증 및 승인 대화상자를 따라 단계별로 진행합니다.

    4. 'GITHUB_USER_NAME/helloworld-python' 저장소를 선택합니다.

    5. 저장소 연결을 클릭합니다.

    6. '트리거 만들기(선택사항)'에서 트리거 만들기를 클릭합니다.

  3. Cloud Build 트리거를 만듭니다(전체 안내).

    1. Cloud Build 트리거 페이지에서 트리거 만들기를 클릭합니다.
    2. 다음 세부정보를 입력합니다.
      • 이름: prod-deploy
      • 이벤트: 분기에 푸시
      • 소스 저장소: 'GITHUB_USER_NAME/helloworld-python'
      • 소스 분기: ^main$
      • 빌드 구성: Cloud Build 구성 파일(yaml 또는 json)
      • Cloud Build 구성 파일 위치: cloudbuild.yaml
    3. 만들기를 클릭합니다.
  4. 새 트리거를 수동으로 실행하세요.

    1. 새 트리거 목록에서 실행을 클릭합니다.
    2. 팝업에서 분기 이름(main)을 확인하고 트리거 실행을 클릭합니다.
    3. Cloud Build 기록으로 이동하여 빌드 진행 상황을 확인합니다.
    4. 빌드가 완료될 때까지 기다립니다.
  5. 배포에 성공했는지 확인합니다.

    1. Google Cloud Console에서 Cloud Run 페이지로 이동합니다.

      Cloud Run 페이지로 이동

    2. 서비스가 배포에 성공했음을 나타내는 녹색 체크표시가 있는지 확인합니다.

    3. 버전 탭을 클릭하고 'myservice-00001-'으로 시작하는 트래픽을 100% 제공하는 하나의 버전이 서비스에 포함되어 있는지 확인합니다.

    4. 서비스 URL을 클릭하고 서비스에 'Hello World!'가 표시되는지 확인합니다.

    서비스 URL이 강조표시된 Cloud Run 콘솔의 스크린샷
    'Hello World!'를 보여주는 배포된 Cloud Run 서비스 스크린샷

토큰 및 구성 만들기

이전 섹션에서 만든 prod-deploy 트리거는 기본 분기에 푸시가 수행될 때 서비스를 배포합니다. 이제 저장소에서 pull 요청이 생성되거나 업데이트될 때마다 실행되는 두 번째 트리거를 만듭니다.

새 트리거가 설정되면 미리보기가 배포되지만 pull 요청에는 미리보기로 연결되는 정보가 포함되지 않습니다. 이 기능을 설정하려면 다음과 같은 추가 구성 단계를 완료해야 합니다.

  • GitHub 토큰을 만듭니다.
  • 이 토큰을 Secret Manager에 저장합니다.
  • Cloud Build의 단계로 사용할 커스텀 이미지를 만듭니다.

GitHub 토큰 생성 및 저장

  1. pull 요청에 다시 쓸 수 있도록 GitHub 토큰을 만드세요(전체 안내).
    1. GitHub 개인 액세스 토큰 설정 페이지로 이동합니다.
    2. 새 토큰 생성을 클릭합니다.
    3. 다음 세부정보를 입력합니다.
      • 참고: preview-deploy
      • 만료: 30일
      • 범위:
        • 공개 저장소의 경우: repo:status('액세스 커밋 상태')
        • 비공개 저장소: repo('비공개 저장소 전체 제어')
    4. 토큰 생성을 클릭합니다.
    5. 생성된 토큰의 값을 복사합니다.
  2. Secret Manager에 GitHub 토큰을 저장합니다.

    1. Google Cloud Console에서 Secret Manager 페이지로 이동합니다.

      Secret Manager 페이지로 이동

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

    3. 다음 세부정보를 입력합니다.

      1. 이름: github_token
      2. 보안 비밀 값: GitHub에서 복사한 토큰 값을 붙여넣습니다.
    4. 보안 비밀 만들기를 클릭합니다.

  3. Cloud Build에서 이 보안 비밀에 액세스하도록 허용하세요.

    1. 새 브라우저 탭의 Google Cloud Console에서 Cloud Build 설정 페이지로 이동합니다.

      Cloud Build 페이지로 이동

    2. '서비스 계정 이메일' 값을 복사합니다.

      • 이메일은 PROJECT_NUM@cloudbuild.gserviceaccount.com입니다.
    3. Secret Manager로 돌아가서 권한 탭을 클릭하고 추가를 클릭합니다.

      • 새 주 구성원: PROJECT_NUM@cloudbuild.gserviceaccount.com
      • 역할: Secret Manager 보안 비밀 접근자
    4. 저장을 클릭합니다.

GitHub에서는 개인 액세스 토큰의 만료 설정을 권장하며 토큰이 만료되도록 설정되면 알림 이메일을 전송합니다. 배포 미리보기를 계속 사용하는 경우 토큰을 다시 생성할 때 github_token의 새 버전을 만듭니다. 다음 단계의 빌더는 최신 버전의 토큰을 검색하므로 미리보기가 계속 작동합니다.

Cloud Build용 새 이미지 만들기

pull 요청에 '배포 미리보기' 알림을 작성하는 스크립트는 Python 문서 샘플에 있습니다. 소스 코드에 이 스크립트를 추가하는 대신 선택적으로 이 스크립트를 프로젝트 내의 컨테이너에 빌드하고 해당 컨테이너를 Cloud Build 구성의 단계로 실행할 수 있습니다.

Cloud Shell을 사용하거나 로컬 머신(git 및 Google Cloud CLI를 설치 및 구성한 경우)을 사용하여 다음 안내를 완료할 수 있습니다. 아래 안내에서는 이러한 방법을 모두 보여줍니다.

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. 프로젝트를 사용하도록 Google Cloud CLI를 구성합니다. PROJECT_ID는 프로젝트 ID로 바꿉니다.
    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    Cloud Shell을 사용하는 경우 Google Cloud API 호출을 수행하기 위해 Google Cloud CLI를 승인해야 할 수 있습니다. 계속하려면 승인을 클릭합니다.
  3. 새 컨테이너 이미지를 만듭니다.
    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
    
  4. 컨테이너가 생성되었는지 확인합니다.
    gcloud container images list
    
  5. 클론된 저장소를 삭제합니다.
    cd ..
    rm -rf python-docs-samples
    

새 Cloud Build 구성 추가

저장소에는 기본 분기에서 사용되는 cloudbuild.yaml 파일이 이미 있습니다. 이제 이 새로운 트리거에 대한 새 구성을 만듭니다.

  1. GitHub 저장소 페이지에서 파일 추가 > 새 파일 만들기를 클릭합니다.

    1. 새 파일의 이름을 cloudbuild-preview.yaml로 지정합니다.
    2. 아래의 코드를 복사하여 새 파일에 붙여넣으세요.
    steps:
      - id: "build image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "build",
            "-t",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            ".",
          ]
    
      - id: "push image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "push",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
          ]
    
      - id: "deploy revision with tag"
        name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
        entrypoint: "gcloud"
        args:
          [
            "run",
            "deploy",
            "${_SERVICE_NAME}",
            "--platform",
            "managed",
            "--region",
            "${_REGION}",
            "--image",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            "--tag",
            "pr-${_PR_NUMBER}",
            "--no-traffic",
          ]
    
      - id: "link revision on pull request"
        name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
        secretEnv: ["GITHUB_TOKEN"]
        args:
          [
            "set",
            "--project-id",
            "${PROJECT_ID}",
            "--region",
            "${_REGION}",
            "--service",
            "${_SERVICE_NAME}",
            "--pull-request",
            "${_PR_NUMBER}",
            "--repo-name",
            "${REPO_FULL_NAME}",
            "--commit-sha",
            "${SHORT_SHA}",
          ]
    
    substitutions:
      _SERVICE_NAME: myservice
      _REGION: us-central1
    
    options:
      dynamicSubstitutions: true
      logging: CLOUD_LOGGING_ONLY
    
    availableSecrets:
      secretManager:
        - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
          env: "GITHUB_TOKEN"
  2. 저장소의 기본 분기에 변경사항을 커밋합니다.

보조 트리거 만들기

모든 기초 작업이 준비되었으므로 새 트리거를 만듭니다.

  1. 새 Cloud Build 트리거를 만듭니다(전체 안내).

    1. Google Cloud Console에서 Cloud Build 트리거 페이지로 이동합니다.

      Cloud Build 대시보드 페이지로 이동

    2. 트리거 만들기를 클릭합니다.

    3. 다음 세부정보를 입력합니다.

      • 이름: preview-deploy
      • 이벤트: pull 요청
      • 소스 저장소: 'GITHUB_USER_NAME/helloworld-python'
      • 기본 분기: ^main$
      • 댓글 관리: 소유자 및 공동작업자를 제외하고 필수 항목
        • 저장소 소유자의 경우 미리보기는 생성한 pull 요청에 자동으로 빌드됩니다.
        • 모든 사용자가 변경사항을 미리 볼 수 있게 하려면 '필요하지 않음'을 선택하는 것이 보안에 미치는 영향에 대하여 자세히 읽어보세요.
      • 구성: Cloud Build 구성 파일
      • Cloud Build 구성 파일 위치: cloudbuild-preview.yaml
    4. 만들기를 클릭합니다.

성공 여부 확인

이 새 트리거는 새 pull 요청이 생성되면 실행되므로 새 pull 요청을 만들어 테스트해야 합니다.

  1. 저장소로 이동하여 새 분기에서 app.py를 시각적으로 변경합니다.
    1. app.py로 이동하고 연필 아이콘()을 클릭합니다.
      웹사이트에서 파일을 편집하기 위한 GitHub 인터페이스 스크린샷
    2. 예를 들어 'Hello'를 'Greetings'로 변경하세요.
    3. 이 커밋에 대한 새 분기를 만들고 가져오기 요청을 시작합니다를 선택한 후 변경 제안을 클릭합니다.
  2. 이 분기를 사용하여 새 pull 요청을 만듭니다.

    트리거가 올바르게 구성되었다면 pull 요청을 만드는 즉시 새 확인이 표시됩니다.

    확인 대기 중인 상태인 GitHub 인터페이스의 스크린샷
  3. 확인 이름은 트리거의 이름과 프로젝트 ID입니다. 세부정보 > Google Cloud Build에 대한 자세한 내용 보기를 클릭하여 빌드 진행 상태를 확인합니다.

    트리거가 실패하고 빌드를 다시 제출해야 하는 경우 또는 pull 요청에 다른 변경사항을 적용하려는 경우 동일한 분기에 변경사항을 커밋해야 합니다. pull 요청에 대한 새 커밋마다 새 빌드가 트리거됩니다.

  4. 트리거가 완료되면 pull 요청에 대해 '배포 미리보기'라는 새 상태 확인이 표시됩니다. 계정이 사용 중인 토큰을 소유하고 있기 때문에 표시된 아이콘은 사용자의 아바타입니다.

    확인이 완료된 GitHub 인터페이스의 스크린샷
  5. 세부정보를 클릭하여 미리보기로 이동합니다. 표시된 URL은 원래 서비스 URL과 동일하지만 'pr-1---' 프리픽스가 붙습니다.

    'Greetings World!'를 보여주는 배포된 Cloud Run 서비스 스크린샷

    원래의 서비스 URL로 이동하면 원본 콘텐츠가 표시됩니다.

    여전히 'Hello World!'가 표시되는, 기존에 배포된 Cloud Run 서비스의 스크린샷
  6. 서비스 버전 목록을 확인하여 Cloud Run에서 서비스 상태를 확인합니다. 이제 원본과 미리보기라는 두 가지 버전 제공 트래픽이 있습니다.

    두 가지 활성 버전이 포함된 Cloud Run 콘솔의 스크린샷
  7. 분기에 새 커밋을 추가하여 pull 요청을 계속 변경합니다. 커밋할 때마다 preview-deploy 트리거가 실행되어 서비스의 새 버전을 만들고 이 버전은 동일한 URL에서 제공됩니다.

    세 가지 버전이 포함된 Cloud Run 콘솔의 스크린샷
  8. 변경사항을 병합할 준비가 되면 pull 요청 병합을 클릭합니다. 원래 prod-deploy 트리거가 실행되고 pull 요청의 변경사항이 원래 URL에 반영됩니다.

    'Greetings World!'를 보여주는 새로 배포된 Cloud Run 서비스 스크린샷

    새 버전은 주 URL에서 트래픽의 100% 를 제공하지만, pull 요청의 미리보기 URL이 pull 요청의 가장 최신 커밋에 여전히 연결되어 있으므로 링크는 계속해서 작동합니다.

    네 가지 버전이 포함된 Cloud Run 콘솔의 스크린샷

제한사항

만들 수 있는 버전 URL 수에는 제한이 있습니다. 저장소에 1,000개를 초과하는 pull 요청이 있을 것으로 예상되는 경우 cloudbuild-cleanup.yaml에 표시된 대로 태그를 삭제하는 프로세스를 고려하세요.

코드 이해하기

cloudbuild.yaml

이 코드는 Cloud Build에서 제공하는 샘플 cloudbuild.yaml에 기반하지만 update-traffic을 실행하는 네 번째 단계가 있습니다.

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  logging: CLOUD_LOGGING_ONLY

cloudbuild.yaml의 구성은 트래픽 분할에 변경사항을 적용합니다. --to-latest 매개변수는 Cloud Run 페이지의 이 버전을 즉시 제공 체크박스와 동일한 기능을 제공합니다. 이렇게 하면 이 서비스 버전이 100%의 트래픽을 즉시 제공합니다.

cloudbuild-preview.yaml

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
      ]

  - id: "deploy revision with tag"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        "--tag",
        "pr-${_PR_NUMBER}",
        "--no-traffic",
      ]

  - id: "link revision on pull request"
    name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "set",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--pull-request",
        "${_PR_NUMBER}",
        "--repo-name",
        "${REPO_FULL_NAME}",
        "--commit-sha",
        "${SHORT_SHA}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

이 코드는 cloudbuild.yaml과 유사하지만 추가 단계가 있습니다.

  1. 서비스 이미지를 빌드하고 푸시한 후 cloudbuild-preview.yaml--no-traffic 플래그를 사용하여 서비스를 배포합니다. 즉, 이 버전이 최신 버전이지만 트래픽을 처리하는 데 사용되지는 않습니다.

  2. cloudbuild-preview.yaml은 pull 요청 번호를 기반으로 커스텀 태그를 추가합니다. 이 경우 문자열에 'pr-' 프리픽스가 붙고 마지막에는 pull 요청 수로 끝납니다.

    이 시점에서 버전 URL은 작동 중이지만 pull 요청을 제출한 사용자는 이를 확인할 수 없습니다. 이는 GitHub 자체에서 로그에 연결된 링크만 볼 수 있고 Cloud Build 로그를 볼 수 없기 때문입니다. 충분한 권한이 있는 Cloud Build 프로젝트의 인증된 사용자만 로그를 볼 수 있습니다.

  3. cloudbuild-preview.yaml은 Cloud Build에서 제공하는 기본 대체 매개변수를 사용하여 check_status.py 스크립트를 실행합니다. GitHub 저장소로 작업할 때 pull 요청 번호, 저장소 이름, 커밋 SHA와 같은 여러 매개변수를 사용할 수 있습니다.

이 트리거를 다시 실행하려면 GitHub에서 다른 커밋을 제출하세요. Console의 Cloud Build 페이지에서 이 트리거를 다시 실행할 수 없습니다.

cloudbuild-cleanup.yaml


steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

  # Cleanup tags against closed pull requests
  - id: "clean up old tag"
    name: "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "cleanup",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--repo-name",
        "${REPO_FULL_NAME}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

이 코드는 cloudbuild.yaml 대신 사용할 수 있으며 삭제 기능이 추가되었습니다. 초기 단계에서 배포를 수행하며, 기능은 다음과 같이 확장됩니다.

  1. Discovery API 및 GitHub API를 사용하여 종료된 pull 요청에 대한 서비스 태그를 확인합니다. 최소한 병합된 pull 요청이 있으므로 이 트리거는 실행됩니다.

  2. 식별된 태그를 삭제하세요.

check_status.py

def set(
    dry_run: str,
    project_id: str,
    region: str,
    service: str,
    repo_name: str,
    commit_sha: str,
    pull_request: str,
) -> None:
    """Set a status on a GitHub commit to a specific revision URL"""
    service_obj = get_service(project_id, region, service)
    revision_url = get_revision_url(service_obj, tag=make_tag(pull_request))

    ghtoken = os.environ.get("GITHUB_TOKEN", None)

    if not ghtoken:
        raise ValueError("GITHUB_TOKEN not defined.")

    try:
        repo = github.Github(ghtoken).get_repo(repo_name)
    except GithubException as e:
        error(
            e.data["message"],
            context=f"finding repo {repo_name}. Is it a private repo, and does your token have the correct permissions?",
        )

    try:
        commit = repo.get_commit(sha=commit_sha)
    except GithubException as e:
        error(e.data["message"], context=f"finding commit {commit_sha}")

    # ...

    commit.create_status(
        state="success",
        target_url=revision_url,
        context=f"Deployment Preview for {service}",
        description="Your preview is now available.",
    )
    click.secho("Success: ", fg="green", bold=True, nl=False)
    click.echo(
        f"Status created on {repo_name}, commit {commit.sha[:7]}, "
        f"linking to {revision_url} on service {service_obj['metadata']['name']}"
    )

check_status.py 스크립트는 Cloud Run 서비스, GitHub 저장소와 커밋에 대한 제공된 정보를 가져온 뒤 다음 작업을 수행합니다.

  • Google API Python 클라이언트를 사용하여 서비스 이름, 태그, 버전 URL을 검색합니다.
  • Secret Manager에서 제공하는 환경 변수에서 GitHub 토큰을 검색합니다.
  • Python용 GitHub Client API를 사용하여 검색된 버전 URL에 연결되는 특정 커밋의 상태를 만듭니다.

삭제

이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다. 또한 튜토리얼을 위해 생성된 GitHub 구성을 삭제해야 합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

튜토리얼 리소스 삭제

  1. 이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다.

    1. Cloud Run 콘솔로 이동합니다.
    2. 'myservice' 목록을 선택하고 삭제를 클릭합니다.
    3. 확인 대화상자에서 삭제를 클릭합니다.
  2. 이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.

튜토리얼 구성 삭제

GitHub에서 구성을 삭제하려면 GitHub에서 Google Cloud Build 애플리케이션을 삭제해야 합니다.

  1. GitHub 애플리케이션 설정으로 이동합니다.
  2. Google Cloud Build 목록에서 구성을 클릭합니다.
  3. Danger Zone 섹션에서 Uninstall(제거)를 클릭합니다.
  4. 확인 대화상자에서 확인을 클릭합니다.

생성된 GitHub 토큰도 삭제해야 합니다.

  1. GitHub 개인 액세스 토큰 페이지로 이동합니다.
  2. preview-deploy 목록에서 삭제를 클릭합니다.
  3. 확인 대화상자에서 이 토큰이 무엇인지 알고 있으며 삭제합니다를 클릭합니다.

GitHub 저장소도 삭제해야 합니다.

  1. 생성된 GitHub 저장소로 이동하여 설정 탭을 클릭합니다.
  2. Danger Zone 섹션에서 Delete this repository(이 저장소 삭제)를 클릭합니다.
  3. 확인 대화상자에서 저장소의 전체 이름을 입력하고 결과를 이해했으며 이 저장소를 삭제합니다.를 클릭합니다.

다음 단계