@Connor McCarthy가 말했듯이 아마존이 더 영구적 인 키를위한 더 나은 솔루션을 제시하기를 기다리는 동안 Jenkins 서버에서 직접 키를 생성해야합니다.
내 솔루션은 Groovy API를 사용하여 12 시간마다 자동으로 ECR의 Jenkins 자격 증명을 업데이트하는 정기적 인 작업을하는 것입니다. 이것은 몇 가지 다르게 수행했지만 스크립트를 수정해야했지만 이 매우 자세한 답변을 기반으로 합니다 .
단계 :
- Jenkins 마스터가 필요한 AWS API에 액세스 할 수 있는지 확인하십시오. 내 설정에서 Jenkins 마스터는 IAM 역할을 가진 EC2에서 실행 중이므로
ecr:GetAuthorizationToken
서버 역할에 권한 을 추가하기 만하면 됩니다. [ update ] 푸시를 성공적으로 완료하려면 다음 권한도 부여해야합니다 ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage
.. Amazon에는 이러한 기능을 제공하는 기본 제공 정책이 있습니다 AmazonEC2ContainerRegistryPowerUser
.
- 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
- Jenkins 시스템의 일부로 Groovy 스크립트를 실행할 수 있는 Groovy 플러그인 을 설치하십시오 .
- 자격 증명 화면에서 AWS ECR 키를 찾아 "Advanced"를 클릭하고 "ID"를 기록하십시오. 이 예에서는 "12345"라고 가정하겠습니다.
- 주기적으로 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를 사용해야합니다.
null
ID에 대한 값 을 사용하면 (이전에 링크 한 답변에서와 같이) 새 ID가 생성되고 docker build 단계에서 자격 증명 설정이 손실됩니다.
스크립트가 12 시간마다 실행되고 ECR 자격 증명을 새로 고칠 수 있어야하며 Docker 플러그인을 계속 사용할 수 있습니다.