Інтегруйте реєстр еластичних контейнерів Amazon з Дженкінсом


10

Я намагаюся інтегрувати новий реєстр еластичних контейнерів Amazon (ECR) зі своєю службою побудови Дженкінса. Я використовую плагін Cloudbees Docker Build & Publish для створення зображень контейнерів та публікації їх у реєстрі.

Щоб використовувати ECR замість мого приватного реєстру, я запустив команду AWS CLI, aws --region us-east-1 ecr get-loginяка вказує docker loginна запуск команди - але я просто скопіював пароль і створив з цього пароля дані Дженкінса типу "Ім'я користувача з паролем" (ім'я користувача завжди "AWS").

І це прекрасно працює! Проблема полягає в тому, що пароль ECR, створений AWS CLI, діє лише 12 годин. Тому зараз мені доведеться двічі на день вручну регенерувати пароль та вручну оновлювати екран облікових даних Дженкінса, інакше мої збірки починають виходити з ладу.

Чи існує спосіб генерування постійних маркерів для входу в ECR або якимось чином автоматизувати генерацію маркерів?

Відповіді:


6

Тепер це можливо, використовуючи помічник amazon-ecr-мандата, як описано в https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/ .

Недолік цього:

  • Переконайтесь, що ваш екземпляр Дженкінса має належні облікові дані AWS, які можна витягнути / натиснути разом із вашим сховищем ECR. Вони можуть бути у вигляді змінних оточуючих середовищ, спільного файлу облікових даних або профілю екземпляра.
  • Розмістіть бінарний файл docker-povericial-ecr-login в одному з каталогів у $ PATH.
  • Запишіть файл конфігурації Docker у домашній каталог користувача Jenkins, наприклад, /var/lib/jenkins/.docker/config.json. зі змістом{"credsStore": "ecr-login"}
  • Встановіть плагін Docker Build and Publish і переконайтеся, що користувач jenkins може зв’язатися з демоном Docker.
  • Нарешті, створіть проект із кроком збирання, який публікує зображення докера

4

Як сказав @Connor McCarthy, чекаючи, поки Amazon придумає краще рішення для більш постійних ключів, в той же час нам потрібно буде якось генерувати ключі на сервері Jenkins.

Моє рішення - мати періодичну роботу, яка автоматично оновлює облікові дані Дженкінса для ECR кожні 12 годин за допомогою API Groovy. На цьому ґрунтується ця дуже детальна відповідь , хоча я зробив декілька речей інакше, і мені довелося змінити сценарій.

Кроки:

  1. Переконайтесь, що ваш майстер Дженкінса може отримати доступ до потрібного API AWS. У моїх налаштуваннях майстер Дженкінса працює на EC2 з роллю IAM, тому мені просто довелося додати дозвіл ecr:GetAuthorizationTokenна роль сервера. [ Оновлення ] Щоб отримати якісь - або поштовхи успішно завершені, ви також повинні надати ці дозволи: ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage. В Amazon є вбудована політика, яка пропонує ці можливості, звані AmazonEC2ContainerRegistryPowerUser.
  2. Переконайтесь, що AWS CLI встановлений на майстрі. У моєму налаштуванні, коли майстер працює в контейнері докерів Debian, я щойно додав цей крок збирання оболонки до завдання ключового покоління: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. Встановіть плагін Groovy, який дозволяє запускати сценарій Groovy як частина системи Дженкінса.
  4. На екрані облікових даних знайдіть ключ AWS ECR, натисніть «Додатково» та запишіть його «Ідентифікатор». Для цього прикладу я припускаю, що це "12345".
  5. Створіть нове завдання з періодичним запуском 12 годин та додайте крок складання "системного сценарію Groovy" із наступним сценарієм:

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)
}

Будь ласка, запиши:

  • використання жорстко кодованої рядки "AWS"як імені користувача для облікових даних ECR - ось так працює ECR, але якщо у вас є кілька облікових даних з іменем користувача "AWS", вам потрібно буде оновити сценарій, щоб знайти облікові дані на основі поле опису чи щось.
  • Ви повинні використовувати справжній ідентифікатор вашого справжнього ключа ECR у скрипті, оскільки API для облікових даних замінює об’єкт облікових даних новим об'єктом, а не лише його оновленням, а прив'язка між етапом збирання Docker і ключем здійснюється ідентифікатором. Якщо ви використовуєте значення nullдля ідентифікатора (як у відповіді, до якої я посилався раніше), тоді буде створено новий ідентифікатор, а налаштування облікових даних на кроці складання докера буде втрачено.

І це все - сценарій повинен мати можливість працювати кожні 12 годин та оновлювати дані ECR, і ми можемо продовжувати використовувати плагіни Docker.


3

Я теж розглядав цю саму проблему. Я не придумав відповіді, яку шукав хтось із нас, але мені вдалося створити вирішення сценаріїв оболонок. Поки AWS не вийде з кращим рішенням для облікових даних ECR, я планую зробити щось у цьому напрямку.

Я замінив крок Docker Build and Publish у виконанні завдання Дженкінса на і виконати крок Shell. Я використовував наступний скрипт (можливо, це було б написано краще) для складання та публікації свого контейнера до ECR. Замініть змінні в дужках <> за потребою:

#!/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}

Звучить дуже розумно. річ у тому, що мені подобається Docker Build and Publish, і я швидше продовжую користуватися ним, оскільки це спрощує моє життя. У мене є декілька збірок контейнерів у системі, і я хочу додати більше, і інтегрувати цей сценарій у кожну збірку - більше клопоту, ніж я готовий жити. У мене є альтернативне рішення, яке я додаю як відповідь.
Гасс

2

Використання https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR з плагіном Docker Build and Publish працює просто чудово.


Я встановив його, але не міг зрозуміти, що з ним робити: він не має конфігурації та інтерфейсу користувача.
Guss

Встановіть плагін. На кроці Docker Build and Publish у вас є спадне меню, що називається "Реєстраційні дані". Клацніть на "Додати" поруч із ним, у діалоговому вікні виберіть "Введіть сертифікати AWS". Введіть ключ доступу / секретний ключ.
Данило

Тепер я бачу. Шкода, що він не підтримує профілі примірників.
Гасс

Так. Але наразі я віддаю перевагу цьому рішенню.
Данило
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.