summaryrefslogtreecommitdiff
path: root/build-aux/logfile-uploader.py
diff options
context:
space:
mode:
Diffstat (limited to 'build-aux/logfile-uploader.py')
-rwxr-xr-xbuild-aux/logfile-uploader.py113
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()