जेनकींस के साथ अमेज़ॅन इलास्टिक कंटेनर रजिस्ट्री को एकीकृत करें


10

मैं अपने जेनकींस बिल्ड सेवा के साथ अमेज़ॅन की नई इलास्टिक कंटेनर रजिस्ट्री (ईसीआर) को एकीकृत करने की कोशिश कर रहा हूं। मैं कंटेनर छवियों का निर्माण करने और उन्हें एक रजिस्ट्री में प्रकाशित करने के लिए क्लाउडबीज डॉकर बिल्ड एंड पब्लिश प्लगइन का उपयोग कर रहा हूं।

अपनी निजी रजिस्ट्री के बजाय ECR का उपयोग करने के लिए, मैंने AWS CLI कमांड चलाई है, aws --region us-east-1 ecr get-loginजो docker loginचलाने के लिए एक कमांड को प्रायोजित करता है - लेकिन मैंने सिर्फ पासवर्ड की नकल की और उस पासवर्ड से "यूजरनेम विद पासवर्ड" टाइप जेननकिंस क्रेडेंशियल्स बनाया (उपयोगकर्ता नाम) हमेशा "AWS")।

और यह ठीक काम करता है! समस्या यह है कि EWS CLI द्वारा उत्पन्न ECR पासवर्ड केवल 12 घंटे के लिए वैध है। तो अभी, मुझे दिन में दो बार पासवर्ड को मैन्युअल रूप से पुनर्जीवित करना होगा और जेनकिंस क्रेडेंशियल्स स्क्रीन को मैन्युअल रूप से अपडेट करना होगा, अन्यथा मेरे बिल्ड विफल होने लगते हैं।

क्या स्थायी ईसीआर लॉगिन टोकन उत्पन्न करने का कोई तरीका है, या किसी तरह टोकन पीढ़ी को स्वचालित किया जा सकता है?

जवाबों:


6

यह अब amazon-ecr-क्रेडेंशियल-हेल्पर का उपयोग करके संभव है जैसा कि https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/ में वर्णित है ।

इसकी कमी यह है:

  • सुनिश्चित करें कि आपके Jenkins उदाहरण में आपके ECR रिपॉजिटरी के साथ खींचने / पुश करने के लिए उचित AWS क्रेडेंशियल हैं। ये पर्यावरण चर, एक साझा क्रेडेंशियल फ़ाइल, या उदाहरण प्रोफ़ाइल के रूप में हो सकते हैं।
  • $ PATH में एक निर्देशिका में docker-क्रेडेंशियल-इक्र-लॉगिन बाइनरी रखें।
  • जेनकिंस उपयोगकर्ता की होम निर्देशिका के तहत डॉकर कॉन्फ़िगरेशन फ़ाइल लिखें, उदाहरण के लिए, /var/lib/jenkins/.docker/config.json। सामग्री के साथ{"credsStore": "ecr-login"}
  • डॉकर बिल्ड और पब्लिश प्लगइन स्थापित करें और सुनिश्चित करें कि जेनकींस उपयोगकर्ता डोकर डेमॉन से संपर्क कर सकता है।
  • अंत में, एक बिल्ड स्टेप के साथ एक प्रोजेक्ट बनाएं जो डॉकटर इमेज प्रकाशित करता है

4

जैसा कि @Connor मैककार्थी ने कहा, अमेज़ॅन के लिए और अधिक स्थायी कुंजी के लिए एक बेहतर समाधान के साथ आने की प्रतीक्षा करते हुए, इस बीच में हमें जेनकिंस सर्वर पर किसी तरह खुद चाबियाँ बनाने की आवश्यकता होगी।

मेरा समाधान एक आवधिक नौकरी है जो ग्रोवी एपीआई का उपयोग करके ईसीआर के लिए जेनकींस क्रेडेंशियल्स को हर 12 घंटे में स्वचालित रूप से अपडेट करता है। यह इस बहुत विस्तृत जवाब पर आधारित है , हालांकि मैंने कुछ चीजें अलग तरह से कीं और मुझे स्क्रिप्ट को संशोधित करना पड़ा।

कदम:

  1. सुनिश्चित करें कि आपके जेनकींस मास्टर आवश्यक AWS एपीआई का उपयोग कर सकते हैं। मेरे सेटअप में जेनकिन्स मास्टर IAM भूमिका के साथ EC2 पर चल रहा है, इसलिए मुझे बस ecr:GetAuthorizationTokenसर्वर भूमिका की अनुमति देनी थी। [ अद्यतन ] किसी भी धक्का को सफलतापूर्वक पूरा करने के लिए, आपको इन अनुमतियों को देने की भी आवश्यकता होगी ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage:। अमेज़ॅन की एक अंतर्निहित नीति है जो इन क्षमताओं को प्रदान करती है, जिसे कहा जाता है 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. ग्रूवी प्लगइन स्थापित करें जो आपको जेनोकिंस सिस्टम के हिस्से के रूप में ग्रूवी स्क्रिप्ट चलाने की अनुमति देता है।
  4. क्रेडेंशियल स्क्रीन में, अपनी एडब्ल्यूएस ईसीआर कुंजी को देखें, "उन्नत" पर क्लिक करें और इसकी "आईडी" रिकॉर्ड करें। इस उदाहरण के लिए मैं मान रहा हूँ कि यह "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" उपयोगकर्ता नाम के साथ कई क्रेडेंशियल हैं, तो आपको क्रेडेंशियल का पता लगाने के लिए स्क्रिप्ट को अपडेट करने की आवश्यकता होगी वर्णन क्षेत्र या कुछ और।
  • आपको स्क्रिप्ट में अपनी वास्तविक ईसीआर कुंजी की असली आईडी का उपयोग करना चाहिए, क्योंकि क्रेडेंशियल के लिए एपीआई केवल अद्यतन करने के बजाय एक नई वस्तु के साथ क्रेडेंशियल्स ऑब्जेक्ट को बदलता है, और डॉकर बिल्ड चरण और कुंजी के बीच बंधन आईडी द्वारा होता है। यदि आप nullआईडी के लिए मान का उपयोग करते हैं (जैसा कि मैंने पहले लिंक किया था) में, तो एक नई आईडी बनाई जाएगी और डॉक बिल्ड चरण में क्रेडेंशियल्स की सेटिंग खो जाएगी।

और वह यह है - स्क्रिप्ट को प्रत्येक 12 घंटे चलाने और ईसीआर क्रेडेंशियल्स को रीफ्रेश करने में सक्षम होना चाहिए, और हम डॉकर प्लगइन्स का उपयोग करना जारी रख सकते हैं।


3

मैं भी ठीक इसी मुद्दे पर देख रहा था। मैं उस जवाब के साथ नहीं आया था जिसकी हम दोनों को तलाश थी, लेकिन मैं शेल स्क्रिप्टिंग के साथ वर्कअराउंड बनाने में सक्षम था। जब तक AWS ईसीआर क्रेडेंशियल्स के लिए एक बेहतर समाधान के साथ नहीं आता है, मैं इन पंक्तियों के साथ कुछ करने की योजना बनाता हूं।

मैंने जेनकिन्स जॉब के डॉकर बिल्ड और पब्लिश स्टेप को एक्जक्यूट शैल स्टेप से बदल दिया। मैंने अपने कंटेनर को ईसीआर बनाने और प्रकाशित करने के लिए निम्नलिखित स्क्रिप्ट (शायद बेहतर लिखा जा सकता है) का उपयोग किया। आवश्यकतानुसार चर> कोष्ठक में बदलें:

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

बहुत उचित लगता है। बात यह है - मुझे डॉकर बिल्ड और पब्लिश पसंद है, और मैं इसका उपयोग करना जारी रखता हूं, क्योंकि यह मेरे जीवन को सरल बनाता है। मेरे पास सिस्टम में कई कंटेनर बिल्ड हैं, और अधिक जोड़ना चाहते हैं, और उस स्क्रिप्ट को प्रत्येक बिल्ड में एकीकृत करना मेरे साथ रहने की इच्छा से अधिक परेशानी का है। मेरे पास एक वैकल्पिक समाधान है जिसे मैं एक उत्तर के रूप में जोड़ रहा हूं।
ग्रॉस

2

डॉक बिल्ड और पब्लिश प्लगइन के साथ https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR का उपयोग करना प्लगइन ठीक काम करता है।


मैंने इसे स्थापित किया है - लेकिन यह पता नहीं लगा सका कि इसके साथ क्या करना है: इसका कोई कॉन्फ़िगरेशन नहीं है और कोई UI नहीं है।
Guss

प्लगइन स्थापित करें। डॉकर बिल्ड एंड पब्लिश स्टेप में आपके पास "रजिस्ट्री क्रेडेंशियल" नामक एक ड्रॉप डाउन है। इसके आगे "Add" पर क्लिक करें, डायलॉग में "AWS क्रेडेंशियल्स" टाइप करें। प्रवेश कुंजी / गुप्त कुंजी दर्ज करें।
दानिलो

अब मैं देखता हूॅं। बहुत बुरा यह उदाहरण प्रोफाइल का समर्थन नहीं करता है।
गस

हाँ। लेकिन अभी के लिए मैं इस समाधान पसंद करते हैं।
डेनिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.