2015-09-24 12 views
13

tl; डॉ:टोक्स में सशर्त कमांड? (Tox, ट्रैविस-सीआई, और coveralls)

मैं मेरा एक परियोजना, GitHub पर होस्ट, tox और travis-ci प्रयोग करने के लिए सीआई सेट कर रहा हूं। निर्माण के अंत में, मैं coveralls.io पर कवरेज रिपोर्ट को धक्का देने के लिए converalls चलाता हूं। मैं इस आदेश को 'सशर्त' बनाना चाहता हूं - केवल तभी निष्पादन के लिए जब ट्रेविस पर परीक्षण चलाए जाते हैं; जब वे मेरी स्थानीय मशीन पर नहीं चलते हैं। क्या ऐसा करने का कोई तरीका है?

विवरण:

पैकेज मैं परीक्षण करने के लिए कोशिश कर रहा हूँ एक अजगर पैकेज है। मैं उपयोग कर रहा हूँ/निम्नलिखित 'बुनियादी ढांचे' का उपयोग करने के परीक्षण की स्थापना करने की योजना बना:

  • परीक्षण खुद को py.test किस्म के हैं।
  • सीआई स्क्रिप्टिंग, बोलने के लिए, tox से है। यह मुझे स्थानीय स्तर पर परीक्षण चलाने देता है, जो मेरे लिए महत्वपूर्ण है। जब भी मुझे टेस्ट रन की आवश्यकता होती है, मैं गिटूब को धक्का नहीं देना चाहता हूं। मैं अपने पैकेज में numpy और matplotlib का भी उपयोग करता हूं, इसलिए travis-ci पर परीक्षण चक्रों की एक निष्क्रिय संख्या चलाना मेरे लिए अत्यधिक अपमानजनक लगता है। इस प्रकार, tox डुबकी और केवल .travis.yml का उपयोग कर एक विकल्प नहीं है।

    .travis.yml

    language: python 
    python: 2.7 
    env: 
        - TOX_ENV=py27 
    install: 
        - pip install tox 
    script: 
        - tox -e $TOX_ENV 
    

    tox.ini

    [tox] 
    envlist = py27 
    
    [testenv] 
    passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH 
    deps = 
        pytest 
        coverage 
        pytest-cov 
        coveralls 
    commands = 
        py.test --cov={envsitepackagesdir}/mypackage --cov-report=term --basetemp={envtmpdir} 
        coveralls 
    
    :
  • सीआई सर्वर travis-ci

प्रासंगिक परीक्षण स्क्रिप्ट कुछ इस तरह दिखाई है

यह फ़ाइल मुझे स्थानीय स्तर पर परीक्षण चलाने देती है। हालांकि, अंतिम coveralls कॉल की वजह से, परीक्षण सिद्धांत रूप में विफल रहता है, के साथ:

py27 runtests: commands[1] | coveralls 
You have to provide either repo_token in .coveralls.yml, or launch via Travis 
ERROR: InvocationError: ...coveralls' 

यह एक उम्मीद त्रुटि है। passenv बिट travis से coveralls पर लिखने में सक्षम होने के लिए आवश्यक जानकारी के साथ भेजता है, और इस जानकारी को प्रदान करने के लिए वहां ट्रैविस के बिना, आदेश विफल होना चाहिए। मैं नहीं चाहता कि यह परिणामों को coveralls.io पर धक्का दे। मैं coveralls केवल तभी चलाना चाहता हूं जब परीक्षण travis-ci पर हो रहा हो। क्या कोई तरीका है जिसमें मैं यह आदेश सशर्त रूप से चला सकता हूं, या एक निर्माण कॉन्फ़िगरेशन स्थापित कर सकता हूं जो समान प्रभाव प्राप्त करता है?

मैं पहले से ही .travis.yml में coveralls भाग चलती की कोशिश की है, लेकिन जब कि निष्पादित किया जाता है coveralls पर भेजने के लिए उचित .coverage फ़ाइल पता लगाने में असमर्थ हो रहा है। मैंने इस दिशा में विभिन्न प्रयास किए हैं, जिनमें से कोई भी ऊपर सूचीबद्ध संयोजन को छोड़कर coveralls.io पर सफल सबमिशन के परिणामस्वरूप हुआ। निम्नलिखित था जो मैंने आशा की थी कि काम करेगा, यह देखते हुए कि जब मैं tox स्थानीय रूप से चलाता हूं तो मैं .coverage फ़ाइल के साथ समाप्त होता हूं जहां मैं इसकी अपेक्षा करता हूं - मेरे स्रोत पेड़ के रूट फ़ोल्डर में।

कवरॉल्स को कोई सबमिशन नहीं।कब

language: python 
python: 2.7 
env: 
    - TOX_ENV=py27 
install: 
    - pip install tox 
    - pip install python-coveralls 
script: 
    - tox -e $TOX_ENV 
after_success: 
    - coveralls 

उत्तर

7

मैं ट्रैविस, tox और coveralls के साथ एक समान सेटअप है। मेरा विचार केवल coveralls निष्पादित करना था यदि TRAVIS पर्यावरण चर सेट किया गया है। हालांकि, ऐसा लगता है कि ऐसा करना इतना आसान नहीं है क्योंकि कोक्स को उद्धरण और एम्पर्सेंड के साथ कमांड को पार्स करने में परेशानी है। इसके अतिरिक्त, यह confused Travis me a lot

#!/bin/env/python 

import os 

from subprocess import call 


if __name__ == '__main__': 
    if 'TRAVIS' in os.environ: 
     rc = call('coveralls') 
     raise SystemExit(rc) 

tox.ini में, python {toxinidir}/run_coveralls.py के साथ अपने coveralls आदेश को बदल दें:

आखिरकार मैं एक साधारण अजगर स्क्रिप्ट run_coveralls.py लिखा था।

+0

अच्छा समाधान! लेकिन वास्तविक 'coveralls' पैकेज के साथ नाम टकराव से बचने के लिए, 'run_coveralls.py' स्क्रिप्ट का नाम देना बेहतर है। – alexanderlukanin13

+0

मुझे आश्चर्य है कि कैसे 'run_coveralls.py' को आसानी से शामिल/कॉल किया जाना चाहिए? एक त्रुटि संदेश है 'फ़ाइल' run_coveralls.py 'नहीं खोल सकता: [Errno 2] फ़ाइल के रूप में ऐसी कोई फ़ाइल या निर्देशिका' टोक्स 'वर्चुअल वातावरण में कॉपी नहीं की गई है। मुझे लगता है कि इसे पैकेज के हिस्से के रूप में शामिल नहीं किया जाना चाहिए। –

+0

मुझे लगता है कि मैं खुद को एक समाधान खोजने में कामयाब रहा। 'python {toxinidir}/run_coveralls.py' काम करने लगता है। –

7

एक वैकल्पिक समाधान एक पानी का छींटा (-) के रूप में समझाया in the documentation अपने से बाहर निकलें कोड की अनदेखी करने के tox बताने के लिए साथ coveralls आदेश उपसर्ग होगा। इस तरह coveralls से भी विफलताओं को अनदेखा कर दिया जाएगा और tox परीक्षण निष्पादन को स्थानीय रूप से निष्पादित होने पर सफल माना जाएगा।

ऊपर के उदाहरण विन्यास का उपयोग करना, यह इस प्रकार होगा:

[tox] 
envlist = py27 

[testenv] 
passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH 
deps = 
    pytest 
    coverage 
    pytest-cov 
    coveralls 
commands = 
    py.test --cov={envsitepackagesdir}/mypackage --cov-report=term --basetemp={envtmpdir} 
    - coveralls 
0

मैं अतिरिक्त आदेशों को चलाने के लिए एक पर्यावरण चर का उपयोग कर रहा हूँ।

tox.ini

commands = 
    coverage run runtests.py 
    {env:POST_COMMAND:python --version} 

language: python 
python: 
    - "3.6" 
install: pip install tox-travis 
script: tox 
env: 
    - POST_COMMAND=codecov -e TOX_ENV 

.travis.yml अब अपने स्थानीय सेटअप में, यह अजगर संस्करण मुद्रित करें। ट्रैविस से चलने पर यह कोडेकोव चलाता है।

संबंधित मुद्दे