Tích hợp đăng ký container đàn hồi Amazon với Jenkins


10

Tôi đang cố gắng tích hợp Công cụ đăng ký thùng chứa đàn hồi (ECR) mới của Amazon với dịch vụ xây dựng Jenkins của tôi. Tôi đang sử dụng plugin Cloudbees Docker Build & Publish để xây dựng hình ảnh chứa và xuất bản chúng lên sổ đăng ký.

Để sử dụng ECR thay cho sổ đăng ký riêng của mình, tôi đã chạy lệnh AWS CLI aws --region us-east-1 ecr get-logintạo ra docker loginlệnh để chạy - nhưng tôi chỉ sao chép mật khẩu và tạo thông tin đăng nhập Jenkins loại "Tên người dùng có mật khẩu" từ mật khẩu đó (tên người dùng là luôn luôn "AWS").

Và nó hoạt động tốt! Vấn đề là mật khẩu ECR do AWS CLI tạo ra chỉ có hiệu lực trong 12 giờ. Vì vậy, ngay bây giờ, tôi phải tự tạo lại mật khẩu hai lần một ngày và cập nhật màn hình thông tin đăng nhập Jenkins bằng tay, nếu không các bản dựng của tôi bắt đầu bị lỗi.

Có cách nào để tạo mã thông báo đăng nhập ECR vĩnh viễn hoặc bằng cách nào đó tự động hóa việc tạo mã thông báo không?

Câu trả lời:


6

Điều này hiện có thể sử dụng amazon-ecr-cert-helper như được mô tả trong https://aws.amazon.com/bloss/compute/authenticating-amazon-ecr-reposeocate-for-docker-cli-with-credential-helper/ .

Tóm lại của nó là:

  • Đảm bảo rằng phiên bản Jenkins của bạn có thông tin xác thực AWS thích hợp để kéo / đẩy với kho lưu trữ ECR của bạn. Chúng có thể ở dạng các biến môi trường, tệp thông tin xác thực được chia sẻ hoặc hồ sơ cá thể.
  • Đặt nhị phân docker-cert-ecr-login tại một trong các thư mục trong $ PATH.
  • Viết tệp cấu hình Docker trong thư mục chính của người dùng Jenkins, ví dụ: /var/lib/jenkins/.docker/config.json. với nội dung{"credsStore": "ecr-login"}
  • Cài đặt plugin Docker Build and Publish và đảm bảo rằng người dùng jenkins có thể liên hệ với daemon Docker.
  • Cuối cùng, tạo một dự án với bước xây dựng để xuất bản hình ảnh docker

4

Như @Connor McCarthy đã nói, trong khi chờ đợi Amazon đưa ra giải pháp tốt hơn cho các khóa vĩnh viễn hơn, trong lúc này, chúng ta cần phải tự tạo các khóa trên máy chủ Jenkins.

Giải pháp của tôi là có một công việc định kỳ cập nhật thông tin đăng nhập Jenkins cho ECR cứ sau 12 giờ, sử dụng API Groovy. Điều này dựa trên câu trả lời rất chi tiết này , mặc dù tôi đã làm một vài điều khác biệt và tôi phải sửa đổi kịch bản.

Các bước:

  1. Đảm bảo chủ Jenkins của bạn có thể truy cập API AWS cần thiết. Trong thiết lập của tôi, chủ Jenkins đang chạy trên EC2 với vai trò IAM, vì vậy tôi chỉ cần thêm quyền ecr:GetAuthorizationTokencho vai trò máy chủ. [ cập nhật ] Để hoàn thành bất kỳ lần đẩy nào, bạn cũng cần cấp các quyền này : ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage. Amazon có một chính sách tích hợp cung cấp các khả năng này, được gọi là AmazonEC2ContainerRegistryPowerUser.
  2. Đảm bảo rằng AWS CLI được cài đặt trên bản gốc. Trong thiết lập của tôi, với bản gốc đang chạy trong bộ chứa docker debian, tôi vừa thêm bước xây dựng shell này vào công việc tạo khóa: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. Cài đặt plugin Groovy cho phép bạn chạy tập lệnh Groovy như một phần của hệ thống Jenkins.
  4. Trong màn hình thông tin đăng nhập, hãy tìm khóa AWS ECR của bạn, nhấp vào "Nâng cao" và ghi lại "ID" của nó. Trong ví dụ này tôi sẽ giả sử nó là "12345".
  5. Tạo một công việc mới, với thời gian khởi động 12 giờ định kỳ và thêm bước xây dựng "tập lệnh Groovy hệ thống" với tập lệnh sau:

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

Xin lưu ý:

  • việc sử dụng chuỗi được mã hóa cứng "AWS"làm tên người dùng cho thông tin đăng nhập ECR - đây là cách ECR hoạt động, nhưng nếu bạn có nhiều thông tin đăng nhập với tên người dùng "AWS", thì bạn cần cập nhật tập lệnh để xác định thông tin đăng nhập dựa trên trường mô tả hoặc một cái gì đó.
  • Bạn phải sử dụng ID thực của khóa ECR thực của mình trong tập lệnh, bởi vì API cho thông tin đăng nhập thay thế đối tượng thông tin xác thực bằng một đối tượng mới thay vì chỉ cập nhật nó và ràng buộc giữa bước xây dựng Docker và khóa là bởi ID. Nếu bạn sử dụng giá trị nullcho ID (như trong câu trả lời tôi đã liên kết trước đó), thì một ID mới sẽ được tạo và cài đặt thông tin đăng nhập trong bước xây dựng docker sẽ bị mất.

Và đó là - tập lệnh sẽ có thể chạy cứ sau 12 giờ và làm mới thông tin đăng nhập ECR và chúng tôi có thể tiếp tục sử dụng các trình cắm Docker.


3

Tôi đã xem xét vấn đề này chính xác quá. Tôi đã không đưa ra câu trả lời mà một trong hai chúng tôi đang tìm kiếm, nhưng tôi đã có thể tạo ra một cách giải quyết với kịch bản shell. Cho đến khi AWS đưa ra một giải pháp tốt hơn cho thông tin ECR, tôi dự định sẽ làm một cái gì đó dọc theo những dòng này.

Tôi đã thay thế bước Docker Build and Publish của công việc Jenkins và bước Execute Shell. Tôi đã sử dụng đoạn script sau (có thể được viết tốt hơn) để xây dựng và xuất bản container của mình lên ECR. Thay thế các biến trong <> ngoặc nếu cần:

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

Âm thanh rất hợp lý. điều này là - tôi thích Docker Build and Publish, và tôi thích tiếp tục sử dụng nó, vì nó đơn giản hóa cuộc sống của tôi. Tôi có một số bản dựng container trong hệ thống và muốn thêm nhiều hơn nữa và việc tích hợp tập lệnh đó vào mỗi bản dựng sẽ rắc rối hơn tôi sẵn sàng sống cùng. Tôi có một giải pháp thay thế mà tôi đang thêm vào như một câu trả lời.
Guss

2

Sử dụng https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR với plugin Docker Build and Publish hoạt động tốt.


Tôi đã cài đặt nó - nhưng không thể biết phải làm gì với nó: nó không có cấu hình và không có UI.
Guss

Cài đặt plugin. Trong bước Xây dựng và Xuất bản Docker, bạn có một trình đơn thả xuống có tên là "Thông tin đăng ký". Nhấp vào "Thêm" bên cạnh, chọn loại "Thông tin xác thực AWS" trong hộp thoại. Nhập khóa truy cập / khóa bí mật.
Danilo

Bây giờ tôi thấy. Quá tệ, nó không hỗ trợ hồ sơ cá nhân.
Guss

Đúng. Nhưng bây giờ tôi thích giải pháp này.
Danilo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.