Comme l'a dit @Connor McCarthy, en attendant qu'Amazon trouve une meilleure solution pour des clés plus permanentes, en attendant, nous aurions besoin de générer nous-mêmes les clés sur le serveur Jenkins.
Ma solution est d'avoir un travail périodique qui met à jour automatiquement les informations d'identification Jenkins pour ECR toutes les 12 heures, à l'aide de l'API Groovy. Ceci est basé sur cette réponse très détaillée , même si j'ai fait quelques choses différemment et j'ai dû modifier le script.
Pas:
- Assurez-vous que votre maître Jenkins peut accéder à l'API AWS requise. Dans ma configuration, le maître Jenkins s'exécute sur EC2 avec un rôle IAM, j'ai donc juste dû ajouter l'autorisation
ecr:GetAuthorizationToken
au rôle serveur. [ Mise à jour ] Pour obtenir des poussées compléter, vous aurez besoin aussi avec succès à accorder ces autorisations: ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage
. Amazon a une politique intégrée qui offre ces capacités, appelées AmazonEC2ContainerRegistryPowerUser
.
- Assurez-vous que l'AWS CLI est installée sur le maître. Dans ma configuration, avec le maître exécuté dans un conteneur docker debian, je viens d'ajouter cette étape de construction du shell au travail de génération de clés:
dpkg -l python-pip >/dev/null 2>&1 || sudo apt-get install python-pip -y; pip list 2>/dev/null | grep -q awscli || pip install awscli
- Installez le plugin Groovy qui vous permet d'exécuter le script Groovy dans le cadre du système Jenkins.
- Dans l'écran des informations d'identification, recherchez votre clé AWS ECR, cliquez sur "Avancé" et enregistrez son "ID". Pour cet exemple, je vais supposer qu'il s'agit de "12345".
- Créez un nouveau travail, avec un lancement périodique de 12 heures, et ajoutez une étape de build "script Groovy système" avec le script suivant:
import jenkins.model.*
import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl
def changePassword = { username, new_password ->
def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
Jenkins.instance)
def c = creds.findResult { it.username == username ? it : null }
if ( c ) {
println "found credential ${c.id} for username ${c.username}"
def credentials_store = Jenkins.instance.getExtensionList(
'com.cloudbees.plugins.credentials.SystemCredentialsProvider'
)[0].getStore()
def result = credentials_store.updateCredentials(
com.cloudbees.plugins.credentials.domains.Domain.global(),
c,
new UsernamePasswordCredentialsImpl(c.scope, "12345", c.description, c.username, new_password))
if (result) {
println "password changed for ${username}"
} else {
println "failed to change password for ${username}"
}
} else {
println "could not find credential for ${username}"
}
}
println "calling AWS for docker login"
def prs = "/usr/local/bin/aws --region us-east-1 ecr get-login".execute()
prs.waitFor()
def logintext = prs.text
if (prs.exitValue()) {
println "Got error from aws cli"
throw new Exception()
} else {
def password = logintext.split(" ")[5]
println "Updating password"
changePassword('AWS', password)
}
Notez s'il vous plaît:
- l'utilisation de la chaîne codée en dur
"AWS"
comme nom d'utilisateur pour les informations d'identification ECR - c'est ainsi que fonctionne ECR, mais si vous avez plusieurs informations d'identification avec le nom d'utilisateur "AWS", vous devrez mettre à jour le script pour localiser les informations d'identification en fonction de la champ de description ou quelque chose.
- Vous devez utiliser l'ID réel de votre clé ECR réelle dans le script, car l'API pour les informations d'identification remplace l'objet d'informations d'identification par un nouvel objet au lieu de simplement le mettre à jour, et la liaison entre l'étape de construction Docker et la clé se fait par l'ID. Si vous utilisez la valeur
null
de l'ID (comme dans la réponse que j'ai liée auparavant), un nouvel ID sera créé et le paramètre des informations d'identification dans l'étape de construction du docker sera perdu.
Et c'est tout - le script devrait pouvoir s'exécuter toutes les 12 heures et actualiser les informations d'identification ECR, et nous pouvons continuer à utiliser les plugins Docker.
L'utilisation de https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR avec le plugin Docker Build and Publish fonctionne très bien.
la source