בדף Continuous Integration שבקטע Platform בתפריט Admin אפשר להגדיר את ההגדרות של התכונה Continuous Integration (CI) ב-Looker. כדי להבטיח את האיכות והמהימנות של פרויקטים ב-LookML, צריך להגדיר את הגדרות ה-CI ב-Looker (Google Cloud core). ה-CI מונע שגיאות בשאילתות ומזהה בעיות ב-SQL, בבדיקות נתונים, בתוכן וב-LookML לפני שהן מגיעות לסביבת הייצור. אפשר גם להגדיר את כלי האימות של CI כך שיפעלו באופן אוטומטי כששולחים בקשת משיכה למאגר LookML, וכך לייעל את תהליך העבודה של הפיתוח.
יכולות התאימות של אינטגרציה רציפה
Looker CI לא נכלל בגבולות ההרשאה של FedRAMP High, FedRAMP Moderate או DoD Impact Level 5 (IL5).
לפני שמפעילים את הגדרת Looker CI במופע Looker, צריך להתייעץ עם הגורם המוסמך כדי לקבוע אם פתרונות התאימות של Looker CI עומדים בדרישות האבטחה והרגולטוריות הספציפיות של הארגון.
במקרים של מופעי Looker (Google Cloud core), כל חבילת בקרה של Assured Workloads שתהיה זמינה תוסיף תכונות של Looker CI כהצעות ברירת מחדל, אחרי שיעמדו בדרישות השינוי של החבילה ובתהליכים שלה.
הפעלת אינטגרציה רציפה
התכונה שילוב רציף (CI) ב-Looker מאפשרת להריץ בדיקות בפרויקט LookML כדי לספק חוויות נתונים אמינות, יעילות וידידותיות יותר למשתמש. אתם יכולים להשתמש בכלי האימות של CI כדי לזהות בעיות ב-SQL, בבדיקות נתונים, בתוכן וב-LookML לפני שהן מגיעות לסביבת הייצור, כדי לאמת את ה-LookML ולמנוע שגיאות בשאילתות של המשתמשים. אפשר גם להגדיר את כלי האימות של CI כך שיפעלו אוטומטית לפי לוח זמנים או כששולחים בקשת משיכה למאגר LookML.
אדמין ב-Looker יכול להשתמש במתג הפעלה של אינטגרציה רציפה (CI) כדי להפעיל CI במופע.
משתמשי Looker CI
כשמפעילים אינטגרציה רציפה במופע, מערכת Looker יוצרת באופן אוטומטי 10 משתמשי Looker CI בקבוצת המשתמשים Looker CI Users עם התפקיד Looker CI Users. אדמין ב-Looker יכול לראות את משתמשי Looker CI בכרטיסייה חשבונות שירות בדף ניהול חשבון ארגוני משתמשים.
אם אתם משתמשים בהענקת גישה כדי לשלוט בגישה לניתוחים, משתמשי Looker CI צריכים להיכלל בהענקת הגישה הזו. כדי לכלול את משתמשי ה-CI, צריך להקצות את ערכי מאפייני המשתמש הרלוונטיים לקבוצה Looker CI Users, כמו שמתואר בדף התיעוד הגדרות אדמין – מאפייני משתמש.
שילובים
שילוב רציף מאפשר להריץ חבילות CI באופן אוטומטי כשמתבצעות בקשות משיכה או פעולות Commit במאגר Git המרוחק. אפשר להגדיר אינטגרציה רציפה עם ספקי 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 במאגר, צריך לתת לאינטגרציה רציפה את ההרשאות הבאות:
- גישת קריאה למטא-נתונים ולבקשות משיכה של המאגר
- גישת קריאה וכתיבה לסטטוסים של השמירות, ל-hooks של המאגר ולתהליכי העבודה במאגר
ההרשאות האלה לא מוגדרות כשמגדירים חיבור Git לפרויקט LookML בסביבת הפיתוח המשולבת (IDE) של Looker. אם רוצים להשתמש בהפעלת CI באמצעות בקשות משיכה, צריך להגדיר את פרויקט LookML עם חיבור Git (כפי שמתואר בדף הגדרה ובדיקה של חיבור Git), וגם להגדיר את אפליקציית CI GitHub כמו שמתואר בקטע הגדרת אפליקציית CI GitHub.
טבלת GitHub
בטבלה GitHub בדף האדמין Continuous Integration מפורטים מאגרי GitHub שהוגדרו לפרויקטים של LookML במופע Looker. מאגרי GitHub האלה הוגדרו על ידי מפתחי LookML, כמו שמתואר בדף התיעוד הגדרה ובדיקה של חיבור Git.
לכל מאגר GitHub שמופיע ברשימה, בטבלה מוצג אם המאגר הוגדר עם אפליקציית CI GitHub:
- Installed (הותקן): למאגר הוענקה אפליקציית Looker CI GitHub, שמאפשרת הפעלה אוטומטית של CI כשמפתחי LookML שולחים בקשות משיכה למאגר LookML.
- לא מותקן: המאגר לא הוגדר לשילוב של בקשות משיכה עם Looker CI. הוראות להגדרת המאגר לשילוב של בקשות משיכה ב-CI מופיעות בקטע הגדרת אפליקציית CI GitHub.
הגדרת אפליקציית CI GitHub
כדי לתת לאפליקציית CI GitHub גישה למאגר, פועלים לפי השלבים הבאים:
- בדף ניהול חשבון ארגוני Continuous Integration ב-Looker, לוחצים על הלחצן Configure GitHub App. ייפתח חלון דפדפן עם דף האינטרנט של אפליקציות GitHub.
- בוחרים את החשבון ב-GitHub שבו מאוחסן קוד ה-LookML.
- בקטע Repository access (גישה למאגר), בוחרים באפשרות All repositories (כל המאגרים) כדי לאפשר שילובים של CI לכל מאגרי ה-Git שבבעלות בעל המשאב, או באפשרות Only select repositories (רק מאגרים נבחרים) כדי לבחור את המאגרים שבהם רוצים להשתמש בשילוב רציף.
- לוחצים על Save.
אם אפליקציית Looker CI GitHub קיבלה הרשאה למאגר, המצב Installed יוצג לגבי המאגר בטבלת GitHub בדף ניהול חשבון ארגוני Continuous Integration.
GitLab
אפשר להפעיל הרצות של שילוב רציף (CI) ב-Looker מ-GitLab CI באמצעות Looker API ו-Looker Python SDK הרשמי (looker-sdk).
כדי להפעיל ריצת CI של Looker מצינור CI של GitLab, מבצעים את השלבים הבאים:
הגדרת משתני CI/CD ב-GitLab
בפרויקט GitLab, עוברים אל Settings > CI/CD > Variables ויוצרים את משתני ה-CI/CD הבאים. מגדירים כל משתנה למוסתר כדי להגן על ערכים רגישים:
-
LOOKERSDK_BASE_URL: כתובת ה-URL של ה-API של מופע Looker (לדוגמה,https://example.cloud.looker.com) LOOKERSDK_CLIENT_ID: מזהה הלקוח של API3 שנוצר בדף ניהול חשבון ארגוני Users ב-Looker-
LOOKERSDK_CLIENT_SECRET: הסוד של הלקוח API3 שנוצר מתוך דף ניהול חשבון ארגוני Users ב-Looker
יצירת סקריפט Python ל-GitLab CI
יוצרים סקריפט Python בשם run_looker_ci.py במאגר. הסקריפט הזה משתמש ב-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 שרוצים לבדוק -
LOOKER_SUITE_ID: המזהה של חבילת ה-CI שרוצים להריץ
Bitbucket
אפשר להפעיל ריצות של שילוב רציף (CI) ב-Looker מ-Bitbucket Pipelines באמצעות Looker API ו-Looker Python SDK הרשמי (looker-sdk).
כדי להפעיל ריצת CI של Looker מ-Bitbucket Pipelines:
- הגדרת משתני מאגר ב-Bitbucket
- יוצרים את סקריפט Python עבור Bitbucket Pipelines.
- הגדרת תהליך העבודה של Bitbucket Pipelines.
הגדרת משתני מאגר ב-Bitbucket
במאגר Bitbucket, עוברים אל Repository settings > Repository variables (הגדרות המאגר > משתני המאגר) ויוצרים את משתני המאגר הבאים. כדי להגן על ערכים רגישים, מגדירים כל משתנה כמאובטח:
-
LOOKERSDK_BASE_URL: כתובת ה-URL של ה-API של מופע Looker (לדוגמה,https://example.cloud.looker.com) LOOKERSDK_CLIENT_ID: מזהה הלקוח של API3 שנוצר בדף ניהול חשבון ארגוני Users ב-Looker-
LOOKERSDK_CLIENT_SECRET: הסוד של הלקוח API3 שנוצר מתוך דף ניהול חשבון ארגוני Users ב-Looker
יצירת סקריפט Python ל-Bitbucket Pipelines
יוצרים סקריפט Python בשם run_looker_ci.py במאגר. הסקריפט הזה משתמש ב-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 שרוצים לבדוק -
LOOKER_SUITE_ID: המזהה של חבילת ה-CI שרוצים להריץ
פעולות GitHub
אפשר להפעיל הרצות של שילוב רציף (CI) ב-Looker מ-GitHub Actions באמצעות Looker API ו-Looker Python SDK הרשמי (looker-sdk).
כדי להפעיל ריצת CI של Looker מתוך תהליך עבודה של GitHub Actions, מבצעים את השלבים הבאים:
- הגדרת סודות במאגר ב-GitHub
- יוצרים את סקריפט Python עבור GitHub Actions.
- מגדירים את תהליך העבודה של פעולות GitHub.
הגדרת סודות במאגר ב-GitHub
במאגר GitHub, עוברים אל Settings > Secrets and variables > Actions ויוצרים את הסודות הבאים במאגר:
-
LOOKERSDK_BASE_URL: כתובת ה-URL של ה-API של מופע Looker (לדוגמה,https://example.cloud.looker.com) LOOKERSDK_CLIENT_ID: מזהה הלקוח של API3 שנוצר בדף ניהול חשבון ארגוני Users ב-Looker-
LOOKERSDK_CLIENT_SECRET: הסוד של הלקוח API3 שנוצר מתוך דף ניהול חשבון ארגוני Users ב-Looker
יצירת סקריפט Python ל-GitHub Actions
יוצרים סקריפט Python בשם run_looker_ci.py במאגר. הסקריפט הזה משתמש ב-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
במאגר, יוצרים קובץ של תהליך עבודה בנתיב .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 שרוצים לבדוק -
LOOKER_SUITE_ID: המזהה של חבילת ה-CI שרוצים להריץ
הגדרת dbt Cloud
אם אתם משתמשים ב-dbt Cloud, אתם יכולים להגדיר אינטגרציה רציפה (CI) כך שחבילות CI יופעלו אוטומטית כשמשימת CI ב-dbt Cloud מסתיימת. ההרצה של חבילת ה-CI עוזרת לוודא ששינויים במודלים של dbt לא פוגעים בפרויקט LookML.
כדי להגדיר את השילוב של dbt Cloud, פועלים לפי השלבים בקטע dbt Cloud Configuration (הגדרת dbt Cloud):
- בשדה dbt Cloud Host URL (כתובת ה-URL של המארח ב-dbt Cloud), מזינים את כתובת ה-URL של חשבון dbt Cloud.
- בשדה dbt Cloud API Key (מפתח API של dbt Cloud), מזינים אסימון של חשבון שירות ב-dbt Cloud.
- לוחצים על בדיקת החיבור. Looker יוודא שהוא יכול להתחבר לחשבון dbt Cloud שלכם, ואז יאחזר את מזהה החשבון שלכם ב-dbt Cloud.
- לוחצים על Save.
מאפייני משתמש
אתם יכולים להגדיר מאפייני משתמשים ששילוב רציף יכול לבטל במהלך הרצות של אימות. מאפייני משתמש משמשים בשילוב עם השילוב של dbt Cloud כדי להפנות את Looker לסכימות זמניות שנוצרו על ידי משימות CI של dbt Cloud.
כדי להגדיר ערכי ברירת מחדל של מאפייני משתמש ל-CI, פועלים לפי השלבים הבאים בקטע User Attributes (מאפייני משתמש):
- בשדה מאפיין משתמש, בוחרים מאפיין משתמש מהרשימה הנפתחת. אם לא נבחר מאפיין משתמש, Looker ישתמש במאפיין המשתמש שמוגדר בשדה Primary Dataset בחיבור למסד הנתונים להרצות של CI.
- בשדה ערך להרצת CI, מזינים את הערך שבו רוצים להשתמש עם מאפיין המשתמש הזה להרצות CI.
- לוחצים על Save.
אפשר להוסיף כמה צמדים של מאפייני משתמשים וערכים. כל מאפיין משתמש שהוגדר בקטע מאפייני משתמש יהיה זמין לבחירה כהחלפה בהגדרות של CI Suite.
כדי למחוק צמד של מאפיין משתמש וערך, לוחצים על הסרה.