From bfc1fef630b905c3642875feb3d79d71d37f1b0d Mon Sep 17 00:00:00 2001 From: Alexey Sokolov Date: Wed, 30 Apr 2014 23:55:08 +0100 Subject: [PATCH] Replace travis keys and don't download travis_after_all.py Old key got leaked due to https://developer.github.com/changes/2014-04-25-user-content-security/ This commit tests that the key is not leaked anymore --- .travis-github.enc | Bin 3264 -> 3264 bytes .travis.yml | 11 ++-- .travis_after_all.py | 120 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 .travis_after_all.py diff --git a/.travis-github.enc b/.travis-github.enc index 39bb04f85d6905dd80b9ea2f356df946bd05da12..381fb5657d281549a6f7f8f51937fbceb0f8775e 100644 GIT binary patch literal 3264 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 literal 3264 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 diff --git a/.travis.yml b/.travis.yml index ed6e3c1f..011e29e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ env: matrix: - CFGFLAGS= MYCXXFLAGS= MYLDFLAGS= global: - - secure: "Rfoqtksz9rPuC2MszbwYRFarHGQuD2rrRV+cxNLwU9fBaWRfdhoJZKt+LqIUv/w84/Oz24gp1ulfW4jSwrfIjfG1ER/glkV5TcQOKjlhRVwjSFW8/9lZiZgqHVX5QiEqdrIeVOBLGQucQWcUb/vxxEZua4qIAiescBCi9s7AfkA=" + - secure: "i2f2UVDnyHT/9z0U3XvgTj8eDERvnc1Wk7HpseEjb75JwGzqn/2R+RKHmoSrwK3hFgij2IMxZL19XtHFwMz9t5A/huAAKD74KMMI/QpeZEJ/sjT3CTLcE9HEVDdJOjc7dfLRxb2hZtgvx8clZIMrpeUdPhci8openff30KvXVbg=" matrix: include: - compiler: clang @@ -20,7 +20,6 @@ before_install: - ( cd ~ && wget http://prdownloads.sourceforge.net/swig/swig-2.0.8.tar.gz && tar xvf swig-2.0.8.tar.gz && cd swig-2.0.8 && ./configure && make && sudo make install ) - sudo apt-get install doxygen graphviz script: - - curl -o travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py - ./bootstrap.sh - mkdir build - cd build @@ -31,14 +30,16 @@ script: - sudo make install - cd .. after_success: - - python travis_after_all.py - - cat .to_export_back - - export $(cat .to_export_back) + - test -r .travis_after_all_.py && python .travis_after_all.py || echo No .travis_after_all.py found + - test -r .to_export_back && cat .to_export_back || echo No .to_export_back found + - export DUMMY_VAR=dummy-value $(cat .to_export_back) - | if [ "$BUILD_LEADER" == "YES" ] && [ "$BUILD_AGGREGATE_STATUS" == "others_succeeded" ] && [ "$TRAVIS_REPO_SLUG" == "znc/znc" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "master" ]; then echo "All builds passed!" openssl aes-256-cbc -d -in .travis-github.enc -out ~/znc-docs-key -k ${SECRET_KEY} ./.travis-generate-docs.sh + else + echo "Not leader" fi notifications: irc: diff --git a/.travis_after_all.py b/.travis_after_all.py new file mode 100644 index 00000000..f20e53ee --- /dev/null +++ b/.travis_after_all.py @@ -0,0 +1,120 @@ +# https://github.com/dmakhno/travis_after_all/tree/b7172bca92d6dcfcec2a0eacdf14eb5f3a1ad627 + +# The MIT License (MIT) +# +# Copyright (c) 2014 Dmytro Makhno +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import os +import json +import time +import logging + +try: + import urllib.request as urllib2 +except ImportError: + import urllib2 + +log = logging.getLogger("travis.leader") +log.addHandler(logging.StreamHandler()) +log.setLevel(logging.INFO) + +TRAVIS_JOB_NUMBER = 'TRAVIS_JOB_NUMBER' +TRAVIS_BUILD_ID = 'TRAVIS_BUILD_ID' +POLLING_INTERVAL = 'LEADER_POLLING_INTERVAL' + +build_id = os.getenv(TRAVIS_BUILD_ID) +polling_interval = int(os.getenv(POLLING_INTERVAL, '5')) + +#assume, first job is the leader +is_leader = lambda job_number: job_number.endswith('.1') + +if not os.getenv(TRAVIS_JOB_NUMBER): + # seems even for builds with only one job, this won't get here + log.fatal("Don't use defining leader for build without matrix") + exit(1) +elif is_leader(os.getenv(TRAVIS_JOB_NUMBER)): + log.info("This is a leader") +else: + #since python is subprocess, env variables are exported back via file + with open(".to_export_back", "w") as export_var: + export_var.write("BUILD_MINION=YES") + log.info("This is a minion") + exit(0) + + +class MatrixElement(object): + def __init__(self, json_raw): + self.is_finished = json_raw['finished_at'] is not None + self.is_succeeded = json_raw['result'] == 0 + self.number = json_raw['number'] + self.is_leader = is_leader(self.number) + + +def matrix_snapshot(): + """ + :return: Matrix List + """ + response = urllib2.build_opener().open("https://api.travis-ci.org/builds/{0}".format(build_id)).read() + raw_json = json.loads(response) + matrix_without_leader = [MatrixElement(element) for element in raw_json["matrix"]] + return matrix_without_leader + + +def wait_others_to_finish(): + def others_finished(): + """ + Dumps others to finish + Leader cannot finish, it is working now + :return: tuple(True or False, List of not finished jobs) + """ + snapshot = matrix_snapshot() + finished = [el.is_finished for el in snapshot if not el.is_leader] + return reduce(lambda a, b: a and b, finished), [el.number for el in snapshot if + not el.is_leader and not el.is_finished] + + while True: + finished, waiting_list = others_finished() + if finished: break + log.info("Leader waits for minions {0}...".format(waiting_list)) # just in case do not get "silence timeout" + time.sleep(polling_interval) + + +try: + wait_others_to_finish() + + final_snapshot = matrix_snapshot() + log.info("Final Results: {0}".format([(e.number, e.is_succeeded) for e in final_snapshot])) + + BUILD_AGGREGATE_STATUS = 'BUILD_AGGREGATE_STATUS' + others_snapshot = [el for el in final_snapshot if not el.is_leader] + if reduce(lambda a, b: a and b, [e.is_succeeded for e in others_snapshot]): + os.environ[BUILD_AGGREGATE_STATUS] = "others_succeeded" + elif reduce(lambda a, b: a and b, [not e.is_succeeded for e in others_snapshot]): + log.error("Others Failed") + os.environ[BUILD_AGGREGATE_STATUS] = "others_failed" + else: + log.warn("Others Unknown") + os.environ[BUILD_AGGREGATE_STATUS] = "unknown" + #since python is subprocess, env variables are exported back via file + with open(".to_export_back", "w") as export_var: + export_var.write("BUILD_LEADER=YES {0}={1}".format(BUILD_AGGREGATE_STATUS, os.environ[BUILD_AGGREGATE_STATUS])) + +except Exception as e: + log.fatal(e)