관리자 설정 - 지속적 통합

관리 메뉴의 플랫폼 섹션에 있는 지속적 통합 페이지를 사용하면 Looker 지속적 통합 (CI) 기능의 설정을 구성할 수 있습니다. LookML 프로젝트의 품질과 안정성을 보장하도록 Looker (Google Cloud 핵심 서비스) CI 설정을 구성합니다. CI는 프로덕션에 도달하기 전에 쿼리 오류를 방지하고 SQL, 데이터 테스트, 콘텐츠, LookML의 문제를 식별합니다. 또한 LookML 저장소에 pull 요청이 제출될 때 CI 검사기가 자동으로 실행되도록 구성하여 개발 워크플로를 간소화할 수 있습니다.

지속적 통합의 규정 준수 기능

Looker CI는 FedRAMP 높음, FedRAMP 중간 또는 DoD 영향 수준 5 (IL5) 승인 경계에 포함되지 않습니다.

Looker 인스턴스에 Looker CI 설정을 사용 설정하기 전에 승인 기관과 상담하여 Looker CI의 규정 준수 제공이 조직의 특정 보안 및 규제 요구사항을 충족하는지 확인하세요.

Looker (Google Cloud 핵심 서비스) 인스턴스의 경우 사용 가능한 각 Assured Workloads 제어 패키지는 해당 패키지의 변경 요구사항 및 프로세스가 충족되면 Looker CI 기능을 기본 제공으로 추가합니다.

지속적 통합 사용 설정

Looker 지속적 통합 (CI) 기능을 사용하면 LookML 프로젝트에서 테스트를 실행하여 더 안정적이고 효율적이며 사용자 친화적인 데이터 환경을 제공할 수 있습니다. CI 검사기를 사용하여 프로덕션에 도달하기 전에 SQL, 데이터 테스트, 콘텐츠, LookML의 문제를 식별하여 LookML을 확인하고 사용자의 쿼리 오류를 방지할 수 있습니다. 또한 CI 검사기가 일정에 따라 또는 pull 요청이 제출될 때 자동으로 실행되도록 구성할 수 있습니다.

Looker 관리자는 지속적 통합 사용 설정 전환 버튼을 사용하여 인스턴스에서 CI를 사용 설정할 수 있습니다.

Looker CI 사용자

인스턴스에서 지속적 통합을 사용 설정하면 Looker는 Looker CI 사용자 역할이 있는 Looker CI 사용자 사용자 그룹에 10명의 Looker CI 사용자를 자동으로 만듭니다. Looker 관리자는 사용자 관리 페이지의 서비스 계정 탭에서 Looker CI 사용자를 볼 수 있습니다.

인스턴스에서 액세스 권한 부여를 사용하여 Explore에 대한 액세스를 제어하는 경우 Looker CI 사용자가 이러한 액세스 권한 부여에 포함되어야 합니다. 관리 설정 - 사용자 속성 문서 페이지에 설명된 대로 관련 사용자 속성 값을 Looker CI 사용자 그룹에 할당하여 CI 사용자를 포함할 수 있습니다.

통합

지속적 통합을 사용하면 원격 Git 저장소에서 pull 요청 또는 커밋이 발생할 때 CI 모음을 자동으로 실행할 수 있습니다. 다음 Git 제공업체와 통합하도록 지속적 통합을 구성할 수 있습니다.

  • GitHub (Looker CI GitHub 앱 사용)
  • GitLab (Looker API 및 GitLab CI 사용)
  • Bitbucket (Looker API 및 Bitbucket 파이프라인 사용)
  • GitHub Actions (Looker API 및 GitHub Actions 사용)

GitHub

클라우드 기반 GitHub 저장소를 LookML 프로젝트의 원격 저장소로 사용하는 경우 LookML 개발자가 LookML 저장소에 pull 요청을 제출할 때 CI 모음을 자동으로 실행하도록 지속적 통합을 구성할 수 있습니다.

저장소에서 CI 모음을 자동으로 실행하려면 지속적 통합에 다음 권한이 필요합니다.

  • 저장소의 메타데이터 및 pull 요청에 대한 읽기 액세스 권한
  • 저장소의 커밋 상태, 저장소 후크, 워크플로에 대한 읽기 및 쓰기 액세스 권한

이러한 권한은 Looker IDE에서 LookML 프로젝트의 Git 연결을 설정할 때 설정되지 않습니다. CI 실행에 pull 요청 트리거링을 사용하려면 LookML 프로젝트를 Git 연결로 설정해야 하며 (Git 연결 설정 및 테스트 페이지에 설명됨) CI GitHub 앱 구성 섹션에 설명된 대로 CI GitHub 앱도 구성해야 합니다.

GitHub 표

지속적 통합 관리 페이지의 GitHub 표에는 Looker 인스턴스의 LookML 프로젝트에 대해 구성된 GitHub 저장소가 나열됩니다. 이러한 GitHub 저장소는 LookML 개발자가 Git 연결 설정 및 테스트 문서 페이지에 설명된 대로 구성했습니다.

나열된 각 GitHub 저장소에 대해 표에는 저장소가 CI GitHub 앱으로 구성되었는지 여부가 표시됩니다.

CI GitHub 앱 구성

저장소에 CI GitHub 애플리케이션을 부여하려면 다음 단계를 따르세요.

  1. Looker의 지속적 통합 관리 페이지에서 GitHub 앱 구성 버튼을 클릭합니다. 그러면 GitHub 앱 웹페이지로 연결되는 브라우저 창이 열립니다.
  2. LookML이 저장된 GitHub 계정을 선택합니다.
  3. 저장소 액세스 섹션에서 모든 저장소 를 선택하여 리소스 소유자가 소유한 모든 Git 저장소에 CI 통합을 허용하거나 선택한 저장소만 을 선택하여 지속적 통합을 사용하려는 저장소를 선택합니다.
  4. 저장 을 클릭합니다.

Looker CI GitHub 애플리케이션이 저장소에 부여되면 Looker는 설치됨GitHub의 저장소에 대해 지속적 통합 관리 페이지에 표시합니다.

GitLab

Looker API 및 공식 Looker Python SDK (looker-sdk)를 사용하여 GitLab CI에서 Looker 지속적 통합 실행을 트리거할 수 있습니다.

GitLab CI 파이프라인에서 Looker CI 실행을 트리거하려면 다음 단계를 완료하세요.

  1. GitLab에서 CI/CD 변수를 구성합니다.
  2. GitLab CI용 Python 스크립트를 만듭니다.
  3. GitLab CI 워크플로를 구성합니다.

GitLab에서 CI/CD 변수 구성

GitLab 프로젝트에서 설정 > CI/CD > 변수 로 이동하여 다음 CI/CD 변수를 만듭니다. 각 변수를 마스크됨 으로 설정하여 민감한 값을 보호합니다.

  • LOOKERSDK_BASE_URL: Looker 인스턴스의 API URL (예: https://example.cloud.looker.com)
  • LOOKERSDK_CLIENT_ID: Looker의 사용자 관리 페이지에서 생성된 API3 클라이언트 ID
  • LOOKERSDK_CLIENT_SECRET: Looker의 사용자 관리 페이지에서 생성된 해당 API3 클라이언트 보안 비밀번호

GitLab CI용 Python 스크립트 만들기

저장소에서 run_looker_ci.py라는 Python 스크립트를 만듭니다. 이 스크립트는 Looker SDK를 사용하여 CI 실행을 트리거하고 실행이 완료될 때까지 폴링합니다.

import os
import sys
import time
import looker_sdk
from looker_sdk import models as mdls

# Retrieve required settings from environment variables
project_id = os.getenv("LOOKER_PROJECT_ID")
suite_id = os.getenv("LOOKER_SUITE_ID")

# GitLab CI specific environment variables
branch = os.getenv("CI_COMMIT_REF_NAME")
commit = os.getenv("CI_COMMIT_SHA")

if not all([project_id, suite_id, branch, commit]):
    print("Error: Missing required environment variables (LOOKER_PROJECT_ID, LOOKER_SUITE_ID, or GitLab vars).")
    sys.exit(1)

# Initialize the Looker SDK.
# The SDK automatically picks up LOOKERSDK_BASE_URL, LOOKERSDK_CLIENT_ID, and LOOKERSDK_CLIENT_SECRET.
print("Initializing Looker SDK...")
try:
    sdk = looker_sdk.init40()
except Exception as e:
    print(f"Failed to initialize Looker SDK: {e}")
    sys.exit(1)

# Configure the request body
print(f"Starting Looker CI run for project '{project_id}', suite '{suite_id}'...")
print(f"Branch: {branch} | Commit: {commit}")

request_body = mdls.CreateContinuousIntegrationRunRequest(
    suite_id=suite_id,
    branch=branch,
    commit=commit
)

# Trigger the CI run
try:
    run = sdk.create_continuous_integration_run(
        project_id=project_id,
        body=request_body
    )
    run_id = getattr(run, "run_id", getattr(run, "id", None))
    print(f"Looker CI run created successfully. Run ID: {run_id}")
except looker_sdk.error.SDKError as e:
    print(f"Failed to create Looker CI run: {e}")
    sys.exit(1)

# Poll for completion
run_status = run.status
terminal_statuses = ["cancelled", "error", "passed", "failed"]

while run_status not in terminal_statuses:
    print(f"Run {run_id} status is '{run_status}'. Waiting 15 seconds...")
    time.sleep(15)
    
    try:
        run = sdk.get_continuous_integration_run(
            project_id=project_id,
            run_id=run_id
        )
        run_status = run.status
    except looker_sdk.error.SDKError as e:
        print(f"Error while polling Looker CI run status: {e}")
        sys.exit(1)

print(f"Final Looker CI run status: {run_status}")

if run_status != "passed":
    print("Looker CI run did not pass. Failing the GitLab CI job.")
    sys.exit(1)

print("Looker CI run passed successfully!")

GitLab CI 워크플로 구성

저장소의 루트 디렉터리에서 .gitlab-ci.yml 파이프라인 구성 파일을 만들거나 업데이트하여 looker-sdk를 설치하고 run_looker_ci.py를 실행합니다.

stages:
  - test

looker-ci:
  stage: test
  image: python:3.10
  variables:
    LOOKER_PROJECT_ID: "LOOKER_PROJECT_ID"
    LOOKER_SUITE_ID: "LOOKER_SUITE_ID"
  script:
    - pip install looker-sdk
    - python run_looker_ci.py
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"

다음을 바꿉니다.

  • LOOKER_PROJECT_ID: 테스트하려는 Looker 프로젝트의 ID
  • LOOKER_SUITE_ID: 실행하려는 CI 모음의 ID

Bitbucket

Looker API 및 공식 Looker Python SDK (looker-sdk)를 사용하여 Bitbucket 파이프라인에서 Looker 지속적 통합 실행을 트리거할 수 있습니다.

Bitbucket 파이프라인에서 Looker CI 실행을 트리거하려면 다음 단계를 완료하세요.

  1. Bitbucket에서 저장소 변수를 구성합니다.
  2. Bitbucket 파이프라인용 Python 스크립트를 만듭니다.
  3. Bitbucket 파이프라인 워크플로를 구성합니다.

Bitbucket에서 저장소 변수 구성

Bitbucket 저장소에서 저장소 설정 > 저장소 변수 로 이동하여 다음 저장소 변수를 만듭니다. 각 변수를 보안됨 으로 설정하여 민감한 값을 보호합니다.

  • LOOKERSDK_BASE_URL: Looker 인스턴스의 API URL (예: https://example.cloud.looker.com)
  • LOOKERSDK_CLIENT_ID: Looker의 사용자 관리 페이지에서 생성된 API3 클라이언트 ID
  • LOOKERSDK_CLIENT_SECRET: Looker의 사용자 관리 페이지에서 생성된 해당 API3 클라이언트 보안 비밀번호

Bitbucket 파이프라인용 Python 스크립트 만들기

저장소에서 run_looker_ci.py라는 Python 스크립트를 만듭니다. 이 스크립트는 Looker SDK를 사용하여 CI 실행을 트리거하고 실행이 완료될 때까지 폴링합니다.

import os
import sys
import time
import looker_sdk
from looker_sdk import models as mdls

# Retrieve required settings from environment variables
project_id = os.getenv("LOOKER_PROJECT_ID")
suite_id = os.getenv("LOOKER_SUITE_ID")

# Bitbucket Pipelines specific environment variables
branch = os.getenv("BITBUCKET_BRANCH")
commit = os.getenv("BITBUCKET_COMMIT")

if not all([project_id, suite_id, branch, commit]):
    print("Error: Missing required environment variables (LOOKER_PROJECT_ID, LOOKER_SUITE_ID, or Bitbucket vars).")
    sys.exit(1)

# Initialize the Looker SDK.
# The SDK automatically picks up LOOKERSDK_BASE_URL, LOOKERSDK_CLIENT_ID, and LOOKERSDK_CLIENT_SECRET.
print("Initializing Looker SDK...")
try:
    sdk = looker_sdk.init40()
except Exception as e:
    print(f"Failed to initialize Looker SDK: {e}")
    sys.exit(1)

# Configure the request body
print(f"Starting Looker CI run for project '{project_id}', suite '{suite_id}'...")
print(f"Branch: {branch} | Commit: {commit}")

request_body = mdls.CreateContinuousIntegrationRunRequest(
    suite_id=suite_id,
    branch=branch,
    commit=commit
)

# Trigger the CI run
try:
    run = sdk.create_continuous_integration_run(
        project_id=project_id,
        body=request_body
    )
    run_id = getattr(run, "run_id", getattr(run, "id", None))
    print(f"Looker CI run created successfully. Run ID: {run_id}")
except looker_sdk.error.SDKError as e:
    print(f"Failed to create Looker CI run: {e}")
    sys.exit(1)

# Poll for completion
run_status = run.status
terminal_statuses = ["cancelled", "error", "passed", "failed"]

while run_status not in terminal_statuses:
    print(f"Run {run_id} status is '{run_status}'. Waiting 15 seconds...")
    time.sleep(15)
    
    try:
        run = sdk.get_continuous_integration_run(
            project_id=project_id,
            run_id=run_id
        )
        run_status = run.status
    except looker_sdk.error.SDKError as e:
        print(f"Error while polling Looker CI run status: {e}")
        sys.exit(1)

print(f"Final Looker CI run status: {run_status}")

if run_status != "passed":
    print("Looker CI run did not pass. Failing the Bitbucket Pipeline.")
    sys.exit(1)

print("Looker CI run passed successfully!")

Bitbucket 파이프라인 워크플로 구성

저장소의 루트 디렉터리에서 bitbucket-pipelines.yml 파일을 만들거나 업데이트하여 looker-sdk를 설치하고 run_looker_ci.py를 실행합니다.

image: python:3.10

pipelines:
  pull-requests:
    '**':
      - step:
          name: Looker CI
          script:
            - export LOOKER_PROJECT_ID="LOOKER_PROJECT_ID"
            - export LOOKER_SUITE_ID="LOOKER_SUITE_ID"
            - pip install looker-sdk
            - python run_looker_ci.py

다음을 바꿉니다.

  • LOOKER_PROJECT_ID: 테스트하려는 Looker 프로젝트의 ID
  • LOOKER_SUITE_ID: 실행하려는 CI 모음의 ID

GitHub Actions

Looker API 및 공식 Looker Python SDK (looker-sdk)를 사용하여 GitHub Actions에서 Looker 지속적 통합 실행을 트리거할 수 있습니다.

GitHub Actions 워크플로에서 Looker CI 실행을 트리거하려면 다음 단계를 완료하세요.

  1. GitHub에서 저장소 보안 비밀번호를 구성합니다.
  2. GitHub Actions용 Python 스크립트를 만듭니다.
  3. GitHub Actions 워크플로를 구성합니다.

GitHub에서 저장소 보안 비밀번호 구성

GitHub 저장소에서 설정 > 보안 비밀번호 및 변수 > 작업 으로 이동하여 다음 저장소 보안 비밀번호를 만듭니다.

  • LOOKERSDK_BASE_URL: Looker 인스턴스의 API URL (예: https://example.cloud.looker.com)
  • LOOKERSDK_CLIENT_ID: Looker의 사용자 관리 페이지에서 생성된 API3 클라이언트 ID
  • LOOKERSDK_CLIENT_SECRET: Looker의 사용자 관리 페이지에서 생성된 해당 API3 클라이언트 보안 비밀번호

GitHub Actions용 Python 스크립트 만들기

저장소에서 run_looker_ci.py라는 Python 스크립트를 만듭니다. 이 스크립트는 Looker SDK를 사용하여 CI 실행을 트리거하고 실행이 완료될 때까지 폴링합니다.

import os
import sys
import time
import looker_sdk
from looker_sdk import models as mdls

# Retrieve required settings from environment variables
project_id = os.getenv("LOOKER_PROJECT_ID")
suite_id = os.getenv("LOOKER_SUITE_ID")

# GitHub Actions specific environment variables
# GITHUB_HEAD_REF is the branch name for PRs. 
# GITHUB_REF_NAME can be used as a fallback for non-PR events.
branch = os.getenv("GITHUB_HEAD_REF") or os.getenv("GITHUB_REF_NAME")
# GITHUB_PR_SHA is the head commit SHA for PRs.
# GITHUB_SHA can be used as a fallback for non-PR events.
commit = os.getenv("GITHUB_PR_SHA") or os.getenv("GITHUB_SHA")

if not all([project_id, suite_id, branch, commit]):
    print("Error: Missing required environment variables (LOOKER_PROJECT_ID, LOOKER_SUITE_ID, or GitHub vars).")
    sys.exit(1)

# Initialize the Looker SDK.
# The SDK automatically picks up LOOKERSDK_BASE_URL, LOOKERSDK_CLIENT_ID, and LOOKERSDK_CLIENT_SECRET.
print("Initializing Looker SDK...")
try:
    sdk = looker_sdk.init40()
except Exception as e:
    print(f"Failed to initialize Looker SDK: {e}")
    sys.exit(1)

# Configure the request body
print(f"Starting Looker CI run for project '{project_id}', suite '{suite_id}'...")
print(f"Branch: {branch} | Commit: {commit}")

request_body = mdls.CreateContinuousIntegrationRunRequest(
    suite_id=suite_id,
    branch=branch,
    commit=commit
)

# Trigger the CI run
try:
    run = sdk.create_continuous_integration_run(
        project_id=project_id,
        body=request_body
    )
    run_id = getattr(run, "run_id", getattr(run, "id", None))
    print(f"Looker CI run created successfully. Run ID: {run_id}")
except looker_sdk.error.SDKError as e:
    print(f"Failed to create Looker CI run: {e}")
    sys.exit(1)

# Poll for completion
run_status = run.status
terminal_statuses = ["cancelled", "error", "passed", "failed"]

while run_status not in terminal_statuses:
    print(f"Run {run_id} status is '{run_status}'. Waiting 15 seconds...")
    time.sleep(15)
    
    try:
        run = sdk.get_continuous_integration_run(
            project_id=project_id,
            run_id=run_id
        )
        run_status = run.status
    except looker_sdk.error.SDKError as e:
        print(f"Error while polling Looker CI run status: {e}")
        sys.exit(1)

print(f"Final Looker CI run status: {run_status}")

if run_status != "passed":
    print("Looker CI run did not pass. Failing the GitHub Action.")
    sys.exit(1)

print("Looker CI run passed successfully!")

GitHub Actions 워크플로 구성

저장소에서 다음 구성으로 .github/workflows/looker-ci.yml에 워크플로 파일을 만듭니다.

name: Looker CI
on:
  pull_request:
    branches:
      - main

jobs:
  run-looker-ci:
    runs-on: ubuntu-latest


    env:
      # Automatically picked up by the Looker SDK
      LOOKERSDK_BASE_URL: ${{ secrets.LOOKERSDK_BASE_URL }}
      LOOKERSDK_CLIENT_ID: ${{ secrets.LOOKERSDK_CLIENT_ID }}
      LOOKERSDK_CLIENT_SECRET: ${{ secrets.LOOKERSDK_CLIENT_SECRET }}


      # Passed directly to the script
      LOOKER_PROJECT_ID: "LOOKER_PROJECT_ID"
      LOOKER_SUITE_ID: "LOOKER_SUITE_ID"
      GITHUB_PR_SHA: ${{ github.event.pull_request.head.sha }}

    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'

      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          pip install looker-sdk

      - name: Run Looker CI
        run: python run_looker_ci.py

다음을 바꿉니다.

  • LOOKER_PROJECT_ID: 테스트하려는 Looker 프로젝트의 ID
  • LOOKER_SUITE_ID: 실행하려는 CI 모음의 ID

dbt Cloud 구성

dbt Cloud를 사용하는 경우 지속적 통합을 구성하여 dbt Cloud CI 작업이 완료될 때 CI 모음을 자동으로 실행하도록 할 수 있습니다. CI 모음 실행은 dbt 모델 변경으로 인해 LookML 프로젝트가 중단되지 않도록 하는 데 도움이 됩니다.

dbt Cloud 통합을 구성하려면 dbt Cloud 구성 섹션에서 다음 단계를 따르세요.

  1. dbt Cloud 호스트 URL 필드에 dbt Cloud 계정의 URL을 입력합니다.
  2. dbt Cloud API 키 필드에 dbt Cloud 서비스 계정 토큰을 입력합니다.
  3. 연결 테스트 를 클릭합니다. Looker는 dbt Cloud 계정에 연결할 수 있는지 확인한 후 dbt Cloud 계정 ID 를 가져옵니다.
  4. 저장 을 클릭합니다.

사용자 속성

지속적 통합이 검증 실행 중에 재정의할 수 있는 사용자 속성을 구성할 수 있습니다. 사용자 속성은 dbt Cloud 통합과 함께 사용되어 Looker를 dbt Cloud CI 작업으로 생성된 임시 스키마로 안내합니다.

CI의 사용자 속성 기본값을 구성하려면 사용자 속성 섹션에서 다음 단계를 따르세요.

  1. 사용자 속성 필드의 드롭다운 목록에서 사용자 속성을 선택합니다. 사용자 속성이 선택되지 않은 경우 Looker는 CI 실행을 위해 기본 데이터 세트 필드에 정의된 사용자 속성을 데이터베이스 연결에 사용합니다.
  2. CI 실행 값 필드에 CI 실행에 이 사용자 속성과 함께 사용해야 하는 값을 입력합니다.
  3. 저장 을 클릭합니다.

여러 사용자 속성 및 값 쌍을 추가할 수 있습니다. 사용자 속성 섹션에서 구성된 각 사용자 속성은 CI 모음 구성에서 재정의로 선택할 수 있습니다.

사용자 속성 및 값 쌍을 삭제하려면 삭제 를 클릭합니다.