[ops] use build stages in travis (#3810)
This commit is contained in:
committed by
Florent Vilmart
parent
88de01f3d8
commit
391ac97494
108
.travis.yml
108
.travis.yml
@@ -11,21 +11,6 @@ addons:
|
|||||||
postgresql: '9.5'
|
postgresql: '9.5'
|
||||||
apt_packages:
|
apt_packages:
|
||||||
- postgresql-9.5-postgis-2.3
|
- postgresql-9.5-postgis-2.3
|
||||||
before_script:
|
|
||||||
- node -e 'require("./lib/index.js")'
|
|
||||||
- psql -c 'create database parse_server_postgres_adapter_test_database;' -U postgres
|
|
||||||
- psql -c 'CREATE EXTENSION postgis;' -U postgres -d parse_server_postgres_adapter_test_database
|
|
||||||
- psql -c 'CREATE EXTENSION postgis_topology;' -U postgres -d parse_server_postgres_adapter_test_database
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- COVERAGE_OPTION='./node_modules/.bin/nyc'
|
|
||||||
matrix:
|
|
||||||
- MONGODB_VERSION=3.0.8
|
|
||||||
- MONGODB_VERSION=3.2.6
|
|
||||||
- PARSE_SERVER_TEST_DB=postgres
|
|
||||||
- PARSE_SERVER_TEST_CACHE=redis
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
@@ -35,36 +20,69 @@ cache:
|
|||||||
directories:
|
directories:
|
||||||
- node_modules
|
- node_modules
|
||||||
- "$HOME/.mongodb/versions"
|
- "$HOME/.mongodb/versions"
|
||||||
|
|
||||||
|
# Test stage
|
||||||
|
stage: test
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- COVERAGE_OPTION='./node_modules/.bin/nyc'
|
||||||
|
matrix:
|
||||||
|
- MONGODB_VERSION=3.0.8
|
||||||
|
- MONGODB_VERSION=3.2.6
|
||||||
|
- PARSE_SERVER_TEST_DB=postgres
|
||||||
|
- PARSE_SERVER_TEST_CACHE=redis
|
||||||
|
before_script:
|
||||||
|
- node -e 'require("./lib/index.js")'
|
||||||
|
- psql -c 'create database parse_server_postgres_adapter_test_database;' -U postgres
|
||||||
|
- psql -c 'CREATE EXTENSION postgis;' -U postgres -d parse_server_postgres_adapter_test_database
|
||||||
|
- psql -c 'CREATE EXTENSION postgis_topology;' -U postgres -d parse_server_postgres_adapter_test_database
|
||||||
after_script:
|
after_script:
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
after_failure:
|
|
||||||
- (cd resources; python travis_after_all.py)
|
|
||||||
after_success:
|
|
||||||
- (cd resources; python travis_after_all.py)
|
|
||||||
- export $(cat resources/.to_export_back)
|
|
||||||
|
|
||||||
deploy:
|
jobs:
|
||||||
- provider: npm
|
include:
|
||||||
skip_cleanup: true
|
# release on github latest branch
|
||||||
email:
|
- stage: release
|
||||||
secure: "YweTGc22uqFWpzbfiUa5ptBLRAy6tt6d9TZLwEkPtmnsWzN9dguGyKWmXiw0qL+848FWQ5PWzUgBn5XdigV9tF3rJY6RGs8i38WulNjwSoGuRZa3AChsQHAb1KenANcJybzhnwgEj9gRsrGZPEsyI2whfake/xLDtG91kHjpJANsd4gseOh6fdS4FIYCbyXvSbC7S0yZzIJkgSkMqJO7RJ8r0HYQ7srYIw31dM3ZXSmUYu+GaMDUUu3RLAGYoKaROxhDRnzkjdeLLiwZH8hQ/6CaqwqX54iJ6OS+MOQU3fi5ZXalA7RZvtC4RmrcCkaTf3i0f+5xejYIFgzXdYGMVm8DUc82tDw1s4b6Pb19bgi1xXOQ0IKzRmZuGxnvkRN61dnYdnpnnNuG97HXgVjiOigZXVLZkWazUdnf9zXqmkC+KxPfa4Ldqg0TMjQ9J14n6TXxRti8Tt0xMa1Uzho7VdsxdJy35Bghy398O6X8VdX6parfzEkX7c/JzcA3TIMJ9+S1dy3J4Tb2URB5367W6h7cDeXtGmwLTFu75Q1CNqRJkUGbSrX2NyMqG5tc8oaTM+OWvLxcbKPRy9T6qN7x2JmCHHaapf8/8VR9wCy2PwE5j+KWhmctEHqqOgrtG5gsjC0eCPJsposxZWyM7M6aUpXe3w+olBfKq9apUGStUSU="
|
node_js: '6.1'
|
||||||
api_key:
|
env: RELEASE=github-latest
|
||||||
secure: "QprkaqQ+WCvZQR4qIEs5iS6peMCbRd8Hgt0s6HfdmhavNXwDFY8Bkdf6zJwWHLiqs4pyClXDZ2f6QiOs7y9IvJZ+wOIbsf4N5V6s06zOxJ0NAOwhe0mgWS3Us0zgXIfmW4BpmGnU4ql/qGL+9vNfyQJ7wxEJxVK7hiYh9Epu49E2jmefDqTX+SNSrDCg4HkRcxerxYGnAJDCP50QaNlyLSciODD6wHaddrSYkdvmISLMnLHug61OkE4OBIOWXfYV+e31kDj+zgczAfVQgekDKtaimCQclHFrmaEPl0KIm6wsDQAw5HWkepA/WZfv4SbCrDaKJDZw+LBI7dR0ezmiOH/zmWWrRW7D4wjkDGiumWjA8etuf8I4GRyC/d1RS+hnlvPr0Bu+WljuVxLoK3nhZOdiK5t4QlVDoGankkRjLylwFQgo8tzu5N0dc26z3ClowTwcKsjStmFr53gjCD7l3qoFjyPot1JlW3LPhG9Nch7rK33/7ONqVai3zxb1xB9ynd8TSzKi4/66LeYEDcGVM5A9Vmkp+egCnOhkOAXdI8O4jid98NANir+U4xmUYZ2PAMNmSeHlpSpwH2pC1/BHpDKA9RZEuEdr3sgmtuXXwwOCp+xvuVwxZZ6+gVEjG4nGTqSNxUIq1fzjGih8ElJtbM1Uhh2dVE9uxW7EC/oCuuk="
|
before_script: skip
|
||||||
on:
|
after_script: skip
|
||||||
tags: true
|
script: skip
|
||||||
all_branches: true
|
deploy:
|
||||||
condition: "$BUILD_LEADER$BUILD_AGGREGATE_STATUS = YESothers_succeeded"
|
- provider: script
|
||||||
repo: parse-community/parse-server
|
skip_cleanup: true
|
||||||
- provider: script
|
script: ./resources/npm-git.sh
|
||||||
skip_cleanup: true
|
on:
|
||||||
script: ./resources/npm-git.sh
|
branch: master
|
||||||
on:
|
# release on npm
|
||||||
branch: master
|
- stage: release
|
||||||
condition: "$BUILD_LEADER$BUILD_AGGREGATE_STATUS = YESothers_succeeded"
|
before_script: skip
|
||||||
- provider: script
|
after_script: skip
|
||||||
skip_cleanup: true
|
script: skip
|
||||||
script: ./resources/docker-hub.sh
|
node_js: '6.1'
|
||||||
on:
|
env: RELEASE=npm
|
||||||
tags: true
|
deploy:
|
||||||
all_branches: true
|
- provider: npm
|
||||||
condition: "$BUILD_LEADER$BUILD_AGGREGATE_STATUS = YESothers_succeeded"
|
skip_cleanup: true
|
||||||
|
email:
|
||||||
|
secure: "YweTGc22uqFWpzbfiUa5ptBLRAy6tt6d9TZLwEkPtmnsWzN9dguGyKWmXiw0qL+848FWQ5PWzUgBn5XdigV9tF3rJY6RGs8i38WulNjwSoGuRZa3AChsQHAb1KenANcJybzhnwgEj9gRsrGZPEsyI2whfake/xLDtG91kHjpJANsd4gseOh6fdS4FIYCbyXvSbC7S0yZzIJkgSkMqJO7RJ8r0HYQ7srYIw31dM3ZXSmUYu+GaMDUUu3RLAGYoKaROxhDRnzkjdeLLiwZH8hQ/6CaqwqX54iJ6OS+MOQU3fi5ZXalA7RZvtC4RmrcCkaTf3i0f+5xejYIFgzXdYGMVm8DUc82tDw1s4b6Pb19bgi1xXOQ0IKzRmZuGxnvkRN61dnYdnpnnNuG97HXgVjiOigZXVLZkWazUdnf9zXqmkC+KxPfa4Ldqg0TMjQ9J14n6TXxRti8Tt0xMa1Uzho7VdsxdJy35Bghy398O6X8VdX6parfzEkX7c/JzcA3TIMJ9+S1dy3J4Tb2URB5367W6h7cDeXtGmwLTFu75Q1CNqRJkUGbSrX2NyMqG5tc8oaTM+OWvLxcbKPRy9T6qN7x2JmCHHaapf8/8VR9wCy2PwE5j+KWhmctEHqqOgrtG5gsjC0eCPJsposxZWyM7M6aUpXe3w+olBfKq9apUGStUSU="
|
||||||
|
api_key:
|
||||||
|
secure: "QprkaqQ+WCvZQR4qIEs5iS6peMCbRd8Hgt0s6HfdmhavNXwDFY8Bkdf6zJwWHLiqs4pyClXDZ2f6QiOs7y9IvJZ+wOIbsf4N5V6s06zOxJ0NAOwhe0mgWS3Us0zgXIfmW4BpmGnU4ql/qGL+9vNfyQJ7wxEJxVK7hiYh9Epu49E2jmefDqTX+SNSrDCg4HkRcxerxYGnAJDCP50QaNlyLSciODD6wHaddrSYkdvmISLMnLHug61OkE4OBIOWXfYV+e31kDj+zgczAfVQgekDKtaimCQclHFrmaEPl0KIm6wsDQAw5HWkepA/WZfv4SbCrDaKJDZw+LBI7dR0ezmiOH/zmWWrRW7D4wjkDGiumWjA8etuf8I4GRyC/d1RS+hnlvPr0Bu+WljuVxLoK3nhZOdiK5t4QlVDoGankkRjLylwFQgo8tzu5N0dc26z3ClowTwcKsjStmFr53gjCD7l3qoFjyPot1JlW3LPhG9Nch7rK33/7ONqVai3zxb1xB9ynd8TSzKi4/66LeYEDcGVM5A9Vmkp+egCnOhkOAXdI8O4jid98NANir+U4xmUYZ2PAMNmSeHlpSpwH2pC1/BHpDKA9RZEuEdr3sgmtuXXwwOCp+xvuVwxZZ6+gVEjG4nGTqSNxUIq1fzjGih8ElJtbM1Uhh2dVE9uxW7EC/oCuuk="
|
||||||
|
on:
|
||||||
|
tags: true
|
||||||
|
all_branches: true
|
||||||
|
repo: parse-community/parse-server
|
||||||
|
# publish on docker
|
||||||
|
- stage: release
|
||||||
|
before_script: skip
|
||||||
|
after_script: skip
|
||||||
|
script: skip
|
||||||
|
node_js: '6.1'
|
||||||
|
env: RELEASE=docker
|
||||||
|
deploy:
|
||||||
|
- provider: script
|
||||||
|
skip_cleanup: true
|
||||||
|
script: ./resources/docker-hub.sh
|
||||||
|
on:
|
||||||
|
tags: true
|
||||||
|
all_branches: true
|
||||||
|
|||||||
@@ -30,4 +30,4 @@ git config user.name "Travis CI"
|
|||||||
git config user.email "github@fb.com"
|
git config user.email "github@fb.com"
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Deploy master to LATEST branch"
|
git commit -m "Deploy master to LATEST branch"
|
||||||
git push --force --quiet "https://${GH_TOKEN}@github.com/parseplatform/parse-server.git" master:latest
|
git push --force --quiet "https://${GH_TOKEN}@github.com/parse-community/parse-server.git" master:latest
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
"""
|
|
||||||
https://github.com/dmakhno/travis_after_all/blob/master/travis_after_all.py
|
|
||||||
https://github.com/graphql/graphql-js/blob/master/resources/travis_after_all.py
|
|
||||||
"""
|
|
||||||
|
|
||||||
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)
|
|
||||||
Reference in New Issue
Block a user