@Connor McCarthy'nin dediği gibi, Amazon'un daha kalıcı anahtarlar için daha iyi bir çözüm bulmasını beklerken, bu arada Jenkins sunucusundaki anahtarları kendimiz bir şekilde üretmemiz gerekecekti.
Çözümüm, Groovy API'sini kullanarak ECR için Jenkins kimlik bilgilerini her 12 saatte bir otomatik olarak güncelleyen periyodik bir işe sahip olmaktır. Bu çok ayrıntılı cevaba dayanıyor , ancak birkaç şeyi farklı yaptım ve senaryoyu değiştirmek zorunda kaldım.
Adımlar:
- Jenkins master'ınızın gerekli AWS API'sına erişebildiğinden emin olun. Kurulumumda Jenkins ustası EC2 üzerinde bir IAM rolü ile çalışıyor, bu yüzden sadece
ecr:GetAuthorizationToken
sunucu rolüne izin eklemek zorunda kaldım . [ Güncelleme ] Herhangi iter başarıyla, ayrıca bu izinleri vermek gerekiyordu tamamlamak almak için: ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage
. Amazon, bu yetenekleri sunan yerleşik bir politikaya sahiptir AmazonEC2ContainerRegistryPowerUser
.
- AWS CLI'nin master'a takıldığından emin olun. Kurulumumda, usta bir debian docker kapsayıcısında çalışırken, bu kabuk oluşturma adımını anahtar oluşturma işine ekledim:
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
- Jenkins sisteminin bir parçası olarak Groovy komut dosyasını çalıştırmanıza izin veren Groovy eklentisini yükleyin .
- Kimlik bilgileri ekranında AWS ECR anahtarınızı arayın, "Gelişmiş" i tıklayın ve "Kimliğini" kaydedin. Bu örnek için bunun "12345" olduğunu varsayacağım.
- 12 saatlik periyodik olarak başlatılan yeni bir iş oluşturun ve aşağıdaki komut dosyasıyla "system Groovy script" oluşturma adımını ekleyin:
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)
}
Lütfen aklınızda bulundurun:
- sabit kodlu dizenin
"AWS"
ECR kimlik bilgileri için kullanıcı adı olarak kullanılması - ECR'nin çalışma şekli budur, ancak "AWS" kullanıcı adıyla birden fazla kimlik bilginiz varsa, kimlik bilgilerini bulmak için komut dosyasını güncellemeniz gerekir. açıklama alanı falan.
- Kimlik bilgileri API'sı, kimlik bilgileri nesnesini yalnızca güncellemek yerine yeni bir nesneyle değiştirdiğinden ve Docker oluşturma adımı ile anahtar arasındaki bağlantı kimliğe göre olduğundan, kodda gerçek ECR anahtarınızın gerçek kimliğini kullanmanız gerekir.
null
Kimlik değerini (daha önce bağladığım yanıtta olduğu gibi) kullanırsanız, yeni bir kimlik oluşturulur ve liman işleyicisi oluşturma adımındaki kimlik bilgilerinin ayarı kaybolur.
Ve işte bu - komut dosyası her 12 saatte bir çalışmalı ve ECR kimlik bilgilerini yenileyebilmelidir ve Docker eklentilerini kullanmaya devam edebiliriz.