Jenkins와 Amazon Elastic Container Registry 통합


10

Jenkins 빌드 서비스와 Amazon의 새로운 Elastic Container Registry (ECR)를 통합하려고합니다. Cloudbees Docker Build & Publish 플러그인을 사용하여 컨테이너 이미지를 빌드하고 레지스트리에 게시합니다.

개인 레지스트리 대신 ECR을 사용하려면 AWS CLI 명령 을 실행 aws --region us-east-1 ecr get-login하여 docker login명령을 실행합니다. 그러나 비밀번호를 복사하고 해당 비밀번호에서 "Username with password"유형의 Jenkins 자격 증명을 생성했습니다 (사용자 이름은 항상 "AWS").

그리고 그것은 잘 작동합니다! 문제는 AWS CLI에서 생성 한 ECR 암호가 12 시간 동안 만 유효하다는 것입니다. 그래서 지금은 하루에 두 번 암호를 수동으로 다시 생성하고 Jenkins 자격 증명 화면을 수동으로 업데이트해야합니다. 그렇지 않으면 빌드가 실패합니다.

영구 ECR 로그인 토큰을 생성하거나 토큰 생성을 자동화하는 방법이 있습니까?

답변:


6

https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/에 설명 된대로 amazon-ecr-credential-helper 를 사용하면 가능합니다 .

그것의 부족은 :

  • Jenkins 인스턴스에 ECR 리포지토리를 가져 오거나 푸시 할 수있는 적절한 AWS 자격 증명이 있는지 확인하십시오. 환경 변수, 공유 자격 증명 파일 또는 인스턴스 프로파일의 형태 일 수 있습니다.
  • docker-credential-ecr-login 바이너리를 $ PATH의 디렉토리 중 하나에 배치하십시오.
  • Jenkins 사용자의 홈 디렉토리 아래에 Docker 구성 파일을 작성하십시오 (예 : /var/lib/jenkins/.docker/config.json). 내용으로{"credsStore": "ecr-login"}
  • Docker Build and Publish 플러그인을 설치하고 jenkins 사용자가 Docker 데몬에 접속할 수 있는지 확인하십시오.
  • 마지막으로 docker 이미지를 게시하는 빌드 단계로 프로젝트를 만듭니다.

4

@Connor McCarthy가 말했듯이 아마존이 더 영구적 인 키를위한 더 나은 솔루션을 제시하기를 기다리는 동안 Jenkins 서버에서 직접 키를 생성해야합니다.

내 솔루션은 Groovy API를 사용하여 12 시간마다 자동으로 ECR의 Jenkins 자격 증명을 업데이트하는 정기적 인 작업을하는 것입니다. 이것은 몇 가지 다르게 수행했지만 스크립트를 수정해야했지만 이 매우 자세한 답변을 기반으로 합니다 .

단계 :

  1. Jenkins 마스터가 필요한 AWS API에 액세스 할 수 있는지 확인하십시오. 내 설정에서 Jenkins 마스터는 IAM 역할을 가진 EC2에서 실행 중이므로 ecr:GetAuthorizationToken서버 역할에 권한 을 추가하기 만하면 됩니다. [ update ] 푸시를 성공적으로 완료하려면 다음 권한도 부여해야합니다 ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage.. Amazon에는 이러한 기능을 제공하는 기본 제공 정책이 있습니다 AmazonEC2ContainerRegistryPowerUser.
  2. AWS CLI가 마스터에 설치되어 있는지 확인하십시오. 설정에서 마스터가 데비안 도커 컨테이너에서 실행되면이 쉘 빌드 단계를 키 생성 작업에 추가했습니다.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 시스템의 일부로 Groovy 스크립트를 실행할 수 있는 Groovy 플러그인 을 설치하십시오 .
  4. 자격 증명 화면에서 AWS ECR 키를 찾아 "Advanced"를 클릭하고 "ID"를 기록하십시오. 이 예에서는 "12345"라고 가정하겠습니다.
  5. 주기적으로 12 시간 실행하여 새 작업을 작성하고 다음 스크립트를 사용하여 "시스템 그루비 스크립트"빌드 단계를 추가하십시오.

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"인 자격 증명이 여러 개인 경우 스크립트를 업데이트해야합니다. 설명 필드 또는 무언가.
  • 신임 정보에 대한 API가 신임 정보 오브젝트를 업데이트하는 대신 새 오브젝트로 바꾸고 Docker 빌드 단계와 키 사이의 바인딩은 ID를 사용하므로 스크립트에서 실제 ECR 키의 실제 ID를 사용해야합니다. nullID에 대한 값 을 사용하면 (이전에 링크 한 답변에서와 같이) 새 ID가 생성되고 docker build 단계에서 자격 증명 설정이 손실됩니다.

스크립트가 12 시간마다 실행되고 ECR 자격 증명을 새로 고칠 수 있어야하며 Docker 플러그인을 계속 사용할 수 있습니다.


3

나는이 똑같은 문제를 조사하고있었습니다. 우리 중 하나가 찾고있는 대답을 얻지 못했지만 쉘 스크립팅으로 해결 방법을 만들 수있었습니다. AWS가 ECR 자격 증명에 대한 더 나은 솔루션을 제공 할 때까지 이러한 라인을 따라 무언가를 수행 할 계획입니다.

Jenkins 작업의 Docker 빌드 및 게시 단계를 셸 실행 단계로 바꿨습니다. 컨테이너를 작성하고 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

Docker Build and Publish 플러그인과 함께 https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR 을 사용하면 정상적으로 작동합니다.


나는 그것을 설치했지만 그것으로 무엇을 해야할지 알 수 없었다 : 그것은 구성과 UI가 없다.
— 거스

플러그인을 설치하십시오. Docker 빌드 및 게시 단계에는 "레지스트리 자격 증명"이라는 드롭 다운이 있습니다. 옆에있는 "추가"를 클릭하고 대화 상자에서 "AWS 자격 증명"유형을 선택하십시오. 액세스 키 / 비밀 키를 입력하십시오.
— Danilo

이제 알겠습니다. 인스턴스 프로필을 지원하지 않습니다.
— 거스

예. 그러나 지금은이 솔루션을 선호합니다.
— Danilo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.