GitHub Actions
Fonctionnalité en cours de déploiement. L'interface décrite ici est celle de la prochaine livraison : elle peut encore évoluer, et n'est pas forcément activée sur votre tenant.
Même principe que pour GitLab : le job obtient un jeton OIDC de GitHub, la CLI l'échange contre une session de tenant. Aucun secret dans les repository secrets.
Prérequis
sng tenant oidc create github-deploy \
--github-repo acme/infra --ref main \
--claim repository_id=123456789
sng tenant policy attach readwrite --oidc-trust github-deploy
sng tenant oidc create github-review --github-repo acme/infra --ref '*' --claim repository_id=123456789
sng tenant policy attach readonly --oidc-trust github-review
L'identifiant du dépôt se lit avec gh api repos/acme/infra --jq .id.
Le sub d'un jeton émis pour une pull request est repo:acme/infra:pull_request, pas une
branche. Pour valider les PR, ajoutez un trust avec --subject 'repo:acme/infra:pull_request'
ou utilisez --ref '*' et acceptez que les PR partagent le trust de revue.
Installer la CLI dans le workflow
Les binaires n'étant pas encore publiés, le workflow construit la CLI depuis les sources.
Le dépôt sng-cli est privé : il faut un jeton d'accès en lecture au dépôt, stocké comme
secret GitHub (SNG_CLI_TOKEN). C'est le seul secret du workflow, et il ne donne aucun
droit sur votre tenant.
name: deploy
on:
push:
branches: [main]
pull_request:
permissions:
id-token: write # le job peut demander un jeton OIDC
contents: read
env:
STNG_TENANT: acme
STNG_OIDC_AUDIENCE: https://api.dev.stackngo.fr
jobs:
sng:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.27"
- name: Build sng
run: |
git clone --depth 1 "https://oauth2:${{ secrets.SNG_CLI_TOKEN }}@gitlab.com/stackngo/sng-cli.git" /tmp/sng-cli
make -C /tmp/sng-cli build
sudo install /tmp/sng-cli/bin/sng /usr/local/bin/sng
sng config create
- name: Validate
run: |
sng validate infra/
sng plan infra/
- name: Deploy
if: github.ref == 'refs/heads/main'
env:
STNG_OIDC_TRUST: github-deploy
run: |
sng apply infra/
sng app describe api
Sous GitHub Actions, la CLI lit ACTIONS_ID_TOKEN_REQUEST_URL et
ACTIONS_ID_TOKEN_REQUEST_TOKEN, fournis par le runner quand permissions: id-token: write
est présent, et demande elle-même un jeton d'audience STNG_OIDC_AUDIENCE à chaque
ouverture de session.
Attendre la convergence
- name: Wait for Ready
if: github.ref == 'refs/heads/main'
run: |
for i in $(seq 1 30); do
if sng app describe api --json | jq -e '.ready' >/dev/null; then exit 0; fi
sleep 10
done
sng app describe api; exit 1
Variables utiles
| Variable | Rôle |
|---|---|
STNG_TENANT | Tenant visé (obligatoire) |
STNG_OIDC_AUDIENCE | Audience du jeton demandé à GitHub (défaut : l'URL de l'API) |
STNG_OIDC_TRUST | Désambiguïse si plusieurs trusts correspondent |
STNG_CLUSTER | Alternative à sng config use-cluster |
Dépannage
no CI OIDC token:permissions: id-token: writemanque au workflow ou au job.401 invalid identity token: lesub(repo:acme/infra:ref:refs/heads/feature-x,repo:acme/infra:pull_request) ne correspond à aucun trust.sng tenant oidc getmontre le motif attendu.403 forbiddensurapply:STNG_OIDC_TRUSTpointe sur le trustreadonly.- Un fork ne reçoit pas de jeton OIDC pour les PR : c'est une protection de GitHub, pas de StackNGO.