Aller au contenu principal

GitHub Actions

Bêta

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.

Pull requests

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.

.github/workflows/deploy.yml
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​

VariableRôle
STNG_TENANTTenant visé (obligatoire)
STNG_OIDC_AUDIENCEAudience du jeton demandé à GitHub (défaut : l'URL de l'API)
STNG_OIDC_TRUSTDésambiguïse si plusieurs trusts correspondent
STNG_CLUSTERAlternative à sng config use-cluster

Dépannage​

  • no CI OIDC token : permissions: id-token: write manque au workflow ou au job.
  • 401 invalid identity token : le sub (repo:acme/infra:ref:refs/heads/feature-x, repo:acme/infra:pull_request) ne correspond à aucun trust. sng tenant oidc get montre le motif attendu.
  • 403 forbidden sur apply : STNG_OIDC_TRUST pointe sur le trust readonly.
  • Un fork ne reçoit pas de jeton OIDC pour les PR : c'est une protection de GitHub, pas de StackNGO.

Voir aussi​