GitHub Action Snowflake CLI

La Snowflake CLI GitHub Action (snowflakedb/snowflake-cli-action) installe et configure la Snowflake CLI dans un workflow GitHub Actions. Utilisez-la pour automatiser les déploiements Snowflake (projets DCM, applications Snowpark, Snowflake Native Apps et scripts SQL) de votre référentiel GitHub.

Fonctionnement

Cette action effectue les opérations suivantes sur le runner :

  1. Installe Python 3.11 et le ``uv``gestionnaire de paquets utilisant astral-sh/setup-uv.

  2. Installe la Snowflake CLI dans un environnement isolé (uv tool install snowflake-cli).

  3. Copie config.toml du référentiel vers ~/.snowflake/config.toml (0600 sous Linux/macOS). Ignoré si le fichier est absent.

  4. Lorsque l’authentification OIDC est activée, le système récupère un jeton OIDC émis par GitHub et définit les variables d’environnement d’identité de la charge de travail Snowflake pour les étapes suivantes.

Une fois l’action terminée, la commande snow est disponible sur PATH pour chaque étape suivante de la tâche.

Exemple d’utilisation rapide

Le flux de travail suivant s’authentifie auprès de Snowflake à l’aide d’OIDC et exécute un test de connexion :

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

Pour d’autres méthodes d’authentification, voir Méthodes d’authentification.

Épinglage de la version

L’action prend en charge trois style d’épinglage :

  • Valider SHA (@a1b2c3d...) : épingle sur une validation spécifique.

  • Balise de la version de correctif (@v2.0.2) : épingle sur une version spécifique.

  • Balise majeure flottante (@v2) : suit la dernière version de cette version majeure.

# 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

Entrées

L’action accepte les entrées suivantes, spécifiées sous with: dans votre workflow YAML :

Entrée

Obligatoire

Par défaut

Description

cli-version

Non

(la plus récente)

Version Snowflake CLI à installer, par exemple 3.16.0 ou 3.16. En cas d’omission, la dernière version publiée est installée.

custom-github-ref

Non

(aucun)

Branche GitHub, balise ou validation pour l’installation de Snowflake CLI. Utilisez cette option pour tester des fonctionnalités non encore publiées ou un fork. Incompatible avec cli-version.

default-config-file-path

Non

./config.toml

Chemin vers votre config.toml, par rapport à la racine du référentiel. Voir Gestion des connexions Snowflake.

use-oidc

Non

false

Lorsque true, configure l’authentification OIDC en obtenant un jeton OIDC GitHub et définissant les variables d’environnement de l’identité de la charge de travail de Snowflake.

oidc-token-name

Non

SNOWFLAKE_TOKEN

Nom de la variable d’environnement sous laquelle le jeton OIDC est exporté. Définissez-la sur SNOWFLAKE_CONNECTIONS_<NAME>_TOKEN lorsque vous utilisez une connexion nommée, où <NAME> est le nom de la connexion en majuscules de votre config.toml (par exemple, pour [connections.myconnection], définissez SNOWFLAKE_CONNECTIONS_MYCONNECTION_TOKEN). Le nom de la variable est complété en majuscules en interne avant d’être exporté.

Note

Spécifiez uniquement l’un des éléments suivants : cli-version ou custom-github-ref ; l’utilisation des deux en même temps entraîne une erreur.

Méthodes d’authentification

L’action prend en charge trois méthodes d’authentification auprès de Snowflake. Snowflake recommande OIDC, car cela évite de stocker des secrets à longue durée de vie dans GitHub.

Méthode

Sécurité

Secrets obligatoires

Version Snowflake CLI :

Fédération d’identité de charge de travail (WIF) avec OIDC (recommandé)

Jetons sans secret et de courte durée

Compte Snowflake uniquement

3.11 ou plus récent

Authentification par paire de clés

Clé privée stockée dans les secrets GitHub

Clé privée, compte, utilisateur

N’importe quel

Authentification par mot de passe

Mot de passe enregistré dans les secrets GitHub

Mot de passe, compte, utilisateur

N’importe quel

Fédération d’identité de charge de travail (WIF) avec OIDC

Note

L’authentification OIDC nécessite la version 3.11.0 ou ultérieure de Snowflake CLI.

Avec OIDC, GitHub émet un jeton OpenID Connect de courte durée que Snowflake valide directement. Aucune clé privée ou aucun mot de passe n’est stocké dans GitHub.

Créer l’utilisateur de service

Créez un utilisateur de service Snowflake qui fait confiance au fournisseur OIDC de GitHub :

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

Le SUBJECT doit correspondre à la revendication générée par GitHub pour le workflow. Utilisez l’un des formats suivants :

Format d’objet

Correspond

Exigence de workflow

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

Transfert vers la branche spécifiée

on: push, sans environment: sur la tâche

repo:<owner>/<repo>:pull_request

Tout événement de pull request

on: pull_request, sans environment: sur la tâche

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

La tâche cible un environnement GitHub nommé

La tâche définit environment: <name> (l’environnement doit être défini dans les paramètres du référentiel)

Lorsqu’une tâche définit environment:, GitHub utilise la forme de l’environnement quel que soit le déclencheur.

Pour personnaliser le sujet afin d’inclure une revendication plus large telle que repository_owner, consultez la ressource GitHub OpenID Connect.

Configurer l’action

Accordez l’autorisation id-token: write à la tâche et définissez use-oidc: true sur l’action :

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

Lorsque use-oidc: true est défini, l’action exporte les variables d’environnement suivantes pour les étapes à venir :

  • SNOWFLAKE_AUTHENTICATOR=WORKLOAD_IDENTITY

  • SNOWFLAKE_WORKLOAD_IDENTITY_PROVIDER=OIDC

  • SNOWFLAKE_AUDIENCE=snowflakecomputing.com

  • SNOWFLAKE_TOKEN=<token> (ou la variable nommée par oidc-token-name)

Pour plus de contexte, consultez Fédération d’identité de charge de travail.

Authentification par paire de clés

Stockez votre clé privée Snowflake en tant que secret GitHub et transmettez-le dans l’environnement. Vous pouvez utiliser une connexion temporaire (config.toml non requis) ou une connexion nommée définie dans config.toml.

Connexion temporaire :

- 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

Connexion nommée : validez un config.toml avec un bloc de connexion vide et remplacez les champs par des variables d’environnement :

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

Pour plus d’informations sur les connexions, voir Gestion des connexions Snowflake.

Authentification par mot de passe

L’authentification par mot de passe est prise en charge pour les workflows hérités, mais n’est pas recommandée pour la production.CI/CD. Pour l’utiliser, omettez SNOWFLAKE_AUTHENTICATOR (par défaut, la CLI utilise l’authentification par mot de passe) et transmettez 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

Note

Lorsque vous utilisez un mot de passe et une MFA, Snowflake recommande d’activer la mise en cache MFA.

Installation à partir d’une branche, d’une balise ou d’une validation

Pour tester une modification de la Snowflake CLI qui n’a pas encore été publiée ou un fork, utilisez custom-github-ref :

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

Prise en charge de plateforme

Cette action fonctionne sur les runners hébergés par GitHub sous Ubuntu, macOS et Windows, et a été testée avec Python 3.10 et 3.13. Notez le comportement suivant spécifique à la plateforme :

  • Linux et macOS : le config.toml copié est défini sur les autorisations 0600.

  • Windows : les autorisations de fichiers sur config.toml ne sont pas modifiées. Utilisez les secrets GitHub pour les identifiants de connexion ; évitez de valider des secrets dans config.toml quel que soit le runner.