@ কননর ম্যাকার্থি যেমন বলেছিলেন, অ্যামাজন আরও স্থায়ী কীগুলির জন্য আরও ভাল সমাধান নিয়ে আসার অপেক্ষায় ছিলাম, সেই সময়ে আমাদের নিজেরাই জেনকিন্স সার্ভারে কী তৈরি করতে হবে।
আমার সমাধানটি পর্যায়ক্রমে কাজ করা যা গ্রোভি এপিআই ব্যবহার করে প্রতি 12 ঘন্টা স্বয়ংক্রিয়ভাবে ইসিআর-এর জেনকিনস শংসাপত্রগুলি আপডেট করে। এটি এই খুব বিস্তারিত উত্তরের উপর ভিত্তি করে তৈরি করা হয়েছে , যদিও আমি কিছু কিছু ভিন্নভাবে করেছি এবং আমাকে স্ক্রিপ্টটি পরিবর্তন করতে হয়েছিল।
পদক্ষেপ:
- আপনার জেনকিন্স মাস্টার প্রয়োজনীয় AWS API এ অ্যাক্সেস করতে পারবেন তা নিশ্চিত করুন। আমার সেটআপে জেনকিন্স মাস্টার একটি আইএএম ভূমিকা নিয়ে ইসি 2 তে চলছে, সুতরাং আমাকে কেবল
ecr:GetAuthorizationToken
সার্ভারের ভূমিকাতে অনুমতি যোগ করতে হয়েছিল। [ আপডেট ] পেতে কোনো push কর্মের সম্পন্ন সফলভাবে আপনার কাছে এই অনুমতি প্রদান করতে প্রয়োজন চাই: 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
- গ্রোভি প্লাগইন ইনস্টল করুন যা জেনকিনস সিস্টেমের অংশ হিসাবে গ্রোভী স্ক্রিপ্টটি চালানোর অনুমতি দেয়।
- শংসাপত্রগুলির স্ক্রিনে আপনার AWS ECR কীটি সন্ধান করুন, "উন্নত" ক্লিক করুন এবং এর "আইডি" রেকর্ড করুন। এই উদাহরণের জন্য আমি ধরে নিচ্ছি এটি "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"
ইসিআর শংসাপত্রগুলির জন্য ব্যবহারকারীর নাম হিসাবে হার্ড কোডিং স্ট্রিংয়ের ব্যবহার - ইসিআর এইভাবে কাজ করে তবে আপনার যদি "AWS" ব্যবহারকারীর নামটি একাধিক শংসাপত্র থাকে তবে আপনার উপর ভিত্তি করে শংসাপত্রগুলি সনাক্ত করার জন্য আপনাকে স্ক্রিপ্টটি আপডেট করতে হবে বর্ণনা ক্ষেত্র বা কিছু।
- আপনাকে অবশ্যই স্ক্রিপ্টে আপনার আসল ইসিআর কীটির আসল আইডি ব্যবহার করতে হবে কারণ শংসাপত্রগুলির জন্য API কেবলমাত্র আপডেট করার পরিবর্তে শংসাপত্রগুলির জন্য নতুন আইটেমটি প্রতিস্থাপন করে এবং ডকার বিল্ড স্টেপ এবং কীটির মধ্যে বাইন্ডিং আইডি দ্বারা থাকে। আপনি যদি
null
আইডির মানটি ব্যবহার করেন (আমি আগে যুক্ত লিখিত উত্তরের মতো), তবে একটি নতুন আইডি তৈরি হবে এবং ডকার বিল্ড স্টেপে শংসাপত্রগুলির সেটিংস নষ্ট হবে।
এবং এটি হ'ল স্ক্রিপ্টটি প্রতি 12 ঘন্টা অন্তর চালানো এবং ইসিআর শংসাপত্রগুলি রিফ্রেশ করতে সক্ষম হওয়া উচিত এবং আমরা ডকার প্লাগইনগুলি ব্যবহার চালিয়ে যেতে পারি।