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