diff options
Diffstat (limited to 'build-aux/logfile-uploader.py')
-rwxr-xr-x | build-aux/logfile-uploader.py | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/build-aux/logfile-uploader.py b/build-aux/logfile-uploader.py new file mode 100755 index 000000000..9db4142dc --- /dev/null +++ b/build-aux/logfile-uploader.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +from __future__ import print_function + +import datetime +import glob +import json +import os +import tarfile +import time + +import requests + +COUCH_URL = "http://couchdb-vm.apache.org:5984/ci_errorlogs" +TARFILE = "couchlog.tar.gz" + +def _tojson(req): + """Support requests v0.x as well as 1.x+""" + if requests.__version__[0] == '0': + return json.loads(req.content) + return req.json() + +def collect_logfiles(): + """ Find and tarball all logfiles """ + tb = tarfile.open(name=TARFILE, mode='w:gz') + # EUnit + for log in glob.glob('src/*/.eunit/couch.log'): + tb.add(log) + # JS harness + for log in glob.glob('dev/logs/node1.log'): + tb.add(log) + tb.close() + +def build_ci_doc(): + """ Build a metadata document with relevant detail from CI env """ + doc = {} + if 'TRAVIS' in os.environ: + doc['builder'] = 'travis' + doc['build_id'] = os.environ['TRAVIS_JOB_ID'] + doc['erlang'] = os.environ['TRAVIS_OTP_RELEASE'] + doc['url'] = 'https://travis-ci.org/apache/couchdb/jobs/' + \ + os.environ['TRAVIS_JOB_ID'] + doc['branch'] = os.environ['TRAVIS_BRANCH'] + doc['commit'] = os.environ['TRAVIS_COMMIT'] + doc['repo'] = 'https://github.com/' + os.environ['TRAVIS_REPO_SLUG'] + elif 'JENKINS_URL' in os.environ: + doc['builder'] = 'jenkins' + doc['build_id'] = os.environ['BUILD_NUMBER'] + doc['url'] = os.environ['BUILD_URL'] + doc['branch'] = os.environ['GIT_BRANCH'] + doc['commit'] = os.environ['GIT_COMMIT'] + doc['repo'] = os.environ['GIT_URL'] + else: + doc['builder'] = 'manual' + # TODO: shell out to get correct repo, commit, branch info? + doc['repo'] = 'https://github.com/apache/couchdb' + doc['build_id'] = str(time.time()) + + # shorten doc id + repo = doc['repo'].split('/')[-1] + repo = repo.replace('.git', '') + + doc['_id'] = doc['builder'] + '-' + repo + '-' + \ + doc['build_id'] + \ + '-' + datetime.datetime.utcnow().isoformat() + + return doc + +def upload_logs(): + lp = os.environ['COUCHAUTH'].split(':') + creds = (lp[0], lp[1]) + doc = build_ci_doc() + req = requests.post(COUCH_URL, + data=json.dumps(doc), + auth=creds, + headers={'Content-type': 'application/json'}) + req.raise_for_status() + req = _tojson(req) + with open(TARFILE, 'rb') as f: + # ancient versions of requests break if data is iterable + fdata = f.read() + req2 = requests.put(COUCH_URL + '/' + doc['_id'] + '/' + TARFILE, + headers={'Content-type': 'application/x-gtar'}, + auth=creds, + params={'rev': req['rev']}, + data=fdata) + req2.raise_for_status() + return req2 + + +def main(): + """ Find latest logfile and upload to Couch logfile db. """ + print ("Uploading logfiles...") + collect_logfiles() + req = upload_logs() + print (req.url) + print (req.content) + print ("Upload complete!") + +if __name__ == '__main__': + main() |