Snowflake-CLI-GitHub-Aktion

Die Snowflake CLI-GitHub-Aktion (snowflakedb/snowflake-cli-action) installiert und konfiguriert Snowflake CLI in einem GitHub Actions-Workflow. Verwenden Sie es, um Snowflake-Bereitstellungen (DCM-Projekte, Snowpark-Anwendungen, Snowflake Native Apps und SQL-Skripte) von IhremGitHub-Repository zu automatisieren.

Wie es funktioniert

Die Aktion führt folgende Schritte für den ausführenden Benutzer aus:

  1. Installiert Python 3.11 und den uv-Paketmanager mit astral-sh/setup-uv.

  2. Installiert Snowflake CLI in einer isolierten Umgebung (uv tool install snowflake-cli.

  3. Kopiert config.toml vom Repository zu ~/.snowflake/config.toml (0600 auf Linux/macOS). Übersprungen, wenn die Datei nicht vorhanden ist.

  4. Wenn die OIDC-Authentifizierung aktiviert ist, erhält sie ein von GitHub ausgestelltes OIDC-Token und legt die Umgebungsvariablen der Snowflake-Workload-Identität für nachfolgende Schritte fest.

Nachdem die Aktion abgeschlossen ist, ist der snow-Befehl auf PATH für jeden nachfolgenden Schritt im Job verfügbar.

Schnelles Nutzungsbeispiel

Der folgende Workflow führt die Authentifizierung bei Snowflake unter Verwendung von OIDC und einen Verbindungstest aus:

name: Deploy to Snowflake
on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - uses: snowflakedb/snowflake-cli-action@v2
        with:
          use-oidc: true
          cli-version: "3.16"

      - name: Deploy
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
        run: |
          snow connection test -x
          snow dcm deploy --target PROD -x

Weitere Authentifizierungsmethoden finden Sie unter Authentifizierungsmethoden.

Version anheften

Die -Aktion unterstützt drei Pin-Stile:

  • **Commit für SHA ** (@a1b2c3d...): Dies gilt für ein bestimmtes Commit.

  • Patch-Version-Tag (@v2.0.2): Dies gilt für ein bestimmtes Release.

  • Gleitender Major-Tag (@v2): folgt dem neuesten Release in dieser Major-Version.

# Pinned commit SHA.
- uses: snowflakedb/snowflake-cli-action@a1b2c3d4e5f67890abcdef1234567890abcdef12

# Patch version tag.
- uses: snowflakedb/snowflake-cli-action@v2.0.2

# Floating major tag.
- uses: snowflakedb/snowflake-cli-action@v2

Eingaben

Die Aktion akzeptiert die folgenden Eingaben, die unter with: in Ihrem -WorkflowYAML angegeben sind:

Eingabe

Erforderlich

Standard

Beschreibung

cli-version

Nein

(neueste)

Snowflake CLI-Version zum Installieren, z. B. 3.16.0 oder 3.16. Bei Weglassen wird die letzte freigegebene Version installiert.

custom-github-ref

Nein

(–)

GitHub-Branch, -Tag oder -Commit, von dem Snowflake CLI installiert werden soll. Verwenden Sie dies, um nicht veröffentlichte Features oder eine Abspaltung zu testen. Gegenseitig ausschließend mit cli-version.

default-config-file-path

Nein

./config.toml

Pfad zu config.toml, relativ zum Stammverzeichnis des Repositorys. Siehe Verwalten von Snowflake-Verbindungen.

use-oidc

Nein

false

Wenn true, konfiguriert die OIDC-Authentifizierung durch Abrufen eines GitHub OIDC-Tokens und Festlegen der Snowflake-Workload-Identity-Umgebungsvariablen.

oidc-token-name

Nein

SNOWFLAKE_TOKEN

Name der Umgebungsvariable, als die das OIDC-Token exportiert wird. Legen Sie dies als SNOWFLAKE_CONNECTIONS_<NAME>_TOKEN fest, wenn Sie eine benannte Verbindung verwenden, wobei <NAME> der großgeschriebene Verbindungsname aus Ihrer config.toml ist (zum Beispiel: für [connections.myconnection] legen Sie SNOWFLAKE_CONNECTIONS_MYCONNECTION_TOKEN fest). Der Variablenname wird intern in Großbuchstaben geschrieben, bevor er exportiert wird.

Bemerkung

Geben Sie nur eine Version an: entweder cli-version oder custom-github-ref; wenn Sie beide gleichzeitig verwenden, wird ein Fehler ausgegeben.

Methoden der Authentifizierung

Die -Aktion unterstützt drei Möglichkeiten der Authentifizierung bei Snowflake. Snowflake empfiehlt OIDC, da dadurch die Speicherung langlebiger Geheimnisse in GitHub vermieden wird.

Methode

Sicherheit

Erforderliche Geheimnisse

Snowflake CLI-Version

Workload-Identitäts-Verbund (WIF) mit OIDC (empfohlen)

Geheimnislose, kurzlebige Token

Nur Snowflake-Konto

3.11 oder höher

Schlüsselpaar-Authentifizierung

Privater Schlüssel, der in GitHub Secrets gespeichert ist

Privater Schlüssel, Konto, Benutzer

Beliebig

Kennwortauthentifizierung

Kennwort, das in GitHub Secrets gespeichert ist

Kennwort, Konto, Benutzer

Beliebig

Workload Identity Federation (WIF) mit OIDC

Bemerkung

Die OIDC-Authentifizierung erfordert Snowflake CLI-Version 3.11.0 oder höher.

Mit OIDC stellt GitHub ein kurzlebiges OpenID Connect-Token aus, das Snowflake direkt validiert. Kein privater Schlüssel oder Kennwort wird in GitHub gespeichert.

Erstellen des Service-Benutzers

Erstellen eines Snowflake-Service-Benutzers, der dem GitHub OIDC-Anbieter vertraut:

CREATE USER <username>
  TYPE = SERVICE
  WORKLOAD_IDENTITY = (
    TYPE = OIDC
    ISSUER = 'https://token.actions.githubusercontent.com'
    SUBJECT = '<your_subject>'
  );

SUBJECT muss mit dem Anspruch übereinstimmen, den GitHub für den Workflow ausgibt. Verwenden Sie eines der folgenden Formate:

Format des Betreffs

Übereinstimmungen

Workflow-Anforderung

repo:<owner>/<repo>:ref:refs/heads/<branch>

Mit Push an den angegebenen Zweig

on: push, ohne environment: im Job

repo:<owner>/<repo>:pull_request

Jedes Pull-Anforderungs-Ereignis

on: pull_request ohne environment: im Job

repo:<owner>/<repo>:environment:<name>

Der Job zielt auf eine benannteGitHub-Umgebung ab

Job legt :codenowrap:`environment:<name> fest (die Umgebung muss in den Repository-Einstellungen vorhanden sein)

Wenn ein Job environment: festlegt, verwendet GitHub die Umgebungsform unabhängig vom Auslöser.

Um den Subject-Claim um einen übergeordneten Wert wie repository_owner anzupassen, lesen Sie die GitHub `OpenID Connect-Referenz <https://docs.github.com/en/actions/reference/security/oidc>.

Konfigurieren der Aktion

Erteilen Sie die Berechtigung id-token: write für den Job und legen Sie use-oidc: true in der Aktion fest:

name: Snowflake OIDC
on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  oidc-job:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
      - uses: snowflakedb/snowflake-cli-action@v2
        with:
          use-oidc: true
          cli-version: "3.16"
      - name: Test connection
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
        run: snow connection test -x

Wenn use-oidc: true festgelegt ist, exportiert die Aktion die folgenden Umgebungsvariablen für nachfolgende Schritte:

  • SNOWFLAKE_AUTHENTICATOR=WORKLOAD_IDENTITY

  • SNOWFLAKE_WORKLOAD_IDENTITY_PROVIDER=OIDC

  • SNOWFLAKE_AUDIENCE=snowflakecomputing.com

  • SNOWFLAKE_TOKEN =<token> (oder die von :codenowrap benannte Variable:oidc-token-name)

Für einen breiteren Kontext siehe:doc:/user-guide/workload-identity-federation.

Schlüsselpaar-Authentifizierung

Speichern Sie Ihren privaten Snowflake-Schlüssel als GitHub Secret und geben Sie es über die Umgebung weiter. Sie können eine temporäre Verbindung verwenden (config.toml nicht erforderlich) oder eine benannte Verbindung, die in config.toml definiert ist.

Temporäre Verbindung:

- uses: snowflakedb/snowflake-cli-action@v2
  with:
    cli-version: "3.16.0"
- name: Deploy
  env:
    SNOWFLAKE_AUTHENTICATOR: SNOWFLAKE_JWT
    SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
    SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
    SNOWFLAKE_PRIVATE_KEY_RAW: ${{ secrets.SNOWFLAKE_PRIVATE_KEY_RAW }}
    PRIVATE_KEY_PASSPHRASE: ${{ secrets.PRIVATE_KEY_PASSPHRASE }}
  run: |
    snow connection test -x
    snow dcm deploy --target PROD -x

Benannte Verbindung: Committen Sie eine config.toml mit einem leeren Verbindungsblock und überschreiben Sie die Felder durch Umgebungsvariablen:

default_connection_name = "myconnection"

[connections.myconnection]
- uses: snowflakedb/snowflake-cli-action@v2
  with:
    default-config-file-path: "config.toml"
- name: Deploy
  env:
    SNOWFLAKE_CONNECTIONS_MYCONNECTION_AUTHENTICATOR: SNOWFLAKE_JWT
    SNOWFLAKE_CONNECTIONS_MYCONNECTION_USER: ${{ secrets.SNOWFLAKE_USER }}
    SNOWFLAKE_CONNECTIONS_MYCONNECTION_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
    SNOWFLAKE_CONNECTIONS_MYCONNECTION_PRIVATE_KEY_RAW: ${{ secrets.SNOWFLAKE_PRIVATE_KEY_RAW }}
    PRIVATE_KEY_PASSPHRASE: ${{ secrets.PRIVATE_KEY_PASSPHRASE }}
  run: snow connection test

Weitere Informationen zu Verbindung finden Sie unter Verwalten von Snowflake-Verbindungen.

Kennwortauthentifizierung

Die Authentifizierung per Kennwort wird für ältere Workflows unterstützt, wird aber nicht für Produktion-CI/-CD empfohlen. Um sie zu verwenden, lassen Sie SNOWFLAKE_AUTHENTICATOR weg (der CLI-Standard ist die Passwort-Authentifizierung) und übergeben Sie SNOWFLAKE_PASSWORD:

- uses: snowflakedb/snowflake-cli-action@v2
- name: Deploy
  env:
    SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
    SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
    SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
  run: snow connection test -x

Bemerkung

Bei Verwendung eines Passworts und MFA empfiehlt Snowflake, das :ref:`MFA-Caching <label_snowcli_mfa_caching> zu aktivieren.

Installation von einem Zweig, Tag oder Commit

Um eine unveröffentlichte Snowflake CLI-Änderung oder einen Fork zu testen, verwenden Sie custom-github-ref:

- uses: snowflakedb/snowflake-cli-action@v2
  with:
    custom-github-ref: "feature/my-branch"  # or a tag/commit hash

Plattformunterstützung

Die Aktion wird auf Ubuntu-, macOS- und Windows-GitHub-gehosteten Runnern ausgeführt und wurde gegen Python 3.10 und 3.13 getestet. Beachten Sie das folgende plattformspezifische Verhalten:

  • Linux und macOS: die kopierte config.toml wird auf 0600-Berechtigungen festgelegt.

  • Windows: Dateiberechtigungen für config.toml werden nicht geändert. Verwenden Sie GitHub-Secrets für Anmeldeinformationen und vermeiden Sie es, Secrets in config.toml zu committen, unabhängig vom Runner.