Python için "Oldukça" Sürekli Entegrasyon


116

Bu biraz .. boş bir soru, ancak BuildBot'un çıktısına bakmak pek hoş değil ..

Örneğin, ile karşılaştırıldığında ..

..ve diğerleri, BuildBot daha çok .. arkaik görünüyor

Şu anda Hudson ile oynuyorum, ancak bu çok Java merkezli ( bu kılavuzla , BuildBot'a göre kurulumu daha kolay buldum ve daha fazla bilgi ürettim)

Temel olarak: python'u hedefleyen, çok sayıda parlak grafik ve benzerleri üreten Sürekli Entegrasyon sistemleri var mı?


Güncelleme: Bu zamandan beri Jenkins projesi, paketin topluluk sürümü olarak Hudson'ın yerini aldı. Orijinal yazarlar da bu projeye taşındı. Jenkins artık Ubuntu / Debian, RedHat / Fedora / CentOS ve diğerlerinde standart bir pakettir. Aşağıdaki güncelleme hala esasen doğrudur. Bunu Jenkins ile yapmanın başlangıç ​​noktası farklıdır.

Güncelleme: Birkaç alternatif denedikten sonra Hudson'a sadık kalacağımı düşünüyorum. Dürüstlük güzel ve basitti, ancak oldukça sınırlıydı. Bence Buildbot , benim kullandığım gibi tek bir makinede çalışan her şeyden çok, çok sayıda yapı kölesine sahip olmak için daha uygun.

Hudson'ı bir Python projesi için ayarlamak oldukça basitti:

  • Hudson'ı http://hudson-ci.org/ adresinden indirin
  • İle çalıştırın java -jar hudson.war
  • Varsayılan adresinde web arayüzünü açın. http://localhost:8080
  • Manage Hudson, Plugins'e gidin, "Update" veya benzeri bir yere tıklayın
  • Git eklentisini kurun ( gitHudson genel tercihlerinde yolu belirlemem gerekiyordu )
  • Yeni bir proje oluşturun, depoya girin, SCM yoklama aralıkları vb.
  • Zaten değilse nosetestsüzerinden yükleeasy_install
  • Bir derleme adımında şunu ekleyin: nosetests --with-xunit --verbose
  • "JUnit test sonucu raporunu yayınla" yı kontrol edin ve "Test raporu XML'leri" ni şu şekilde ayarlayın: **/nosetests.xml

Tüm gereken bu. E-posta bildirimleri kurabilirsiniz ve eklentiler görülmeye değer. Şu anda Python projeleri için kullandığım birkaç örnek:

  • Kod satırlarını saymak (ve grafiğini çizmek !) İçin SLOCCount eklentisi - sloccount'u ayrı olarak yüklemeniz gerekir
  • PyLint çıktısını ayrıştırmak için ihlaller (uyarı eşikleri ayarlayabilir, her derlemedeki ihlal sayısını grafiğe dökebilirsiniz)
  • Cobertura , kapsam.py çıktısını ayrıştırabilir. Nosetest, testlerinizi çalıştırırken kapsam toplayabilir nosetests --with-coverage(bu, çıktıyı şuraya yazar **/coverage.xml)

Güzel soru, şu anda benzer şeylere bakıyorum. Bir rotaya giderseniz, deneyiminizi geri kalanımızla paylaşabilir misiniz?
André

3
Bunu yazdığınızda kullanılabilir olup olmadığını bilmiyorum: Eşyalarınız üzerindeki kontrolü daha da artırmak için Hudson için Chuck Norris eklentisini kullanın!
Johannes Charra

8
2011/2012 Güncellemesi : Hudson'ı düşünenler Hudson projesinin açık kaynak devamı olan Jenkins'i kullanıyor olmalı (Hudson artık Oracle tarafından kontrol ediliyor )
mindthief

Yanıtlar:


41

Burun ve Xunit çıktı eklentisine göz atmak isteyebilirsiniz . Bu komutla birim testlerinizi ve kapsam kontrollerinizi çalıştırmasını sağlayabilirsiniz:

nosetests --with-xunit --enable-cover

Jenkins yoluna gitmek istiyorsanız veya JUnit test raporlaması için desteği olan başka bir CI sunucusu kullanmak istiyorsanız bu yardımcı olacaktır.

Benzer şekilde , Jenkins için ihlal eklentisini kullanarak pilin çıktısını yakalayabilirsiniz.


4
Burun artık varsayılan olarak xunit eklentisini içeriyor -nosetests --with-xunit
dbr

3
Öyleyse, denetleme Pylint'ten nasıl yapılır? Ben ne zaman nosetests --with-xunit --enable-auditalıyorumnosetests: error: no such option: --enable-audit
Adam Parkin

2
Modernize cevap, NoseXUnit şeyler şimdi yerleşik ve talihsiz-downcased zaman yeniden adlandırıldı --with-nosexunitiçin --with-xunit.
dbr

10

İşe yarayıp yaramayacağını bilmiyorum: Bitten , Trac'i yazan kişiler tarafından yapılmıştır ve Trac ile entegre edilmiştir. Apache Gump , Apache tarafından kullanılan CI aracıdır. Python ile yazılmıştır.


9

CI sunucumuz olarak TeamCity ve test koşucumuz olarak burnu kullanarak büyük başarı elde ettik . Nosetests için Teamcity eklentisi size başarılı / başarısız sayma, başarısız test için okunabilir ekran (E-posta ile gönderilebilir) sağlar. Yığın çalışırken test başarısızlıklarının ayrıntılarını bile görebilirsiniz.

Elbette birden fazla makinede çalıştırma gibi şeyleri destekliyorsa ve kurulumu ve bakımı buildbot'tan çok daha kolaydır.



6

Atlassian's Bamboo da kesinlikle incelemeye değer. Atlassian süitinin tamamı (JIRA, Confluence, FishEye, vb.) Oldukça tatlı.


6

Sanırım bu iş parçacığı oldukça eski ama işte Hudson ile ilgili görüşüm:

Pip ile gitmeye karar verdim ve hudson'un başarılı bir testle otomatik olarak yüklediği bir repo (çalışmak için acı verici ama güzel görünümlü yumurta sepeti) kurmaya karar verdim. İşte bir hudson yapılandırma yürütme betiği ile kullanım için kaba ve hazır betiğim: /var/lib/hudson/venv/main/bin/hudson_script.py -w $ WORKSPACE -p my.package -v $ BUILD_NUMBER, sadece koyun ** / cover.xml, pylint.txt ve nosetests.xml yapılandırma bitlerinde:

#!/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()

Bir şeyleri dağıtmaya gelince, aşağıdaki gibi bir şey yapabilirsiniz:

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

Ve sonra insanlar şunları kullanarak bir şeyler geliştirebilirler:

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

Bu şeyler, bir setup.py ile paket başına bir repo yapınız olduğunu ve tüm bağımlılıkların ayarlandığını varsayar, sonra sadece bagajı kontrol edebilir ve bu şeyleri üzerinde çalıştırabilirsiniz.

Umarım bu birisine yardımcı olur.

------Güncelleme---------

Hudson ile gerçekten uyumlu olan epydoc ekledim. Sadece html klasörü ile yapılandırmanıza javadoc ekleyin

Pip'in bu günlerde -E bayrağını düzgün desteklemediğini unutmayın, bu nedenle venv'inizi ayrı olarak oluşturmanız gerekir.


Bu cevap çok kullanışlıdır ve Python CI'nin iç kısımları ile ilgili olarak çok fazla ayrıntı içerir, Jenkins'ten ücretsiz olarak alamayacağınız bir şey veya her neyse. Teşekkürler!
maksimov



2

Sinyal başka bir seçenektir. Bununla ilgili daha fazla bilgi edinebilir ve burada da bir video izleyebilirsiniz .



1

Continuum en binstar tetik github gelen oluşturur ve linux, osx ve pencereler (32/64) için derlemek için artık yapabiliyor. İşin güzel yanı, dağıtımı ve sürekli entegrasyonu yakından birleştirmenize gerçekten izin vermesidir. Bu, t'leri geçmek ve Entegrasyon I'lerini işaret etmek. Site, iş akışı ve araçlar gerçekten cilalı ve AFAIK conda, C / C ++ / Fotran kitaplıklarını sarmalamanız ve dağıtmanız gereken karmaşık python modüllerini dağıtmanın en sağlam ve pitonik yoludur .


0

Biz biraz ısırdık. Güzel ve Trac ile iyi bütünleşiyor, ancak standart olmayan herhangi bir iş akışınız varsa özelleştirmek çok zor. Ayrıca, daha popüler araçlar için olduğu kadar çok eklenti yoktur. Şu anda Hudson'ı bir yedek olarak değerlendiriyoruz.


0

Rultor.com'u kontrol edin . Gibi bu makalede açıklar her yapı için Docker kullanır. Bu sayede Python da dahil olmak üzere Docker görüntünüzün içinde istediğiniz her şeyi yapılandırabilirsiniz.


0

Küçük feragatname, aslında herhangi bir kodu bir git itme üzerinde otomatik olarak test edip dağıtmanın ve git notları aracılığıyla sorun biletlerini yönetmenin bir yolunu arayan bir istemci için böyle bir çözüm geliştirmem gerekti. Bu aynı zamanda AIMS projesi üzerindeki çalışmamı da beraberinde getiriyor .

Bir kolayca, sadece setup bir yapı kullanıcı vardır ve yoluyla yapı yönetmek çıplak düğüm sistemlere bulaşabilir make(1), expect(1), crontab(1)/ systemd.unit(5)ve incrontab(1). Hatta bir adım daha ileri gidebilir ve gridfs / nfs dosya deposu ile dağıtılmış yapılar için yanıtlayıcı ve kereviz kullanılabilir.

Yine de, bir Graybeard UNIX çalışanı veya İlke düzeyinde mühendis / mimar dışında kimsenin bu kadar ileri gitmesini beklemem. Bir yapı sunucusu, komut dosyası oluşturulmuş görevleri otomatikleştirilmiş bir şekilde keyfi olarak yürütmenin bir yolundan başka bir şey olmadığı için, güzel bir fikir ve potansiyel öğrenme deneyimi sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.