Amazon Elastik Konteyner Kayıt Defterini Jenkins ile entegre edin


10

Amazon'un yeni Elastik Konteyner Tescili'ni (ECR) Jenkins oluşturma hizmetimle entegre etmeye çalışıyorum. Konteyner görüntüleri oluşturmak ve bunları bir kayıt defterinde yayınlamak için Cloudbees Docker Build & Publish eklentisini kullanıyorum.

Özel kayıt yerine aws --region us-east-1 ecr get-loginECR'yi kullanmak için docker login, çalıştırılacak bir komut yazan AWS CLI komutunu çalıştırdım - ancak şifreyi kopyaladım ve bu şifreden "şifre ile kullanıcı adı" türünde bir Jenkins kimlik bilgileri oluşturdum (kullanıcı adı her zaman "AWS").

Ve bu iyi çalışıyor! Sorun, AWS CLI tarafından oluşturulan ECR şifresinin sadece 12 saat boyunca geçerli olmasıdır. Şu anda, şifreyi günde iki kez manuel olarak yeniden oluşturmam ve Jenkins kimlik bilgileri ekranını manuel olarak güncellemem gerekiyor, aksi takdirde derlemelerim başarısız olmaya başlıyor.

Kalıcı ECR giriş belirteçleri oluşturmanın veya bir şekilde belirteç oluşturmayı otomatikleştirmenin bir yolu var mı?

Yanıtlar:


6

Bu artık https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/ sayfasında açıklandığı gibi amazon-ecr-credential-helper kullanılarak mümkündür .

Kısaca:

  • Jenkins örneğinizin ECR deponuzu çekmek / almak için uygun AWS kimlik bilgilerine sahip olduğundan emin olun. Bunlar ortam değişkenleri, paylaşılan bir kimlik bilgisi dosyası veya bir örnek profili şeklinde olabilir.
  • Docker-credential-ecr-login ikili dosyasını $ PATH dizinindeki dizinlerden birine yerleştirin.
  • Docker yapılandırma dosyasını Jenkins kullanıcısının ana dizininin altına yazın, örneğin /var/lib/jenkins/.docker/config.json. içerikle{"credsStore": "ecr-login"}
  • Docker Derleme ve Yayınlama eklentisini yükleyin ve jenkins kullanıcısının Docker arka plan programına başvurabildiğinden emin olun.
  • Son olarak, docker görüntüsünü yayınlayan bir oluşturma adımıyla bir proje oluşturun

4

@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:

  1. 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:GetAuthorizationTokensunucu 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.
  2. 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
  3. Jenkins sisteminin bir parçası olarak Groovy komut dosyasını çalıştırmanıza izin veren Groovy eklentisini yükleyin .
  4. 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.
  5. 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. nullKimlik 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.


3

Ben de aynı konuyu araştırıyordum. İkimizin de aradığı cevabı bulamadım, ancak kabuk komut dosyası oluşturma ile bir geçici çözüm oluşturabildim. AWS, ECR kimlik bilgilerine daha iyi bir çözüm sunana kadar, bu hatlar boyunca bir şeyler yapmayı planlıyorum.

Jenkins işinin Docker Build and Publish adımını ve Execute Shell adımıyla değiştirdim. Konteynerimi ECR'ye oluşturmak ve yayınlamak için aşağıdaki komut dosyasını kullandım (muhtemelen daha iyi yazılabilir). <> Parantez içindeki değişkenleri gerektiği gibi değiştirin:

#!/bin/bash

#Variables
REG_ADDRESS="<your ECR Registry Address>"
REPO="<your ECR Repository>"
IMAGE_VERSION="v_"${BUILD_NUMBER}
WORKSPACE_PATH="<path to the workspace directory of the Jenkins job>"

#Login to ECR Repository
LOGIN_STRING=`aws ecr get-login --region us-east-1`
${LOGIN_STRING}

#Build the containerexit
cd ${WORKSPACE_PATH}
docker build -t ${REPO}:${IMAGE_VERSION} .

#Tag the build with BUILD_NUMBER version and Latests
docker tag ${REPO}:${IMAGE_VERSION} ${REPO_ADDRESS}/${REPO}:${IMAGE_VERSION}

#Push builds
docker push ${REG_ADDRESS}/${REPO}:${IMAGE_VERSION}

Kulağa çok makul geliyor. mesele şu: Docker Build and Publish'ı seviyorum ve hayatımı kolaylaştırdığı için kullanmaya devam ediyorum. Sistemde birkaç konteyner inşa var ve daha fazla eklemek istiyorum, ve bu komut dosyası her derleme entegre yaşamak için istekli daha fazla güçlük. Cevap olarak eklediğim alternatif bir çözümüm var.
Guss

2

Kullanılması https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR Docker Build ile ve sadece iyi işler eklentisi yayınlayın.


Yükledim - ancak onunla ne yapacağımı anlayamadım: yapılandırması ve kullanıcı arayüzü yok.
Guss

Eklentiyi yükleyin. Docker Derleme ve Yayınlama adımında "Kayıt defteri kimlik bilgileri" adlı bir açılır listeniz vardır. Yanındaki "Ekle" yi tıklayın, iletişim kutusunda "AWS Kimlik Bilgileri" olarak seçin. Erişim anahtarını / gizli anahtarı girin.
Danilo

Şimdi anladım. Çok kötü, örnek profillerini desteklemiyor.
Guss

Evet. Ama şimdilik bu çözümü tercih ediyorum.
Danilo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.