GitLab Enterprise Edition 호스트에 연결

이 페이지에서는 GitLab Enterprise Edition 호스트를 Cloud Build에 연결하는 방법을 설명합니다.

시작하기 전에

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

호스트 요구사항

  • GitLab Enterprise Edition 서버 인스턴스를 설치하지 않은 경우 GitLab Enterprise Edition 설치 가이드를 참조하세요.

    GitLab Enterprise Edition 서버 인스턴스를 설치하는 안내를 따를 때 다음 사항에 유의하세요.

    • HTTPS 프로토콜을 처리하려면 호스트를 구성해야 합니다. HTTP 프로토콜로 구성된 호스트는 지원되지 않습니다.

    • Google Cloud에서 호스트에 연결하는 데 사용하는 URL과 동일한 URL로 호스트를 구성해야 합니다. 자세한 내용은 외부 URL 구성에 대한 GitLab 문서를 참조하세요.

필수 IAM 권한

GitLab Enterprise Edition 호스트를 연결하려면 Cloud Build 연결 관리자(roles/cloudbuild.connectionAdmin) 역할을 사용자 계정에 부여합니다.

사용자 계정에 필요한 역할을 추가하려면 Cloud Build 리소스에 대한 액세스 구성을 참조하세요. Cloud Build와 연관된 IAM 역할에 대한 자세한 내용은 IAM 역할 및 권한을 참조하세요.

GitLab Enterprise Edition 인스턴스가 비공개 네트워크에서 호스팅되는 경우 비공개 네트워크의 GitLab Enterprise Edition에서 저장소 빌드를 참조하여 호스트 연결 전에 필요한 추가 IAM 역할에 대해 알아보세요.

GitLab Enterprise Edition 호스트에 연결

GitLab Enterprise Edition 인스턴스에 대한 호스트 연결을 만들려면 먼저 다음 단계를 완료하여 GitLab Enterprise Edition에서 개인 액세스 토큰을 만들어야 합니다.

  1. GitLab Enterprise Edition 인스턴스에 로그인합니다.

  2. 인스턴스의 GitLab Enterprise Edition 페이지 오른쪽 상단에 있는 아바타를 클릭합니다.

  3. 프로필 수정을 클릭합니다.

  4. 왼쪽 사이드바에서 액세스 토큰을 선택합니다.

    개인 액세스 토큰 페이지가 표시됩니다.

  5. 저장소 연결과 연결 해제에 사용할 수 있도록 api 범위의 액세스 토큰을 만듭니다.

  6. Cloud Build 저장소가 저장소에 있는 소스 코드에 액세스할 수 있도록 read_api 범위의 액세스 토큰을 만듭니다.

콘솔

GitLab Enterprise Edition 호스트를 Cloud Build에 연결하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 저장소 페이지를 엽니다.

    저장소 페이지 열기

    저장소 페이지가 표시됩니다.

  2. 페이지 상단에서 2세대 탭을 선택합니다.

  3. 상단 표시줄의 프로젝트 선택기에서 Google Cloud 프로젝트를 선택합니다.

  4. 호스트 연결 만들기를 클릭하여 새 호스트를 Cloud Build에 연결합니다.

  5. 왼쪽 패널에서 GitLab을 소스 제공업체로 선택합니다.

  6. 연결 구성 섹션에서 다음 정보를 입력합니다.

    1. 리전: 연결의 리전을 선택합니다.

    2. 이름: 연결의 이름을 입력합니다.

  7. 호스트 세부정보 섹션에서 다음 정보를 선택 또는 입력합니다.

    1. GitLab 제공업체: 자체 관리형 GitLab Enterprise Edition을 제공업체로 선택합니다.

    2. 호스트 URL: 연결의 호스트 URL을 입력합니다. 예를 들면 https://my-gle-server.net입니다.

    3. CA 인증서: 찾아보기를 클릭하여 자체 서명 인증서를 업로드합니다.

    4. 연결 유형에서 다음 옵션 중 하나를 선택합니다.

      1. 공개 인터넷: 공개 인터넷을 통해 인스턴스에 액세스할 수 있는 경우 이 옵션을 선택합니다.

      2. 비공개 네트워크 액세스: 인스턴스가 비공개 네트워크에서 호스팅되는 경우 이 옵션을 선택합니다.

      3. 서비스 디렉터리 서비스에서 서비스의 위치를 선택합니다.

        • 프로젝트 your-project
        • 다른 프로젝트 내
        • 직접 입력
        1. 다른 프로젝트 내 또는 직접 입력을 선택한 경우 다음 정보를 입력합니다.

          • 프로젝트: 드롭다운 메뉴에서 Google Cloud 프로젝트 ID를 입력하거나 선택합니다.

          • 리전: 이 필드는 연결의 리전을 미리 선택합니다. 서비스에 지정된 리전은 연결과 연관된 리전과 일치해야 합니다.

        2. 네임스페이스: 서비스의 네임스페이스를 선택합니다.

        3. 서비스: 네임스페이스에서 서비스 이름을 선택합니다.

  8. 개인 액세스 토큰 섹션에서 다음 정보를 입력합니다.

    1. API 액세스 토큰: api 범위 액세스 권한이 있는 토큰을 입력합니다. 이 토큰은 저장소 연결과 연결 해제에 사용됩니다.

    2. API 읽기 액세스 토큰: read_api 범위 액세스 권한이 있는 토큰을 입력합니다. Cloud Build 트리거는 이 토큰을 사용하여 저장소의 소스 코드에 액세스합니다.

  9. 연결을 클릭합니다.

    연결 버튼을 클릭하면 개인 액세스 토큰이 Secret Manager에 안전하게 저장됩니다. 호스트 연결에 따르면 Cloud Build에서 웹훅 보안 비밀도 자동으로 만듭니다. Secret Manager 페이지에서 보안 비밀을 보고 관리할 수 있습니다. Secret Manager 페이지에서 보안 비밀을 보고 관리할 수 있습니다.

이제 GitLab Enterprise Edition 연결이 성공적으로 생성되었습니다.

gcloud

GitLab Enterprise Edition 호스트를 Cloud Build에 연결하기 전에 다음 단계를 완료하여 사용자 인증 정보를 저장합니다.

  1. Secret Manager에 토큰을 저장합니다.

  2. 다음 명령어를 실행하여 Secret Manager에 웹훅 보안 비밀을 만듭니다.

     cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create my-gle-webhook-secret --data-file=-
    
  3. 호스트 연결을 만드는 데 사용하려는 것과 다른 Google Cloud 프로젝트에 보안 비밀을 저장하는 경우 다음 명령어를 입력하여 프로젝트에 Cloud Build 서비스 에이전트에 대한 액세스 권한을 부여합니다.

    PN=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT} \
      --role="roles/secretmanager.admin"
    

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

    • PROJECT_ID는 Google Cloud 프로젝트 ID입니다.

이제 GitLab Enterprise Edition 호스트를 Cloud Build에 연결하는 단계를 진행할 수 있습니다.

다음 단계를 완료합니다.

  1. 다음 명령어를 입력하여 GitLab Enterprise Edition 연결을 만듭니다.

    gcloud builds connections create gitlab CONNECTION_NAME \
      --host-uri=HOST_URI \
      --project=PROJECT_ID \
      --region=REGION \
      --authorizer-token-secret-version=projects/PROJECT_ID/secrets/API_TOKEN/versions/SECRET_VERSION \
      --read-authorizer-token-secret-version=projects/PROJECT_ID/secrets/READ_TOKEN/versions/SECRET_VERSION \
      --webhook-secret-secret-version=projects/PROJECT_ID/secrets/WEBHOOK_SECRET/versions/SECRET_VERSION
    

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

    • CONNECTION_NAME: 연결의 이름입니다.
    • HOST_URI: GitLab Enterprise Edition 인스턴스의 URI입니다. 예를 들면 https://my-gle-server.net입니다.
    • PROJECT_ID는 Google Cloud 프로젝트 ID입니다.
    • REGION: 연결의 리전입니다.
    • API_TOKEN: api 범위의 토큰 이름입니다.
    • READ_TOKEN: read_api 범위의 토큰 이름입니다.
    • SECRET_VERSION: 보안 비밀 버전입니다.
    • WEBHOOK_SECRET: 웹훅 보안 비밀입니다.

이제 GitLab Enterprise Edition 연결이 성공적으로 생성되었습니다.

Terraform

Terraform을 사용하여 GitLab Enterprise Edition 호스트를 Cloud Build에 연결할 수 있습니다.

다음 예시에서 코드 스니펫은 다음을 수행합니다.

  • Terraform Google 공급업체 구성
  • GitLab Enterprise Edition 개인 액세스 토큰을 저장할 보안 비밀 만들기
  • 보안 비밀에 액세스하기 위해 Cloud Build 서비스 에이전트에 필요한 권한 부여
  • GitLab Enterprise Edition 연결 만들기

    // Configure the Terraform Google provider
    terraform {
      required_providers {
        google = {}
      }
    }
    
    // Create secrets and grant permissions to the Cloud Build service agent
    resource "google_secret_manager_secret" "api-pat-secret" {
        project = "PROJECT_ID"
        secret_id = "GITLAB_PAT_API"
    
        replication {
            auto {}
         }
     }
    
     resource "google_secret_manager_secret_version" "api-pat-secret-version" {
         secret = google_secret_manager_secret.api-pat-secret.id
         secret_data = "GITLAB_API_TOKEN"
     }
    
     resource "google_secret_manager_secret" "read-pat-secret" {
         project = "PROJECT_ID"
         secret_id = "GITLAB_PAT_READ"
    
         replication {
             auto {}
         }
    }
    
    resource "google_secret_manager_secret_version" "read-pat-secret-version" {
        secret = google_secret_manager_secret.pat-secret.id
        secret_data = "GITLAB_API_TOKEN"
    }
    
    resource "google_secret_manager_secret" "webhook-secret-secret" {
        project = "PROJECT_ID"
        secret_id = "WEBHOOK_SECRET"
    
        replication {
            auto {}
        }
    }
    
    resource "google_secret_manager_secret_version" "webhook-secret-secret-version" {
        secret = google_secret_manager_secret.webhook-secret-secret.id
        secret_data = "WEBHOOK_SECRET_VALUE"
    }
    
    data "google_iam_policy" "serviceagent-secretAccessor" {
        binding {
            role = "roles/secretmanager.secretAccessor"
            members = ["serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"]
        }
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-pak" {
      project = google_secret_manager_secret.private-key-secret.project
      secret_id = google_secret_manager_secret.private-key-secret.secret_id
      policy_data = data.google_iam_policy.serviceagent-secretAccessor.policy_data
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-rpak" {
      project = google_secret_manager_secret.webhook-secret-secret.project
      secret_id = google_secret_manager_secret.webhook-secret-secret.secret_id
      policy_data = data.google_iam_policy.serviceagent-secretAccessor.policy_data
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-whs" {
      project = google_secret_manager_secret.webhook-secret-secret.project
      secret_id = google_secret_manager_secret.webhook-secret-secret.secret_id
      policy_data = data.google_iam_policy.serviceagent-secretAccessor.policy_data
    }
    
    // Create the connection and add the repository resource
    resource "google_cloudbuildv2_connection" "my-connection" {
        project = "PROJECT_ID"
        location = "REGION"
        name = "CONNECTION_NAME"
    
        gitlab_config {
            authorizer_credential {
                user_token_secret_version = google_secret_manager_secret_version.pat-secret-version.id
            }
            read_authorizer_credential {
                 user_token_secret_version = google_secret_manager_secret_version.pat-secret-version.id
            }
            webhook_secret_secret_version = google_secret_manager_secret_version.webhook-secret-secret-version.id
        }
    
        depends_on = [
            google_secret_manager_secret_iam_policy.policy-pak,
            google_secret_manager_secret_iam_policy.policy-rpak,
            google_secret_manager_secret_iam_policy.policy-whs
        ]
    }
    

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

  • PROJECT_ID는 Google Cloud 프로젝트 ID입니다.
  • GITLAB_PAT_API: api 액세스 권한이 있는 개인 액세스 토큰입니다.
  • GITLAB_API_TOKEN: 개인 액세스 토큰입니다.
  • GITLAB_PAT_READ: read_api 액세스 권한이 있는 개인 액세스 토큰입니다.
  • WEBHOOK_SECRET: 웹훅 보안 비밀 값이 포함된 보안 비밀 이름입니다.
  • WEBHOOK_SECRET_VALUE: 웹훅 보안 비밀의 값입니다.
  • REGION: 연결의 리전입니다.
  • CONNECTION_NAME: GitLab Enterprise Edition 연결 이름입니다.
  • URI: 연결의 URI입니다. 예를 들면 https://my-gitlab-enterprise-server.net입니다. 이제 GitLab Enterprise Edition 연결이 성공적으로 생성되었습니다.

다음 단계