জেনকিন্সের সাথে অ্যামাজন ইলাস্টিক কনটেইনার রেজিস্ট্রি একীভূত করুন


10

আমি আমার জেনকিনস বিল্ড সার্ভিসের সাথে অ্যামাজনের নতুন ইলাস্টিক কনটেইনার রেজিস্ট্রি (ইসিআর) সংহত করার চেষ্টা করছি। আমি কনটেইনার চিত্রগুলি তৈরি করতে এবং একটি রেজিস্ট্রিতে প্রকাশ করার জন্য ক্লাউডবিজ ডকার বিল্ড ও প্রকাশনা প্লাগইন ব্যবহার করছি।

আমার ব্যক্তিগত রেজিস্ট্রির পরিবর্তে ইসিআর ব্যবহার করতে, আমি এডাব্লুএস সিএলআই কমান্ডটি aws --region us-east-1 ecr get-loginচালিয়েছি যা docker loginচালানোর জন্য একটি আদেশ দেয় - তবে আমি কেবল পাসওয়ার্ডটি অনুলিপি করেছিলাম এবং সেই পাসওয়ার্ড থেকে "পাসওয়ার্ডের সাথে ব্যবহারকারীর নাম" জাতীয় জেনকিনস শংসাপত্র তৈরি করেছি (ব্যবহারকারীর নামটি হ'ল) সর্বদা "AWS")।

এবং যে সূক্ষ্ম কাজ করে! সমস্যাটি হ'ল EW পাসওয়ার্ডটি এডাব্লুএস সিএলআই দ্বারা উত্পন্ন হয় কেবল 12 ঘন্টা জন্য বৈধ। এখনই, আমাকে নিজেই দিনে দুবার পাসওয়ার্ডটি পুনরায় জেনারেট করতে হবে এবং জেনকিনস শংসাপত্রের স্ক্রীনটি ম্যানুয়ালি আপডেট করতে হবে, অন্যথায় আমার বিল্ডগুলি ব্যর্থ হতে শুরু করে।

স্থায়ী ইসিআর লগইন টোকেন উত্পন্ন করার কোনও উপায় আছে, বা কোনওরকমে টোকেন জেনারেশনটি স্বয়ংক্রিয় করতে পারে?

উত্তর:


6

এটি এখন ব্যবহার সম্ভব আমাজন-ECR-ক্রেডেনশিয়াল-সাহায্যকারী বর্ণনা অনুযায়ী https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/

এর সংক্ষিপ্তটি হ'ল:

  • আপনার জেনকিন্স দৃষ্টান্তে আপনার ইসিআর সংগ্রহস্থলটি টান / ধাক্কা দেওয়ার জন্য উপযুক্ত AWS শংসাপত্র রয়েছে তা নিশ্চিত করুন। এগুলি এনভায়রনমেন্ট ভেরিয়েবল, একটি শেয়ার্ড শংসাপত্র ফাইল, বা একটি উদাহরণ প্রোফাইল আকারে থাকতে পারে।
  • Ock PATH- র ডিরেক্টরিগুলির একটিতে ডকার-শংসাপত্র-এসিআর-লগইন বাইনারি রাখুন।
  • জেনকিন্স ব্যবহারকারীর হোম ডিরেক্টরিতে ডকার কনফিগারেশন ফাইলটি লিখুন, উদাহরণস্বরূপ, /var/lib/jenkins/.docker/config.json। বিষয়বস্তু সহ{"credsStore": "ecr-login"}
  • ডকার বিল্ড এবং প্রকাশ করুন প্লাগইন ইনস্টল করুন এবং নিশ্চিত করুন যে জেনকিন্স ব্যবহারকারী ডকার ডিমনটির সাথে যোগাযোগ করতে পারে।
  • অবশেষে, একটি বিল্ড স্টেপ সহ একটি প্রকল্প তৈরি করুন যা ডকার চিত্রটি প্রকাশ করে

4

@ কননর ম্যাকার্থি যেমন বলেছিলেন, অ্যামাজন আরও স্থায়ী কীগুলির জন্য আরও ভাল সমাধান নিয়ে আসার অপেক্ষায় ছিলাম, সেই সময়ে আমাদের নিজেরাই জেনকিন্স সার্ভারে কী তৈরি করতে হবে।

আমার সমাধানটি পর্যায়ক্রমে কাজ করা যা গ্রোভি এপিআই ব্যবহার করে প্রতি 12 ঘন্টা স্বয়ংক্রিয়ভাবে ইসিআর-এর জেনকিনস শংসাপত্রগুলি আপডেট করে। এটি এই খুব বিস্তারিত উত্তরের উপর ভিত্তি করে তৈরি করা হয়েছে , যদিও আমি কিছু কিছু ভিন্নভাবে করেছি এবং আমাকে স্ক্রিপ্টটি পরিবর্তন করতে হয়েছিল।

পদক্ষেপ:

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

এবং এটি হ'ল স্ক্রিপ্টটি প্রতি 12 ঘন্টা অন্তর চালানো এবং ইসিআর শংসাপত্রগুলি রিফ্রেশ করতে সক্ষম হওয়া উচিত এবং আমরা ডকার প্লাগইনগুলি ব্যবহার চালিয়ে যেতে পারি।


3

আমিও ঠিক এই একই সমস্যাটি সন্ধান করছিলাম। আমি উভয়ই উত্তরটির সন্ধান করিনি যা আমরা উভয়ই সন্ধান করছিলাম, তবে আমি শেল স্ক্রিপ্টিং সহ একটি কার্যনির্বাহ তৈরি করতে সক্ষম হয়েছি। যতক্ষণ না এডাব্লুএস ইসিআর শংসাপত্রগুলির আরও ভাল সমাধান নিয়ে আসে, আমি এই লাইনগুলি বরাবর কিছু করার পরিকল্পনা করছি।

আমি জেনকিন্স কাজের ডকার বিল্ড এবং প্রকাশিত পদক্ষেপটি শেল পদক্ষেপের সাথে প্রতিস্থাপন করেছি। আমি আমার ধারকটি ইসিআর তৈরি ও প্রকাশ করতে নিম্নলিখিত স্ক্রিপ্টটি (সম্ভবত আরও ভাল লেখা যেতে পারে) ব্যবহার করেছি। প্রয়োজন অনুসারে <> বন্ধনীগুলিতে ভেরিয়েবলগুলি প্রতিস্থাপন করুন:

#!/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 ব্যবহার করা ঠিক কাজ করে।


আমি এটি ইনস্টল করেছি - তবে এটি দিয়ে কী করবেন তা অনুধাবন করতে পারিনি: এটির কোনও কনফিগারেশন নেই এবং কোনও ইউআইও নেই।
গাস

প্লাগইন ইনস্টল করুন। ডকার বিল্ড এবং প্রকাশের পদক্ষেপে আপনার কাছে "রেজিস্ট্রি শংসাপত্রগুলি" নামে একটি ড্রপ ডাউন রয়েছে। তার পাশের "অ্যাড" এ ক্লিক করুন, কথোপকথনে "AWS শংসাপত্রগুলি" টাইপ হিসাবে নির্বাচন করুন। অ্যাক্সেস কী / গোপন কী লিখুন।
ড্যানিলো

এখন আমি দেখি. খুব খারাপ এটি উদাহরণস্বরূপ প্রোফাইলগুলি সমর্থন করে না।
গাস

হ্যাঁ. তবে আপাতত আমি এই সমাধানটি পছন্দ করি।
ড্যানিলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.