From 46b4a19bd30d0abc8ef9fdc35a1c342a216985e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 2 Nov 2013 17:39:42 +0100 Subject: [PATCH] Added CI script to repo --- tools/ci.py | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 tools/ci.py diff --git a/tools/ci.py b/tools/ci.py new file mode 100644 index 000000000..0c6ce43bc --- /dev/null +++ b/tools/ci.py @@ -0,0 +1,170 @@ +#!/usr/bin/python + +# continuous integration +# build daily reports (doxygen,coverage,etc) + +import datetime +import time +import subprocess +import pexpect +import glob +import os +import sys +import urllib + + +def wget(url): + try: + fp = urllib.urlopen(url) + data = fp.read() + return data + except IOError: + pass + return '' + + +# Upload file to sourceforge web server using scp +def upload(file_to_upload, destination): + try: + password = sys.argv[1] + child = pexpect.spawn( + 'scp ' + file_to_upload + ' danielmarjamaki,cppcheck@web.sourceforge.net:' + destination) + child.expect( + 'danielmarjamaki,cppcheck@web.sourceforge.net\'s password:') + child.sendline(password) + child.interact() + except IOError: + pass + except OSError: + pass + except pexpect.TIMEOUT: + pass + + +# Perform a 'make test' on the repo +def maketest(preclean): + if preclean == True: + subprocess.call(['make', 'clean']) + + p = subprocess.Popen( + ['nice', 'make', 'test'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + comm = p.communicate() + + f = open('maketest.txt', 'wt') + f.write('Errors\n======\n') + f.write(comm[1] + '\n') + f.write('Output\n======\n') + f.write(comm[0] + '\n') + f.close() + + upload('maketest.txt', 'htdocs/devinfo/') + + +# git push +def gitpush(): + try: + password = sys.argv[1] + child = pexpect.spawn('git push') + child.expect("Enter passphrase for key '/home/daniel/.ssh/id_rsa':") + child.sendline(password) + child.interact() + except IOError: + pass + except OSError: + pass + except pexpect.TIMEOUT: + pass + + +def iconv(filename): + p = subprocess.Popen(['file', '-i', filename], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + comm = p.communicate() + if comm[0].find('charset=iso-8859-1') >= 0: + subprocess.call( + ["iconv", filename, "--from=ISO-8859-1", "--to=UTF-8", "-o", filename]) + + +# Generate daily webreport +def generate_webreport(): + filenames = glob.glob('*/*.cpp') + for filename in filenames: + iconv(filename) + subprocess.call( + ["git", "commit", "-a", "-m", '"automatic conversion from iso-8859-1 formatting to utf-8"']) + gitpush() + + subprocess.call(["rm", "-rf", "devinfo"]) + subprocess.call(['nice', "./webreport.sh"]) + upload('-r devinfo', 'htdocs/') + subprocess.call(["make", "clean"]) + subprocess.call(["rm", "-rf", "devinfo"]) + + +# Perform a git pull. +def gitpull(): + try: + password = sys.argv[1] + child = pexpect.spawn('git pull') + child.expect("Enter passphrase for key '/home/daniel/.ssh/id_rsa':") + child.sendline(password) + child.expect('Already up-to-date.') + child.interact() + + except IOError: + pass + except OSError: + pass + except pexpect.TIMEOUT: + pass + except pexpect.EOF: + return True + + return False + + +def daca2(foldernum): + folders = '0123456789abcdefghijklmnopqrstuvwxyz' + folder = folders[foldernum % len(folders)] + + print('Daca2 folder=' + folder) + + p = subprocess.Popen(['git', 'show', '--format=%h'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + comm = p.communicate() + rev = comm[0] + rev = rev[:rev.find('\n')] + + subprocess.call( + ['nice', 'make', 'SRCDIR=build', 'CXXFLAGS="-O2 -DMAXTIME=600"']) + subprocess.call( + ['mv', 'cppcheck', os.path.expanduser('~/daca2/cppcheck-O2')]) + + subprocess.call(['python', 'tools/daca2.py', folder, '--rev=' + rev]) + subprocess.call( + ['python', 'tools/daca2.py', 'lib' + folder, '--rev=' + rev]) + + print('Generate DACA2 report') + subprocess.call(['rm', '-rf', 'daca2-report']) + subprocess.call(['mkdir', 'daca2-report']) + subprocess.call(['python', 'tools/daca2-report.py', 'daca2-report']) + upload('-r daca2-report', 'htdocs/devinfo/') + +t0 = datetime.date.today() +foldernum = 0 +while True: + if datetime.date.today() != t0: + print("generate daily reports") + t0 = datetime.date.today() + generate_webreport() + + if gitpull() == True: + print("make test") + # maketest(False) # Integral make test build + + cmd = wget('http://cppcheck.sourceforge.net/cgi-bin/ci.cgi?clear') + if cmd.find("doxygen") >= 0: + generate_webreport() + + daca2(foldernum) + foldernum = foldernum + 1