Construire et pousser des images
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.
Votre pipeline construit une image, la pousse dans le registre du tenant et met à jour l'App
qui l'utilise. Le job s'authentifie auprès du registre avec sa session OIDC : aucun secret à stocker.
Prérequis
Un dépôt déclaré dans le tenant :
sng registry create api
ou, en manifeste :
apiVersion: registry.stackngo.io/v1alpha1
kind: RegistryRepository
metadata:
name: api
spec:
retention:
keepLastCount: 20
keepTagsRegex: ["^v\\d+\\.\\d+\\.\\d+$"]
Le dépôt s'appelle <registre>/acme/api. Le nom d'hôte du registre est indiqué par
sng registry login ; voir Pousser et tirer.
La session OIDC du job
Le trust utilisé par le job doit avoir registry:push sur le dépôt. La policy readwrite
l'inclut ; sinon, ajoutez une policy :
{
"Version": "1",
"Statement": [
{"Effect": "Allow", "Actions": ["registry:push", "registry:pull"], "Resources": ["repository/api"]},
{"Effect": "Allow", "Actions": ["deploy:read", "deploy:write", "deploy:list"], "Resources": ["*"]}
]
}
sng tenant policy create ci-api -f ci-api.json
sng tenant policy attach ci-api --oidc-trust gitlab-deploy
Dans le job, sng registry utilise la session courante :
build-and-push:
extends: .sng
stage: deploy
image: docker:27
services: [docker:27-dind]
script:
- sng registry login # docker login avec la session du job
- docker build -t api:$CI_COMMIT_SHORT_SHA .
- sng registry build --from-image api:$CI_COMMIT_SHORT_SHA
Ou sng registry build construit, pousse, puis analyse l'image avec trivy si l'image du job
le fournit (sinon un avertissement s'affiche et le job continue). --fail-on fait échouer le
job sur une vulnérabilité grave, ou si trivy manque :
- sng registry build . -t api:$CI_COMMIT_SHORT_SHA --fail-on CRITICAL
Et les clés d'accès au registre ?
Une clé d'accès au registre (RegistryAccessKey) sert avant tout à vos App pour tirer vos
images privées (imagePullSecrets). Pour pousser depuis une CI externe, préférez la session
OIDC ci-dessus : aucun secret à stocker ni à renouveler.
Une clé reste utile quand le job ne peut pas ouvrir de session :
- job exécuté par une
Appde votre tenant : déclarez la clé avecci: true, et l'Applit ses identifiants dans ses variables d'environnement. Sansci: true, uneAppqui les cite dansenvouenvFromest refusée ; - outil externe sans OIDC : un administrateur du tenant lit les identifiants avec
sng registry access-key credentials NAME --show-passwordet les recopie dans les variables de la CI ; à refaire après chaque renouvellement.
Détail dans Clés d'accès au registre.
Mettre à jour l'App
L'image poussée doit se retrouver dans le manifeste. Deux approches :
Tag mouvant et redémarrage. L'App référence acme/api:main ; le job pousse ce tag puis
force un redémarrage :
sng app restart api
Simple, mais l'état désiré ne dit pas quelle version tourne.
Tag immuable dans le manifeste. Le job réécrit l'image dans le fichier et applique :
sed -i "s#\(image: .*/acme/api:\).*#\1$CI_COMMIT_SHORT_SHA#" infra/App/api.yml
sng apply infra/App/api.yml
git commit -am "deploy api $CI_COMMIT_SHORT_SHA" && git push # si vous voulez la trace dans git
Plus de rigueur : sng pull et votre dépôt disent exactement ce qui tourne, et
sng env restore ramène à une version précise.
Tirer l'image depuis le tenant
Une App ne reçoit pas d'accès au registre automatiquement, même dans le même tenant.
Déclarez une clé d'accès en lecture (actions: [pull]) : la plateforme prépare l'identifiant
<clé>-registry, que vous référencez dans spec.imagePullSecrets
(Clés d'accès au registre). Un dépôt public: true se tire sans
authentification. Pour un registre externe privé, voir (Variables et secrets).