"Pretty"지속적인 통합을 위한 Python
-
03-07-2019 - |
문제
이것은 약간의..헛된 질문이지만,BuildBot 의 출력이 없어서..
예를 들어,에 비해..
고,다른 사람 BuildBot 보이는 오히려..고풍
나는 현재 재생 중인 허드슨이지만,그것은 매우 Java 중심(만 이 가이드, 에,나는 그것을 발견하게 설치보다 BuildBot,생산과 더 많은 정보)
기본적으로:은 거기에 모든 지속적인 통합 시스템을 목표로 python,는 많이 생산하는 빛나는 그래프와 좋아?
업데이트: 이 시간 이후 Jenkins 프로젝트로 대체했 허드슨으로 커뮤니티 버전의 패키지입니다.원래 저자가 이 프로젝트뿐만 아니라.Jenkins 가 표준 패키지에서 Ubuntu/Debian,RedHat/페도라/CentOS,및 다른 사람입니다.다음 업데이트가 기본적으로 정확하다.시작점을 이렇게 Jenkins 은 다릅니다.
업데이트: 해 몇 가지 대안을 생각 나는 허드슨. 무결성 고 간단하지만,매우 제한됩니다.나는 생각한 Buildbot 에 더욱 적합합하는 수많은 빌드-노예가 아닌 모든 실행하는 단일 머신에서 다음과 같 내가 사용하고 있었습니다.
설정에 허드슨한 Python 프로젝트는 매우 간단하다:
- 다운로드에서 허드슨 http://hudson-ci.org/
- 실행
java -jar hudson.war
- 웹 인터페이스에서 기본 주소
http://localhost:8080
- 이동을 관리하,허드슨 플러그인 업데이트"를 클릭하십시오"또는 이와 유사한
- 설치 Git 플러그인(을 설정
git
경로에서 허드슨 글로벌 환경) - 새 프로젝트를 만들고 입력,저장소,SCM 간격으로 폴링과
- 설치
nosetests
viaeasy_install
되지 않은 경우 - 에서 빌드 단계,추가
nosetests --with-xunit --verbose
- 체크"게시 JUnit 테스트 결과를 보고"설정"테스트 보고서는 Xml"하기
**/nosetests.xml
그는 모두 필요합니다.당신은 설정할 수 있 이메일 알림 플러그인 가치가 있습니다.몇 나는 현재 사용하는 파이썬 프로젝트:
- SLOCCount 플러그인 계산 라인의 코드(그리고 아름다운 그래프를 그린다.) -당신은 필요 설치 sloccount 별도로
- 반 분석 PyLint 출력(설정할 수 있습니다 경고 임계값,그래프의 수는 위반이 서로를 통해 구축)
- Cobertura 할 수 있는 구문 분석 coverage.py 출력됩니다.Nosetest 수집할 수 있는 범위를 실행하는 동안 당신의 테스트 사용
nosetests --with-coverage
(이 출력이 작성**/coverage.xml
)
해결책
체크 아웃하고 싶을 수도 있습니다 코 그리고 Xunit 출력 플러그인. 단위 테스트를 실행 하고이 명령을 사용하여 적용 범위 확인을 수행 할 수 있습니다.
nosetests --with-xunit --enable-cover
Jenkins 경로로 가고 싶거나 Junit 테스트보고를 지원하는 다른 CI 서버를 사용하려는 경우 도움이됩니다.
마찬가지로 Jenkins의 위반 플러그인
다른 팁
우리는 큰 성공을 거두었습니다 TeamCity CI 서버 및 코를 테스트 러너로 사용합니다. NoSetests 용 TeamCity 플러그인 카운트 패스/실패, 실패 테스트에 대한 읽기 쉬운 디스플레이 (이메일을 보낼 수 있음)를 제공합니다. 스택이 실행중인 동안 테스트 실패의 세부 사항을 볼 수도 있습니다.
물론 여러 컴퓨터에서 실행하는 것과 같은 것들이 지원되며 BuildBot보다 설정 및 유지 관리가 훨씬 간단합니다.
BuildBot의 폭포 페이지는 상당히 예전 할 수 있습니다. 여기에 좋은 예가 있습니다 http://build.chromium.org/buildbot/waterfall/waterfall
아틀라 시안의 대나무 또한 체크 아웃 할 가치가 있습니다. 전체 Atlassian Suite (Jira, Confluence, Fisheye 등)는 꽤 달콤합니다.
이 실이 꽤 오래되었다고 생각하지만 여기 Hudson과 함께합니다.
나는 PIP와 함께 가서 레포를 설정하기로 결정했습니다 (고통 스럽지만 잘 보이는 Eggbasket). Hudson은 성공적인 테스트를 통해 자동 업로드합니다. 다음은 Hudson Config와 함께 사용하기위한 거칠고 준비된 스크립트입니다 : /var/lib/hudson/venv/main/bin/hudson_script.py -w $ workspace -p my.package -v $ build_number와 같은 스크립트를 실행하십시오. **/coverage.xml, pylint.txt 및 nosetests.xml 구성 비트에서 :
#!/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
이 물건은 Setup.py와 종속성이 모두 설정된 패키지 당 레포 구조를 가지고 있다고 가정하면 트렁크를 확인 하고이 내용을 실행할 수 있습니다.
나는 이것이 누군가를 도울 수 있기를 바랍니다.
------업데이트---------
Hudson과 정말 잘 맞는 epydoc을 추가했습니다. HTML 폴더로 구성에 Javadoc을 추가하십시오.
PIP는 요즘 -E 플래그를 제대로 지원하지 않으므로 Venv를 별도로 만들어야합니다.
다른 것 : 빛나는 팬더 파이썬을위한 호스팅 도구입니다
호스팅 된 CI 솔루션을 고려하고 오픈 소스를 수행하는 경우 조사해야합니다. 트래비스 CI 또한 - Github와 매우 잘 통합되어 있습니다. 루비 도구로 시작하는 동안 Python 지원이 추가되었습니다 얼마 전에.
신호는 또 다른 옵션입니다. 그것에 대해 더 많이 알고 비디오를 볼 수 있습니다. 여기.
나는 고려할 것이다 Circleci - 파이썬 지원이 뛰어나고 매우 예쁜 출력이 있습니다.
연속체 빈스타 이제 Github에서 빌드를 트리거 할 수 있으며 Linux, OSX 및 Windows (32 / 64)를 위해 컴파일 할 수 있습니다. 깔끔한 것은 실제로 배포와 지속적인 통합을 밀접하게 밀접하게 사용할 수 있다는 것입니다. 그것은 t를 건너고 I의 통합을 점령하고 있습니다. 이 사이트, 워크 플로 및 도구는 실제로 세련되며 Afaik Conda는 복잡한 파이썬 모듈을 배포하는 가장 강력하고 피스닉적인 방법입니다. 그리고 C/C ++/Fotran 라이브러리를 배포하십시오.
우리는 물린 것을 꽤 많이 사용했습니다. 그것은 예쁘고 TRAC와 잘 통합되지만, 비표준 워크 플로우가있는 경우 맞춤화하는 것은 엉덩이의 고통입니다. 또한 인기있는 도구만큼 플러그인이 많지 않습니다. 현재 우리는 허드슨을 대체품으로 평가하고 있습니다.
확인하다 rultor.com. 처럼 이 기사 설명하면, 모든 빌드에 Docker를 사용합니다. 덕분에 Python을 포함하여 Docker 이미지 내에서 원하는 것을 구성 할 수 있습니다.
작은 조,난제를 구축하는 솔루션은 다음과 같이 클라이언트를 원하는 방법을 자동으로 테스트 및 배포 모 코드 git push plus 관리 티켓 자식을 통해 노트입니다.이것은 또한 이어질 내에서 작동 는 것을 목표로 프로젝트.
하나는 쉽게 그냥 설정 베어 노드 시스템에는 사용자와 관리를 통해 구축 make(1)
, expect(1)
, crontab(1)
/systemd.unit(5)
, 고 incrontab(1)
.수도 추가 단계와 사용 ansible 와 셀러리 등 빌드와 gridfs/nfs 파일을 저장합니다.
지만,나는 것 기대하지 않는 사람 이외의 다른 Graybeard UNIX 남자 또는 원리 수준 engineer 실제로까지.그냥 좋은 아이디어 및 잠재적인 학습 경험하기 때문에 빌드 서버는 아무것도 더 이상 방법을 임의로 실행 스크립트 작업을 자동화 패션이다.