পাইথনের জন্য "সুন্দর" অবিচ্ছিন্ন একীকরণ


116

এটি সামান্য .. নিরর্থক প্রশ্ন, তবে বিল্ডবটের আউটপুটটি বিশেষভাবে দেখতে খুব সুন্দর নয় ..

উদাহরণস্বরূপ, তুলনা ..

.. এবং অন্যদের, বিল্ডবট বরং .. প্রত্নতাত্ত্বিক দেখায়

আমি বর্তমানে হাডসনের সাথে খেলছি, তবে এটি খুব জাভা কেন্দ্রিক (যদিও এই গাইডের সাহায্যে বিল্ডবোটের চেয়ে সেটআপ করা আমার কাছে সহজ মনে হয়েছিল এবং আরও তথ্য উত্পাদিত হয়েছে)

মূলত: অজগরকে লক্ষ্য করে এমন কোন ধারাবাহিক সংহতকরণ ব্যবস্থা আছে যা প্রচুর চকচকে গ্রাফ এবং পছন্দগুলি তৈরি করে?


আপডেট: এখন থেকে জেনকিনস প্রকল্পটি প্যাকেজের সম্প্রদায়ীয় সংস্করণ হিসাবে হাডসনকে প্রতিস্থাপন করেছে। মূল লেখকরাও এই প্রকল্পে চলে এসেছেন। জেনকিন্স এখন উবুন্টু / ডেবিয়ান, রেডহ্যাট / ফেডোরা / সেন্টোস এবং অন্যদের জন্য একটি মানক প্যাকেজ। নিম্নলিখিত আপডেটটি এখনও মূলত সঠিক। জেনকিন্সের সাথে এটি করার প্রথম দিকটি আলাদা।

আপডেট: কয়েকটি বিকল্প চেষ্টা করার পরে, আমি মনে করি আমি হডসনের সাথে থাকব। নিখরচায়তা ছিল দুর্দান্ত এবং সাধারণ, তবে বেশ সীমাবদ্ধ। আমি মনে করি বিল্ডবট অনেকগুলি বিল্ড-স্লেভ থাকার পক্ষে আরও উপযুক্ত, আমি যেমন কোনও একক মেশিনে ব্যবহার করেছিলাম তার চেয়ে বেশি it

পাইথন প্রকল্পের জন্য হডসন সেট আপ করা বেশ সহজ ছিল:

  • Http://hudson-ci.org/ থেকে হাডসন ডাউনলোড করুন
  • এটি দিয়ে চালান java -jar hudson.war
  • এর ডিফল্ট ঠিকানায় ওয়েব ইন্টারফেসটি খুলুন http://localhost:8080
  • হাডসন, প্লাগইনগুলি পরিচালনা করতে যান, "আপডেট" বা অনুরূপ ক্লিক করুন
  • গিট প্লাগইন ইনস্টল করুন (আমাকে gitহডসনের বৈশ্বিক পছন্দসমূহে পথ নির্ধারণ করতে হয়েছিল)
  • একটি নতুন প্রকল্প তৈরি করুন, সংগ্রহস্থল, এসসিএম পোলিং অন্তর এবং অন্যান্য প্রবেশ করুন
  • এটি ইতিমধ্যে না থাকলে এর nosetestsমাধ্যমে ইনস্টল করুনeasy_install
  • বিল্ড স্টেপে অ্যাড করুন nosetests --with-xunit --verbose
  • "JUnit পরীক্ষার ফলাফলের প্রতিবেদন প্রকাশ করুন" পরীক্ষা করুন এবং "টেস্ট রিপোর্ট এক্সএমএলস" তে সেট করুন **/nosetests.xml

এটাই দরকার। আপনি ইমেল বিজ্ঞপ্তিগুলি সেটআপ করতে পারেন এবং প্লাগইনগুলি এক নজর দেওয়ার মতো। আমি বর্তমানে পাইথন প্রকল্পগুলির জন্য কয়েকটি ব্যবহার করছি:

  • কোডের লাইনগুলি গণনা করতে (এবং এটিকে গ্রাফ করুন!) এসএলসকাউন্ট প্লাগইন - আপনাকে আলাদাভাবে স্লোকাউন্ট ইনস্টল করতে হবে
  • পাইলিন্ট আউটপুট পার্স করার লঙ্ঘন (আপনি সতর্কতা থ্রেশহোল্ডগুলি সেটআপ করতে পারেন, প্রতিটি বিল্ডের উপর লঙ্ঘনের সংখ্যা গ্রাফ করতে পারেন)
  • কোবার্টুরা কভারেজ.পি আউটপুটকে বিশ্লেষণ করতে পারে। নোটেস্ট আপনার পরীক্ষাগুলি চালনার সময় কভারেজ সংগ্রহ করতে পারে nosetests --with-coverage(এটি আউটপুট লেখায় **/coverage.xml)

দুর্দান্ত প্রশ্ন, আমি ঠিক এখনই অনুরূপ জিনিসগুলি অনুসন্ধান করছি। আপনি যদি একটি রুটে যান তবে আপনি কি আমাদের বাকিদের সাথে নিজের অভিজ্ঞতা ভাগ করে নিতে পারেন?
আন্দ্রে

3
আপনি যখন এটি লিখেছিলেন তখন এটি আয়েলাব ছিল কিনা তা জানেন না: আপনার স্টাফের উপর নিয়ন্ত্রণ আরও বাড়ানোর জন্য হাডসনের জন্য চক নরিস প্লাগইনটি ব্যবহার করুন!
জোহানেস চারারা

8
২০১১/২০১২ এর আপডেট : হডসন বিবেচনা করা লোকদের জেনকিন্স ব্যবহার করা উচিত , হডসন প্রকল্পের ওপেন সোর্স ধারাবাহিকতা (হডসন এখন ওরাকল দ্বারা নিয়ন্ত্রিত )
মানসিকতা

উত্তর:


41

আপনি নাক এবং Xunit আউটপুট প্লাগইন পরীক্ষা করতে চাইতে পারেন । আপনি আপনার ইউনিট পরীক্ষা চালাতে এবং এই কমান্ডটি দিয়ে কভারেজ চেকগুলি চালাতে পারেন:

nosetests --with-xunit --enable-cover

আপনি জেনকিনস রুটে যেতে চাইলে বা আপনি যদি অন্য কোনও সিআই সার্ভার ব্যবহার করতে চান যা JUnit পরীক্ষার প্রতিবেদনের জন্য সমর্থন করে তবে এটি সহায়ক হবে।

একইভাবে আপনি জেনকিনসের জন্য লঙ্ঘন প্লাগইন ব্যবহার করে পাইল্টের আউটপুট ক্যাপচার করতে পারেন


4
নাক এখন ডিফল্টভাবে xunit প্লাগইন অন্তর্ভুক্ত -nosetests --with-xunit
dbr

3
তাহলে কীভাবে পাইলট থেকে একজন অডিট চালাবেন? যখন আমি কি nosetests --with-xunit --enable-auditআমি পেতেnosetests: error: no such option: --enable-audit
আদম পারকি

2
আধুনিকীকরণ করা উত্তর, নোক্সএক্সইনিট স্টাফ এখন অন্তর্নির্মিত এবং দুর্ভাগ্যজনক-যখন-নামিয়ে দেওয়া --with-nosexunitহয়েছে নাম থেকে নামকরণ করা হয়েছে --with-xunit
ডিবিআর


9

আমাদের সিআই সার্ভার হিসাবে এবং টেস্ট রানার হিসাবে নাক ব্যবহার করে আমরা টিমসিটির সাথে দুর্দান্ত সাফল্য পেয়েছিনস্টিস্টের জন্য টিমসিটি প্লাগইন আপনাকে ব্যর্থ পরীক্ষার জন্য পাস / ব্যর্থ, পঠনযোগ্য প্রদর্শন গণনা দেয় (এটি ই-মেল করা যেতে পারে)। এমনকি আপনি স্ট্যাক চলাকালীন পরীক্ষার ব্যর্থতার বিবরণ দেখতেও পারেন।

অবশ্যই যদি একাধিক মেশিনে চলার মতো জিনিসগুলিকে সমর্থন করে এবং বিল্ডবোটের চেয়ে সেটআপ এবং বজায় রাখা আরও সহজ simp



6

আটলাশিয়ান বাঁশ অবশ্যই চেক আউট মূল্যবান। পুরো আটলাসিয়ান স্যুট (JIRA, সংগম, ফিশই, ইত্যাদি) বেশ মিষ্টি,


6

আমি অনুমান করি যে এই থ্রেডটি বেশ পুরানো তবে এখানে হডসনের সাথে এটি গ্রহণ করা আমার পক্ষে রয়েছে:

আমি পিপ নিয়ে গিয়ে একটি রেপো স্থাপন করার সিদ্ধান্ত নিয়েছি (কাজ করার জন্য বেদনাদায়ক তবে সুন্দর দেখতে ডিমের মুখোমুখি), যা হডসন অটো একটি সফল পরীক্ষার মাধ্যমে আপলোড করে। এখানে হডসন কনফিগার এক্সিকিউট করা স্ক্রিপ্ট ব্যবহারের জন্য আমার রুক্ষ এবং প্রস্তুত স্ক্রিপ্টটি রয়েছে: /var/lib/hudson/venv/main/bin/hudson_script.py -w OR WORKSPACE -p my.package -v U BUILD_NUMBER কনফিগার বিটগুলিতে ** / কভারেজ.এক্সএমএল, পাইলিন্ট.টেক্সট এবং নোস্টেটস.এক্সএমএল:

#!/var/lib/hudson/venv/main/bin/python
import os
import re
import subprocess
import logging
import optparse

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s')

#venvDir = "/var/lib/hudson/venv/main/bin/"

UPLOAD_REPO = "http://ldndev01:3442"

def call_command(command, cwd, ignore_error_code=False):
    try:
        logging.info("Running: %s" % command)
        status = subprocess.call(command, cwd=cwd, shell=True)
        if not ignore_error_code and status != 0:
            raise Exception("Last command failed")

        return status

    except:
        logging.exception("Could not run command %s" % command)
        raise

def main():
    usage = "usage: %prog [options]"
    parser = optparse.OptionParser(usage)
    parser.add_option("-w", "--workspace", dest="workspace",
                      help="workspace folder for the job")
    parser.add_option("-p", "--package", dest="package",
                      help="the package name i.e., back_office.reconciler")
    parser.add_option("-v", "--build_number", dest="build_number",
                      help="the build number, which will get put at the end of the package version")
    options, args = parser.parse_args()

    if not options.workspace or not options.package:
        raise Exception("Need both args, do --help for info")

    venvDir = options.package + "_venv/"

    #find out if venv is there
    if not os.path.exists(venvDir):
        #make it
        call_command("virtualenv %s --no-site-packages" % venvDir,
                     options.workspace)

    #install the venv/make sure its there plus install the local package
    call_command("%sbin/pip install -e ./ --extra-index %s" % (venvDir, UPLOAD_REPO),
                 options.workspace)

    #make sure pylint, nose and coverage are installed
    call_command("%sbin/pip install nose pylint coverage epydoc" % venvDir,
                 options.workspace)

    #make sure we have an __init__.py
    #this shouldn't be needed if the packages are set up correctly
    #modules = options.package.split(".")
    #if len(modules) > 1: 
    #    call_command("touch '%s/__init__.py'" % modules[0], 
    #                 options.workspace)
    #do the nosetests
    test_status = call_command("%sbin/nosetests %s --with-xunit --with-coverage --cover-package %s --cover-erase" % (venvDir,
                                                                                     options.package.replace(".", "/"),
                                                                                     options.package),
                 options.workspace, True)
    #produce coverage report -i for ignore weird missing file errors
    call_command("%sbin/coverage xml -i" % venvDir,
                 options.workspace)
    #move it so that the code coverage plugin can find it
    call_command("mv coverage.xml %s" % (options.package.replace(".", "/")),
                 options.workspace)
    #run pylint
    call_command("%sbin/pylint --rcfile ~/pylint.rc -f parseable %s > pylint.txt" % (venvDir, 
                                                                                     options.package),
                 options.workspace, True)

    #remove old dists so we only have the newest at the end
    call_command("rm -rfv %s" % (options.workspace + "/dist"),
                 options.workspace)

    #if the build passes upload the result to the egg_basket
    if test_status == 0:
        logging.info("Success - uploading egg")
        upload_bit = "upload -r %s/upload" % UPLOAD_REPO
    else:
        logging.info("Failure - not uploading egg")
        upload_bit = ""

    #create egg
    call_command("%sbin/python setup.py egg_info --tag-build=.0.%s --tag-svn-revision --tag-date sdist %s" % (venvDir,
                                                                                                              options.build_number,
                                                                                                              upload_bit),
                 options.workspace)

    call_command("%sbin/epydoc --html --graph all %s" % (venvDir, options.package),
                 options.workspace)

    logging.info("Complete")

if __name__ == "__main__":
    main()

জিনিস মোতায়েনের বিষয়টি যখন আপনি আসে তেমন কিছু করতে পারেন:

pip -E /location/of/my/venv/ install my_package==X.Y.Z --extra-index http://my_repo

এবং তারপরে লোকেরা এগুলি ব্যবহার করে সামগ্রী বিকাশ করতে পারে:

pip -E /location/of/my/venv/ install -e ./ --extra-index http://my_repo

এই স্টাফটি ধরে নিয়েছে যে আপনার প্যাকেজ প্রতি একটি সেটআপ.পি এবং নির্ভরতা সমস্ত সেট আপ করে রেপো কাঠামো রয়েছে তবে আপনি কেবল ট্রাঙ্কটি পরীক্ষা করে দেখতে এবং এটিতে এই জিনিস চালাতে পারেন।

আমি আশা করি এটি কাউকে সাহায্য করবে।

------হালনাগাদ---------

আমি ইপিডোক যুক্ত করেছি যা হডসনের সাথে খুব সুন্দরভাবে ফিট করে। এইচটিএমএল ফোল্ডারটি দিয়ে আপনার কনফিগারেশনে জাভাদোক যুক্ত করুন

নোট করুন যে পাইপ এই দিনগুলিতে ই-ফ্ল্যাগ সঠিকভাবে সমর্থন করে না, তাই আপনাকে আলাদাভাবে আপনার ভেনভ তৈরি করতে হবে


এই উত্তরটি খুব দরকারী এবং পাইথন সিআইয়ের ইন্টার্নালদের সাথে সম্পর্কিত প্রচুর বিবরণ রয়েছে, যা জেনকিনস বা যা কিছু আপনি বিনামূল্যে পাবেন না free ধন্যবাদ!
মাকসিমভ


3

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




1

কন্টিনামের বিনস্টার এখন গিথুব থেকে বিল্ডগুলি ট্রিগার করতে সক্ষম এবং লিনাক্স, অক্স এবং উইন্ডোজ ( 32/64) জন্য সংকলন করতে পারে। ঝরঝরে বিষয় হ'ল এটি সত্যই আপনাকে ঘনিষ্ঠভাবে বিতরণ এবং একটানা একীকরণের অনুমতি দেয়। এটি টি এর ক্রসিং এবং আইটি ইন্টিগ্রেশনের বিন্দু। সাইট, ওয়ার্কফ্লো এবং সরঞ্জামগুলি সত্যই পালিশ করা হয়েছে এবং আফাইক কনডা জটিল পাইথন মডিউল বিতরণের সবচেয়ে মজবুত এবং পাইথোনিক উপায়, যেখানে আপনাকে সি / সি ++ / ফোটরান লাইব্রেরিগুলি মোড়ানো এবং বিতরণ করতে হবে ।


0

আমরা বেশ কিছুটা কামড় ব্যবহার করেছি। এটি সুন্দর এবং ট্র্যাকের সাথে ভালভাবে সংহত করেছে তবে আপনার যদি কোনও অমানুষিক ওয়ার্কফ্লো থাকে তবে এটি কাস্টমাইজ করা বাটের ব্যথা। এছাড়াও আরও জনপ্রিয় সরঞ্জামগুলির জন্য কেবল এতগুলি প্লাগইন নেই। বর্তমানে আমরা প্রতিস্থাপন হিসাবে হাডসনকে মূল্যায়ন করছি।


0

Rultor.com চেক করুন । যেমন এই নিবন্ধটি ব্যাখ্যা করেছে, এটি প্রতিটি বিল্ডের জন্য ডকার ব্যবহার করে। তার জন্য ধন্যবাদ, আপনি পাইথন সহ আপনার ডকার চিত্রের মধ্যে যা পছন্দ করেন তা কনফিগার করতে পারেন।


0

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

এক সহজে মাত্র সেটআপ পারে খালি নোড সিস্টেম একটি বিল্ড ব্যবহারকারী এবং মাধ্যমে তাদের বিল্ড পরিচালনা করছেন না make(1), expect(1), crontab(1)/ systemd.unit(5), এবং incrontab(1)। এমনকি একজন আরও এক ধাপ এগিয়ে যেতে পারে এবং গ্রিডস / এনএফএস ফাইল স্টোরের সাথে বিতরণ করা বিল্ডগুলির জন্য উত্তরযোগ্য এবং সেলারি ব্যবহার করতে পারে।

যদিও, আমি গ্রে গ্রেয়ার্ড ইউনিক্স লোক বা প্রিন্সিপাল লেভেল ইঞ্জিনিয়ার / স্থপতি ছাড়া অন্য কারও কাছে বাস্তবে এই পথে এগিয়ে যাওয়ার আশা করবো না। কেবল একটি দুর্দান্ত ধারণা এবং সম্ভাব্য শিক্ষার অভিজ্ঞতা অর্জন করে যেহেতু বিল্ড সার্ভারটি একটি স্বয়ংক্রিয় ফ্যাশনে স্ক্রিপ্টযুক্ত কাজগুলি নির্বিচারে কার্যকর করার উপায় ছাড়া আর কিছুই নয়।

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