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.