GitLab에서 저장소 빌드

이 페이지에서는 웹훅 트리거를 사용하여 GitLab에서 빌드하는 방법을 설명합니다.

시작하기 전에

  • Cloud Build and Secret Manager API를 사용 설정합니다.

    API 사용 설정

  • 이 페이지에서 gcloud 명령어를 사용하려면 Cloud SDK를 설치합니다.

설정

GitLab에서 빌드하는 웹훅 트리거를 만들려면 먼저 SSH 키를 만들어야 GitLab에 대한 연결을 인증할 수 있습니다. 연결된 저장소 없이 트리거를 만들고 GitLab과 같은 외부 소스 코드 관리 시스템에서 코드에 액세스할 경우 인라인 빌드 구성에서 SSH 키를 가져와야 합니다.

이 섹션에서는 웹훅 트리거를 만들기 전에 SSH 키를 만들고 저장하는 방법을 설명합니다.

SSH 키 만들기

GitLab에서 코드에 액세스하려면 인라인 빌드 구성에서 SSH 키를 가져와야 합니다.

SSH 키를 만들려면 다음 안내를 따르세요.

  1. 터미널 창을 엽니다.

  2. working-dir이라는 이름의 새 디렉터리를 만들고 디렉터리로 이동합니다.

    mkdir working-dir
    cd working-dir
    
  3. 다음과 같이 새 GitLab SSH 키를 만듭니다. 여기서 gitlab.com은 GitLab 저장소의 URL입니다.

    ssh-keygen -t rsa -b 4096 -N '' -C gitlab.com -f id_gitlab
    

    이 명령어는 SSH 키에 대한 암호 없이 working-dir/id_gitlab에 새 SSH 키를 만듭니다. Cloud Build는 암호로 보호된 경우 SSH 키를 사용할 수 없습니다.

GitLab에서 SSH 액세스 사용 설정

서버 사용자가 자신의 고유 SSH 키를 추가하고 이러한 SSH 키를 사용하여 해당 컴퓨터와 GitLab 인스턴스 간 Git 작업을 보호할 수 있도록 GitLab에서 SSH 액세스를 사용 설정해야 합니다. GitLab에서 SSH를 사용하는 방법을 알아보려면 GitLab 및 SSH 키를 참조하세요.

GitLab에 공개 SSH 액세스 키 추가

GitLab에서 관리되는 저장소에서 다른 시스템이 수행하는 작업을 보호하려면 GitLab에 공개 SSH 액세스 키를 추가해야 합니다. 키를 추가하는 방법은 GitLab 계정에 SSH 키 추가를 참조하세요.

Secret Manager에서 사용자 인증 정보 생성 및 저장

SSH 키를 생성하면 로컬 환경에 id_gitlab 파일이 생성됩니다. 이 파일에는 인증과 관련된 민감한 정보가 포함되어 있으므로 이를 사용하여 빌드를 호출하기 전에 Secret Manager에 파일을 저장해야 합니다.

웹훅 트리거를 생성할 때 사용되는 보안 비밀 외에도 Secret Manager에서 보안 비밀을 만들어 Cloud Build에 수신되는 웹훅 이벤트를 검증하고 승인해야 합니다.

Secret Manager에서 사용자 인증 정보를 만들고 저장하려면 다음 안내를 따르세요.

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

    Secret Manager 페이지로 이동

  2. Secret Manager 페이지에서 보안 비밀 만들기를 클릭합니다.

  3. 보안 비밀 만들기 페이지에서 이름에 보안 비밀 이름을 입력합니다.

  4. 보안 비밀 값 필드에 보안 비밀 이름을 입력하거나 파일을 업로드합니다.

    SSH 키 파일을 업로드하려면 업로드를 클릭하여 working-dir/id_gitlab 파일을 포함합니다.

  5. 리전 섹션을 변경하지 않은 상태로 둡니다.

  6. 보안 비밀 만들기 버튼을 클릭하여 보안 비밀을 만듭니다.

보안 비밀을 만들면 Google Cloud Console에서 Cloud Build 서비스 계정인 ${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.comSecret Manager 보안 비밀 접근자 역할을 자동으로 부여합니다. 서비스 계정에 이 역할이 표시되지 않으면 서비스 계정에 Secret Manager 역할 부여에 설명된 다음 단계를 완료하세요.

이제 SSH 키를 저장했으므로 다음 명령어를 실행하여 해당 환경에서 SSH 키를 삭제할 수도 있습니다.

rm id_gitlab*

이제 웹훅 트리거를 만들 준비가 되었습니다.

웹훅 트리거 만들기

Console

Google Cloud Console을 사용하여 GitLab에서 빌드를 호출하는 웹훅 트리거를 만들려면 다음 안내를 따르세요.

  1. 트리거 페이지를 엽니다.

    빌드 트리거 페이지 열기

  2. 페이지 상단에서 프로젝트를 선택하고 열기를 클릭합니다.

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

  4. 다음 트리거 설정을 입력합니다.

    • 이름: 트리거의 이름입니다.
    • 설명(선택사항): 트리거에 대한 설명입니다.
    • 이벤트: 웹훅 이벤트를 선택하여 수신 웹훅 이벤트에 대한 응답으로 빌드를 시작하도록 트리거를 설정합니다.
    • 웹훅 URL: 웹훅 URL을 사용하여 수신 웹훅 이벤트를 인증합니다.

      • 보안 비밀: 수신 웹훅 이벤트를 인증하려면 보안 비밀이 필요합니다. 새 보안 비밀을 만들거나 기존 보안 비밀을 사용할 수 있습니다.

        새 보안 비밀을 만들려면 다음 안내를 따르세요.

        1. 새로 만들기를 선택합니다.
        2. 보안 비밀 만들기를 클릭합니다.

          웹훅 보안 비밀 만들기 팝업 상자가 표시됩니다.

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

        4. 보안 비밀 만들기를 클릭하여 보안 비밀을 저장합니다. 이 보안 비밀은 Secret Manager에 자동으로 생성되고 저장됩니다.

        기존 보안 비밀을 사용하려면 다음 안내를 따르세요.

        1. 기존 항목 사용을 선택합니다.
        2. 보안 비밀 필드의 드롭다운 메뉴에서 사용하려는 보안 비밀의 이름을 선택하거나 안내에 따라 리소스 ID로 보안 비밀을 추가합니다.
        3. 보안 비밀 버전 필드의 드롭다운 메뉴에서 보안 비밀 버전을 선택합니다.

        기존 보안 비밀을 사용하는 경우 Cloud Build 서비스 계정인 ${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com에 Secret Manager 보안 비밀 접근자 역할을 수동으로 부여해야 할 수 있습니다. 자세한 내용은 서비스 계정에 Secret Manager 역할 부여를 참조하세요.

      보안 비밀을 만들거나 선택하면 웹훅 URL 미리보기가 표시됩니다. URL에는 Cloud Build에서 생성한 API 키와 보안 비밀이 포함됩니다. Cloud Build에서 API 키를 검색할 수 없는 경우 API 키를 URL에 수동으로 추가하거나, 아직 키가 없는 경우 API 키를 가져오는 방법을 알아보세요.

      POST 메서드를 사용해서 HTTP 요청을 수행하여 URL을 사용하여 웹훅 이벤트를 호출할 수 있습니다.

       curl -X POST -H "application/json" "https://cloudbuild.googleapis.com/v1/projects/${PROJECT_NAME}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY}&secret=${SECRET_VALUE}" -d "{}"
      

      GitLab에서 웹훅을 만들 때 URL을 사용하는 방법은 GitLab에서 웹훅 만들기를 참조하세요.

    • 소스(선택사항): 웹훅 트리거가 실행될 때 빌드할 저장소입니다. 이 입력란은 비워둡니다. 이 예시에서는 빌드 구성이 인라인 빌드 구성이므로 소스가 필요하지 않습니다.

    • 구성: Google Cloud Console에서 인라인 빌드 구성을 만듭니다.

      다음 예시에서 인라인 빌드 구성은 해당 SSH 키를 사용하여 GitLab에 대한 연결을 인증하고 지정된 저장소에 액세스합니다. 그런 후 웹훅을 호출한 커밋을 체크아웃합니다.

      steps:
      # first, setup SSH:
      # 1- save the SSH key from Secret Manager to a file
      # 2- add the host key to the known_hosts file
      - name: gcr.io/cloud-builders/git
        args:
          - '-c'
          - |
            echo "$$SSHKEY" > /root/.ssh/id_rsa
            chmod 400 /root/.ssh/id_rsa
            ssh-keyscan gitlab.com > /root/.ssh/known_hosts
        entrypoint: bash
        secretEnv:
          - SSHKEY
        volumes:
          - name: ssh
            path: /root/.ssh
      # second, clone the repository
      - name: gcr.io/cloud-builders/git
        args:
          - clone
          - '-n'
          - 'git@gitlab.com/GITLAB_REPO'
          - .
        volumes:
          - name: ssh
            path: /root/.ssh
      # third, checkout the specific commit that invoked this build
      - name: gcr.io/cloud-builders/git
        args:
          - checkout
          - $_TO_SHA
      availableSecrets:
        secretManager:
        - versionName: PATH_TO_SECRET_VERSION
          env: SSHKEY
      

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

      • GITLAB_REPO는 GitLab 저장소의 경로입니다.
      • PATH_TO_SECRET_VERSION은 Secret Manager에 저장된 보안 비밀 버전에 대한 경로입니다. 이는 SSH 키가 포함된 보안 비밀입니다. 예를 들면 projects/project-id/secrets/secret-name/versions/1입니다.
      • SSHKEY는 보안 비밀 경로를 저장하는 경우에 사용되는 환경 이름입니다.
    • 대체(선택사항): 이 필드를 사용하여 트리거별 대체 변수를 정의할 수 있습니다.

      이 예에서는 커밋 ID와 연결된 특정 분기 이름을 찾아서 빌드 정의에서 이 분기 이름으로 전환한다고 가정해 보겠습니다. 이 데이터를 가져오려면 페이로드 바인딩을 사용하여 분기 이름을 저장하는 대체 변수를 만들면 됩니다.

      아래에서 다음 변수 및 값을 지정합니다.

      변수 이름 변수 값
      _BRANCH $(body.ref)
      _TO_SHA $(body.after)

      GitLab 이벤트와 관련된 페이로드를 보려면 이벤트의 GitLab 문서 페이지를 참조하세요.

    • 필터(선택사항): 트리거가 대체 변수를 기반으로 빌드를 실행할지 여부를 결정하는 트리거 내에서 규칙을 만들 수 있습니다.

      분기 이름이 main과 일치하는 경우 트리거가 빌드를 실행하도록 해야 하므로, '==' 연산자를 사용하여 정확한 일치를 확인합니다. 정규 표현식으로 일치를 수행하려면 '일치' 키워드를 사용할 수도 있습니다.

      필터로 다음을 지정합니다.

      • _BRANCH == refs/heads/main

      웹훅 트리거에 적용할 수 있는 필터링의 예시 구문을 더 보려면 CEL을 사용하여 빌드 이벤트 필터링을 참조하세요.

  5. 만들기를 클릭하여 빌드 트리거를 만듭니다.

gcloud

GitLab에서 빌드를 호출하는 웹훅 트리거를 만들려면 다음 안내를 따르세요.

     gcloud alpha builds triggers create webhook \
       --name=TRIGGER_NAME \
       --repo=PATH_TO_REPO \
       --secret=PATH_TO_SECRET \
       --substitutions=''
       --filter=''
       --inline-config=PATH_TO_INLINE_BUILD_CONFIG
       --branch=BRANCH_NAME # --tag=TAG_NAME

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

  • TRIGGER_NAME은 트리거의 이름입니다.
  • PATH_TO_REPO는 빌드를 호출할 저장소의 경로입니다. 예를 들면 https://www.github.com/owner/repo입니다.
  • PATH_TO_SECRET은 Secret Manager에 저장된 보안 비밀의 경로입니다. 예를 들면 projects/my-project/secrets/my-secret/versions/2입니다.
  • PATH_TO_INLINE_BUILD_CONFIG는 인라인 빌드 구성의 경로입니다.

  • BRANCH_NAME은 분기에서 빌드할 트리거를 설정하려는 경우 분기의 이름입니다.

  • TAG_NAME은 태그에서 빌드할 트리거를 설정하려는 경우 태그의 이름입니다.

GitLab에서 웹훅 만들기

GitLab에서 Cloud Build에 요청하려면 웹훅용 GitLab 문서에 설명된 안내에 따라 GitLab에서 웹훅을 만들어야 합니다.

이제 저장소에 대한 업데이트가 웹훅에 지정한 트리거 이벤트와 일치할 때마다 Cloud Build 웹훅 트리거에서 빌드가 자동으로 호출됩니다.

다음 단계