Impostazioni amministratore - Integrazione continua

La pagina Integrazione continua nella sezione Piattaforma del menu Amministrazione consente di configurare le impostazioni per la funzionalità Integrazione continua (CI) di Looker. Configura le impostazioni CI di Looker (Google Cloud core) per garantire la qualità e l'affidabilità dei tuoi progetti LookML. La CI impedisce gli errori di query e identifica i problemi relativi a SQL, test dei dati, contenuti e LookML prima che raggiungano la produzione. Puoi anche configurare i validatori CI in modo che vengano eseguiti automaticamente quando viene inviata una richiesta di pull al repository LookML, semplificando il flusso di lavoro di sviluppo.

Funzionalità di conformità dell'integrazione continua

Looker CI non è incluso nei limiti di autorizzazione FedRAMP High, FedRAMP Moderate o DoD Impact Level 5 (IL5).

Prima di abilitare l'impostazione Looker CI per l'istanza di Looker, consulta l'ente autorizzatore per determinare se le offerte di conformità di Looker CI soddisfano i requisiti normativi e di sicurezza specifici della tua organizzazione.

Per le istanze di Looker (Google Cloud core), ogni pacchetto di controlli Assured Workloads che diventa disponibile aggiungerà le funzionalità di Looker CI come offerte predefinite man mano che i requisiti e i processi di modifica del pacchetto vengono soddisfatti.

Attiva l'integrazione continua

La funzionalità di integrazione continua (CI) di Looker consente di eseguire test sul progetto LookML per offrire esperienze di dati più affidabili, efficienti e intuitive. Puoi utilizzare i validatori CI per identificare i problemi relativi a SQL, test dei dati, contenuti e LookML prima che raggiungano la produzione per verificare LookML e impedire errori di query per gli utenti. Puoi anche configurare i validatori CI in modo che vengano eseguiti automaticamente in base a una pianificazione o quando viene inviata una richiesta di pull al repository LookML.

Un amministratore di Looker può utilizzare l'opzione Attiva integrazione continua per abilitare la CI sull'istanza.

Utenti Looker CI

Quando abiliti l'integrazione continua sull'istanza, Looker crea automaticamente 10 utenti Looker CI nel gruppo di utenti Utenti Looker CI con il ruolo Utenti Looker CI. Un amministratore di Looker può visualizzare gli utenti Looker CI dalla scheda Account di servizio della pagina Amministrazione Utenti.

Se l'istanza utilizza le concessioni di accesso per controllare l'accesso a Esplora, gli utenti Looker CI devono essere inclusi in queste concessioni di accesso. Puoi includere gli utenti CI assegnando i valori degli attributi utente pertinenti al gruppo Utenti Looker CI, come descritto nella pagina della documentazione Impostazioni di amministrazione - Attributi utente.

Integrazioni

L'integrazione continua consente di eseguire automaticamente le suite CI quando si verificano richieste di pull o commit nel repository Git remoto. Puoi configurare l'integrazione continua in modo che si integri con i seguenti provider Git:

  • GitHub (utilizza l'app GitHub di Looker CI)
  • GitLab (utilizza l'API Looker e GitLab CI)
  • Bitbucket (utilizza l'API Looker e le pipeline Bitbucket)
  • GitHub Actions (utilizza l'API Looker e GitHub Actions)

GitHub

Se hai un repository GitHub basato sul cloud come repository remoto per il tuo progetto LookML, puoi configurare l'integrazione continua in modo che esegua automaticamente le suite CI quando gli sviluppatori LookML inviano richieste di pull al repository LookML.

Per eseguire automaticamente le suite CI sul repository, l'integrazione continua richiede le seguenti autorizzazioni:

  • Accesso in lettura ai metadati e alle richieste di pull del repository
  • Accesso in lettura e scrittura agli stati di commit, agli hook del repository e ai flussi di lavoro del repository

Queste autorizzazioni non vengono configurate quando configuri una connessione Git per il tuo progetto LookML nell'IDE di Looker. Se vuoi utilizzare l'attivazione della richiesta di pull per le esecuzioni CI, il progetto LookML deve essere configurato con una connessione Git (come descritto nella pagina Configurazione e test di una connessione Git) e devi anche configurare l'app GitHub CI come descritto nella sezione Configurazione dell'app GitHub CI.

Tabella GitHub

La tabella GitHub nella pagina Amministrazione Integrazione continua elenca i repository GitHub configurati per i progetti LookML nell'istanza di Looker. Questi repository GitHub sono stati configurati dagli sviluppatori LookML come descritto nella pagina della documentazione Configurazione e test di una connessione Git.

Per ogni repository GitHub elencato, la tabella indica se il repository è stato configurato con l'app GitHub CI:

Configurazione dell'app GitHub CI

Per concedere l'applicazione GitHub CI per un repository:

  1. Nella pagina Amministrazione Integrazione continua in Looker, fai clic sul pulsante Configura app GitHub. Si aprirà una finestra del browser nella pagina web delle app GitHub.
  2. Seleziona l'account GitHub in cui è archiviato LookML.
  3. Nella sezione Accesso al repository , seleziona Tutti i repository per consentire le integrazioni CI per tutti i repository Git di proprietà del proprietario della risorsa oppure seleziona Solo i repository selezionati per scegliere i repository con cui vuoi utilizzare l'integrazione continua.
  4. Fai clic su Salva.

Se l'applicazione GitHub di Looker CI viene concessa correttamente al repository, Looker visualizza Installata per il repository nella tabella GitHub della pagina Amministrazione Integrazione continua.

GitLab

Puoi attivare le esecuzioni di integrazione continua di Looker da GitLab CI utilizzando l'API Looker e l'SDK Python ufficiale di Looker (looker-sdk).

Per attivare un'esecuzione di Looker CI da una pipeline GitLab CI:

  1. Configura le variabili CI/CD in GitLab.
  2. Crea lo script Python per GitLab CI.
  3. Configura il flusso di lavoro GitLab CI.

Configura le variabili CI/CD in GitLab

Nel progetto GitLab, vai a Impostazioni > CI/CD > Variabili e crea le seguenti variabili CI/CD. Imposta ogni variabile su Mascherata per proteggere i valori sensibili:

  • LOOKERSDK_BASE_URL: l'URL dell'API dell'istanza di Looker (ad esempio, https://example.cloud.looker.com)
  • LOOKERSDK_CLIENT_ID: l'ID client API3 generato dalla pagina Amministrazione Utenti in Looker
  • LOOKERSDK_CLIENT_SECRET: il client secret API3 corrispondente generato dalla pagina Amministrazione Utenti in Looker

Crea lo script Python per GitLab CI

Crea uno script Python denominato run_looker_ci.py nel repository. Questo script utilizza l'SDK Looker per attivare l'esecuzione CI ed eseguire il polling fino al termine dell'esecuzione:

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!")

Configura il flusso di lavoro GitLab CI

Nella directory root del repository, crea o aggiorna il file di configurazione della pipeline .gitlab-ci.yml per installare looker-sdk ed eseguire 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"

Sostituisci quanto segue:

  • LOOKER_PROJECT_ID: l'ID del progetto Looker che vuoi testare
  • LOOKER_SUITE_ID: l'ID della suite CI che vuoi eseguire

Bitbucket

Puoi attivare le esecuzioni di integrazione continua di Looker da Bitbucket Pipelines utilizzando l'API Looker e l'SDK Python ufficiale di Looker (looker-sdk).

Per attivare un'esecuzione di Looker CI da Bitbucket Pipelines:

  1. Configura le variabili del repository in Bitbucket.
  2. Crea lo script Python per Bitbucket Pipelines.
  3. Configura il flusso di lavoro Bitbucket Pipelines.

Configura le variabili del repository in Bitbucket

Nel repository Bitbucket, vai a Impostazioni repository > Variabili repository e crea le seguenti variabili repository. Imposta ogni variabile su Protetta per proteggere i valori sensibili:

  • LOOKERSDK_BASE_URL: l'URL dell'API dell'istanza di Looker (ad esempio, https://example.cloud.looker.com)
  • LOOKERSDK_CLIENT_ID: l'ID client API3 generato dalla pagina Amministrazione Utenti in Looker
  • LOOKERSDK_CLIENT_SECRET: il client secret API3 corrispondente generato dalla pagina Amministrazione Utenti in Looker

Crea lo script Python per Bitbucket Pipelines

Crea uno script Python denominato run_looker_ci.py nel repository. Questo script utilizza l'SDK Looker per attivare l'esecuzione CI ed eseguire il polling fino al termine dell'esecuzione:

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!")

Configura il flusso di lavoro Bitbucket Pipelines

Nella directory root del repository, crea o aggiorna il file bitbucket-pipelines.yml per installare looker-sdk ed eseguire 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

Sostituisci quanto segue:

  • LOOKER_PROJECT_ID: l'ID del progetto Looker che vuoi testare
  • LOOKER_SUITE_ID: l'ID della suite CI che vuoi eseguire

GitHub Actions

Puoi attivare le esecuzioni di integrazione continua di Looker da GitHub Actions utilizzando l'API Looker e l'SDK Python ufficiale di Looker (looker-sdk).

Per attivare un'esecuzione di Looker CI da un flusso di lavoro GitHub Actions:

  1. Configura i secret del repository in GitHub.
  2. Crea lo script Python per GitHub Actions.
  3. Configura il flusso di lavoro GitHub Actions.

Configura i secret del repository in GitHub

Nel repository GitHub, vai a Impostazioni > Secret e variabili > Azioni e crea i seguenti secret del repository:

  • LOOKERSDK_BASE_URL: l'URL dell'API dell'istanza di Looker (ad esempio, https://example.cloud.looker.com)
  • LOOKERSDK_CLIENT_ID: l'ID client API3 generato dalla pagina Amministrazione Utenti in Looker
  • LOOKERSDK_CLIENT_SECRET: il client secret API3 corrispondente generato dalla pagina Amministrazione Utenti in Looker

Crea lo script Python per GitHub Actions

Crea uno script Python denominato run_looker_ci.py nel repository. Questo script utilizza l'SDK Looker per attivare l'esecuzione CI ed eseguire il polling fino al termine dell'esecuzione:

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!")

Configura il flusso di lavoro GitHub Actions

Nel repository, crea un file di flusso di lavoro in .github/workflows/looker-ci.yml con la seguente configurazione:

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

Sostituisci quanto segue:

  • LOOKER_PROJECT_ID: l'ID del progetto Looker che vuoi testare
  • LOOKER_SUITE_ID: l'ID della suite CI che vuoi eseguire

Configurazione dbt Cloud

Se utilizzi dbt Cloud, puoi configurare l'integrazione continua in modo che esegua automaticamente le suite CI al termine di un job CI di dbt Cloud. L'esecuzione della suite CI contribuisce a garantire che le modifiche ai modelli dbt non interrompano il progetto LookML.

Per configurare l'integrazione di dbt Cloud, segui questi passaggi nella sezione Configurazione dbt Cloud:

  1. Nel campo URL host dbt Cloud, inserisci l'URL del tuo account dbt Cloud.
  2. Nel campo Chiave API dbt Cloud, inserisci un token dell'account di servizio dbt Cloud.
  3. Fai clic su Prova connessione. Looker verificherà di poter connettersi al tuo account dbt Cloud e recupererà il tuo ID account dbt Cloud.
  4. Fai clic su Salva.

Attributi dell'utente

Puoi configurare gli attributi utente che l'integrazione continua può sostituire durante le esecuzioni di convalida. Gli attributi utente vengono utilizzati insieme all'integrazione di dbt Cloud per indirizzare Looker agli schemi temporanei creati dai job CI di dbt Cloud.

Per configurare i valori predefiniti degli attributi utente per la CI, segui questi passaggi nella sezione Attributi utente:

  1. Nel campo Attributo utente, seleziona un attributo utente dall'elenco a discesa. Se non viene selezionato alcun attributo utente, Looker utilizzerà l'attributo utente definito nel campo Dataset principale nella connessione al database per le esecuzioni CI.
  2. Nel campo Valore per l'esecuzione CI, inserisci il valore da utilizzare con questo attributo utente per le esecuzioni CI.
  3. Fai clic su Salva.

Puoi aggiungere più coppie di attributi e valori utente. Ogni attributo utente configurato nella sezione Attributi utente sarà disponibile per la selezione come override nelle configurazioni della suite CI.

Per eliminare una coppia di attributi e valori utente, fai clic su Rimuovi.