Wie @Connor McCarthy sagte, während wir darauf warteten, dass Amazon eine bessere Lösung für dauerhaftere Schlüssel findet, müssten wir die Schlüssel in der Zwischenzeit irgendwie selbst auf dem Jenkins-Server generieren.
Meine Lösung besteht darin, einen regelmäßigen Job zu haben, der die Jenkins-Anmeldeinformationen für ECR alle 12 Stunden mithilfe der Groovy-API automatisch aktualisiert. Dies basiert auf dieser sehr detaillierten Antwort , obwohl ich einige Dinge anders gemacht habe und das Skript ändern musste.
Schritte:
- Stellen Sie sicher, dass Ihr Jenkins-Master auf die erforderliche AWS-API zugreifen kann. In meinem Setup läuft der Jenkins-Master auf EC2 mit einer IAM-Rolle, daher musste ich
ecr:GetAuthorizationToken
der Serverrolle nur die Berechtigung hinzufügen . [ Update ] Um Pushs erfolgreich abzuschließen, müssen Sie außerdem die folgenden Berechtigungen erteilen : ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage
. Amazon verfügt über eine integrierte Richtlinie, die diese Funktionen bietet AmazonEC2ContainerRegistryPowerUser
.
- Stellen Sie sicher, dass die AWS CLI auf dem Master installiert ist. In meinem Setup, in dem der Master in einem Debian-Docker-Container ausgeführt wird, habe ich gerade diesen Shell-Build-Schritt zum Schlüsselgenerierungsjob hinzugefügt:
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
- Installieren Sie das Groovy-Plugin , mit dem Sie das Groovy-Skript als Teil des Jenkins-Systems ausführen können.
- Suchen Sie im Bildschirm mit den Anmeldeinformationen nach Ihrem AWS ECR-Schlüssel, klicken Sie auf "Erweitert" und notieren Sie die "ID". In diesem Beispiel gehe ich davon aus, dass es "12345" ist.
- Erstellen Sie einen neuen Job mit einem regelmäßigen Start von 12 Stunden und fügen Sie einen Erstellungsschritt "System Groovy Script" mit dem folgenden Skript hinzu:
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)
}
Bitte beachten Sie:
- Die Verwendung der fest codierten Zeichenfolge
"AWS"
als Benutzername für die ECR-Anmeldeinformationen - so funktioniert ECR. Wenn Sie jedoch mehrere Anmeldeinformationen mit dem Benutzernamen "AWS" haben, müssen Sie das Skript aktualisieren, um die Anmeldeinformationen basierend auf dem zu finden Beschreibungsfeld oder so.
- Sie müssen die reale ID Ihres realen ECR-Schlüssels im Skript verwenden, da die API für Anmeldeinformationen das Anmeldeinformationsobjekt durch ein neues Objekt ersetzt, anstatt es nur zu aktualisieren, und die Bindung zwischen dem Docker-Erstellungsschritt und dem Schlüssel durch die ID erfolgt. Wenn Sie den Wert
null
für die ID verwenden (wie in der Antwort, die ich zuvor verlinkt habe), wird eine neue ID erstellt und die Einstellung der Anmeldeinformationen im Docker-Erstellungsschritt geht verloren.
Und das war's - das Skript sollte alle 12 Stunden ausgeführt werden und die ECR-Anmeldeinformationen aktualisieren können, und wir können weiterhin die Docker-Plugins verwenden.
Die Verwendung von https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR mit dem Docker Build and Publish-Plugin funktioniert einwandfrei.
quelle