您可以在管理菜单的平台部分中的持续集成页面上,为 Looker 持续集成 (CI) 功能配置设置。配置 Looker (Google Cloud Core) CI 设置,以确保 LookML 项目的质量和可靠性。CI 可在查询错误影响生产环境之前,发现并解决 SQL、数据测试、内容和 LookML 方面的问题。您还可以配置 CI 验证器,使其在向 LookML 代码库提交拉取请求时自动运行,从而简化开发工作流程。
持续集成的合规性功能
Looker CI 不在 FedRAMP High、FedRAMP Moderate 或 DoD Impact Level 5 (IL5) 授权边界内。
在为 Looker 实例启用 Looker CI 设置之前,请咨询您的授权机构,以确定 Looker CI 的合规性服务是否符合您组织的特定安全和法规要求。
对于 Looker (Google Cloud Core) 实例,每当有Assured Workloads 控制软件包可用时,Looker CI 功能都会作为默认产品添加到该软件包中,前提是满足该软件包的变更要求和流程。
启用持续集成
借助 Looker 的持续集成 (CI) 功能,您可以对 LookML 项目运行测试,从而提供更可靠、高效且用户友好的数据体验。您可以使用 CI 验证器在 SQL、数据测试、内容和 LookML 投入生产之前发现问题,从而验证 LookML 并防止用户遇到查询错误。您还可以将 CI 验证器配置为在 schedule 上或向 LookML 代码库提交拉取请求时自动运行。
Looker 管理员可以使用启用持续集成切换开关在您的实例上启用 CI。
Looker CI 用户
在实例中启用持续集成后,Looker 会自动在 Looker CI 用户用户组中创建 10 个具有 Looker CI 用户角色的 Looker CI 用户。Looker 管理员可以在用户管理页面的服务账号标签页中查看 Looker CI 用户。
如果您的实例使用访问权限授予来控制对探索的访问权限,则 Looker CI 用户必须包含在这些访问权限授予中。您可以按照管理员设置 - 用户属性文档页面中的说明,为 Looker CI 用户群组分配相关的用户属性值,从而纳入 CI 用户。
集成
借助持续集成,您可以在远程 Git 代码库中发生拉取请求或提交时自动运行 CI 套件。您可以配置持续集成,以与以下 Git 提供商集成:
- GitHub(使用 Looker CI GitHub 应用)
- GitLab(使用 Looker API 和 GitLab CI)
- Bitbucket(使用 Looker API 和 Bitbucket Pipelines)
- GitHub Actions(使用 Looker API 和 GitHub Actions)
GitHub
如果您有一个基于云的 GitHub 代码库作为 LookML 项目的远程代码库,您可以配置持续集成,以便在 LookML 开发者向 LookML 代码库提交拉取请求时自动运行 CI 套件。
对于使用 Private Service Connect 的专用连接或混合连接的 Looker (Google Cloud Core) 实例,或者位于 VPC Service Controls 边界内的实例,您的网络配置必须允许进出 GitHub 的入站和出站流量。在大多数情况下,当您配置 Looker (Google Cloud Core) 实例以连接到 GitHub 时,此网络配置已设置完毕。如需详细了解如何配置出站连接,请参阅使用 Private Service Connect 实现 Looker (Google Cloud 核心版) 对外部服务的出站访问文档页面。
如需在您的代码库中自动运行 CI 套件,持续集成需要以下权限:
- 拥有对代码库元数据和拉取请求的读取权限
- 拥有对代码库的提交状态、代码库钩子和工作流的读写权限
在 Looker IDE 中为 LookML 项目设置 Git 连接时,系统不会设置这些权限。如果您想使用拉取请求触发器来运行 CI,则必须为 LookML 项目设置 Git 连接(如设置和测试 Git 连接页面中所述),并且还必须按照配置 CI GitHub 应用部分中所述配置 CI GitHub 应用。
GitHub 表格
持续集成管理页面上的 GitHub 表格会列出 Looker 实例上已针对 LookML 项目配置的 GitHub 代码库。这些 GitHub 代码库由 LookML 开发者按照设置并测试 Git 连接文档页面中的说明进行配置。
对于列出的每个 GitHub 代码库,该表格都会显示相应代码库是否已配置 CI GitHub 应用:
- 已安装:相应代码库已获得 Looker CI GitHub 应用的授权,这使得 LookML 开发者向您的 LookML 代码库提交拉取请求时,系统能够自动运行 CI。
- 未安装:代码库尚未设置为与 Looker CI 集成以处理拉取请求。如需配置代码库以进行 CI 拉取请求集成,请参阅配置 CI GitHub 应用部分。
配置 CI GitHub 应用
如需为代码库授予 CI GitHub 应用权限,请按以下步骤操作:
- 在 Looker 的持续集成管理页面上,点击配置 GitHub 应用按钮。 系统随即会打开一个浏览器窗口,显示 GitHub 应用网页。
- 选择存储 LookML 的 GitHub 账号。
- 在代码库访问权限部分中,选择所有代码库以允许为资源所有者拥有的所有 Git 代码库进行 CI 集成,或选择仅选择代码库以选择要使用持续集成的代码库。
- 点击保存。
如果 Looker CI GitHub 应用已成功获得代码库的授权,Looker 会在持续集成管理页面上的 GitHub 表中为相应代码库显示已安装。
GitLab
您可以使用 Looker API 和官方 Looker Python SDK (looker-sdk) 从 GitLab CI 触发 Looker 持续集成运行。
如需从 GitLab CI 流水线触发 Looker CI 运行,请完成以下步骤:
在 GitLab 中配置 CI/CD 变量
在您的 GitLab 项目中,依次前往 Settings > CI/CD > Variables,然后创建以下 CI/CD 变量。将每个变量设置为 Masked,以保护敏感值:
LOOKERSDK_BASE_URL:Looker 实例的 API 网址(例如https://example.cloud.looker.com)LOOKERSDK_CLIENT_ID:在 Looker 的用户管理页面中生成的 API3 客户端 IDLOOKERSDK_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 项目的 IDLOOKER_SUITE_ID:您要运行的 CI 套件的 ID
Bitbucket
您可以使用 Looker API 和官方 Looker Python SDK (looker-sdk) 从 Bitbucket Pipelines 触发 Looker 持续集成运行。
如需从 Bitbucket Pipelines 触发 Looker CI 运行,请完成以下步骤:
在 Bitbucket 中配置代码库变量
在您的 Bitbucket 代码库中,依次前往代码库设置 > 代码库变量,然后创建以下代码库变量。将每个变量设置为 Secured,以保护敏感值:
LOOKERSDK_BASE_URL:Looker 实例的 API 网址(例如https://example.cloud.looker.com)LOOKERSDK_CLIENT_ID:在 Looker 的用户管理页面中生成的 API3 客户端 IDLOOKERSDK_CLIENT_SECRET:从 Looker 的用户管理页面生成的相应 API3 客户端密钥
为 Bitbucket Pipelines 创建 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 Pipelines 工作流
在代码库的根目录中,创建或更新 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 项目的 IDLOOKER_SUITE_ID:您要运行的 CI 套件的 ID
GitHub Actions
您可以使用 Looker API 和官方 Looker Python SDK (looker-sdk) 从 GitHub Actions 触发 Looker 持续集成运行。
如需从 GitHub Actions 工作流触发 Looker CI 运行,请完成以下步骤:
在 GitHub 中配置代码库密钥
在 GitHub 代码库中,依次前往设置 > 密钥和变量 > 操作,然后创建以下代码库密钥:
LOOKERSDK_BASE_URL:Looker 实例的 API 网址(例如https://example.cloud.looker.com)LOOKERSDK_CLIENT_ID:在 Looker 的用户管理页面中生成的 API3 客户端 IDLOOKERSDK_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 项目的 IDLOOKER_SUITE_ID:您要运行的 CI 套件的 ID
dbt Cloud 配置
如果您使用 dbt Cloud,则可以配置持续集成,以便在 dbt Cloud CI 作业完成时自动运行 CI 套件。运行 CI 套件有助于确保对 dbt 模型的更改不会破坏 LookML 项目。
如需配置 dbt Cloud 集成,请按照 dbt Cloud 配置部分中的以下步骤操作:
- 在 dbt Cloud Host URL 字段中,输入您的 dbt Cloud 账号的网址。
- 在 dbt Cloud API 密钥字段中,输入 dbt Cloud 服务账号令牌。
- 点击测试连接。Looker 会验证是否可以连接到您的 dbt Cloud 账号,然后检索您的 dbt Cloud 账号 ID。
- 点击保存。
用户属性
您可以配置用户属性,以便持续集成在验证运行期间替换这些属性。用户属性与 dbt Cloud 集成搭配使用,可将 Looker 指向由 dbt Cloud CI 作业创建的临时架构。
如需为 CI 配置用户属性默认值,请在用户属性部分中按以下步骤操作:
- 在用户属性字段中,从下拉列表中选择一个用户属性。如果未选择任何用户属性,Looker 将使用在数据库连接的主要数据集字段中定义的用户属性来运行 CI。
- 在 Value for CI run(CI 运行的值)字段中,输入应在 CI 运行中与此用户属性搭配使用的值。
- 点击保存。
您可以添加多个用户属性和值对。在用户属性部分中配置的每个用户属性都可在 CI 套件配置中作为替换项进行选择。
如需删除用户属性和值对,请点击移除。