Commit ce4988a4 by Feanil Patel

Add logic to be able to monitor RCs from jenkins.

parent 5621dbd0
import argparse import argparse
import json
import logging as log import logging as log
import pickle
import requests
import yaml import yaml
from datetime import datetime from datetime import datetime
from git import * from git import Repo
from os import path
from pprint import pformat from pprint import pformat
from pprint import pprint
from pymongo import MongoClient, DESCENDING from pymongo import MongoClient, DESCENDING
from stage_release import flip_repos, uri_from
def releases(repo):
def release_hashes(repo): for ref in repo.refs:
for ref in repo.remotes.origin.refs:
if ref.name.startswith('origin/rc/'): if ref.name.startswith('origin/rc/'):
yield ref.commit.hexsha yield ref
def check_all(args): def candidates_since(repo, time):
config = yaml.safe_load(open(args.config)) for rc in releases(repo):
client = MongoClient(uri_from(config['DOC_STORE_CONFIG'])) last_update = datetime.utcfromtimestamp(rc.commit.committed_date)
repos = [Repo(repo_dir) for repo_dir in config['repos']] if last_update > time:
configuration_repo = Repo(config['configuration_repo']) # New RC or updated RC
configuration_secure = Repo(config['configuration_secure']) yield rc
for repo in repos: def stage_release(url, token, repo, rc):
for git_hash in release_hashes(repo): params = []
pass params.append({'name': "{}_REF".format(repo), 'value': True})
params.append({'name': repo, 'value': rc.commit.hexsha})
build_params = {'parameter': params}
log.info("New rc found{}, staging new release.".format(rc.name))
r = requests.post(url,
data={"token", token},
params={"json": json.dumps(build_params)})
if r.status_code != 201:
msg = "Failed to submit request with params: {}"
raise Exception(msg.format(pformat(build_params)))
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Monitor git repos for new rc branches.") description="Monitor git repos for new rc branches.")
parser.add_argument('-c','--config', required=True, parser.add_argument('-c', '--config', required=True,
help="Config file.") help="Config file.")
parser.add_argument('-p', '--pickle', default="data.pickle",
help="Pickle of presistent data.")
args = parser.parse_args() args = parser.parse_args()
check_all(args)
config = yaml.safe_load(open(args.config))
if path.exists(args.pickle):
data = pickle.load(open(args.pickle))
else:
data = {}
if 'last_check' not in data:
last_check = datetime.utcnow()
else:
last_check = data['last_check']
data['last_check'] = datetime.utcnow()
all_plays = flip_repos(config['repos'])
# Find plays that are affected by this repo.
repos_with_changes = {}
for repo in config['repos']:
# Check for new rc candidates.
for rc in candidates_since(Repo(repo), last_check):
# Notify stage-release to build for the new repo.
stage_release(config['abby_url'], config['abby_token'], repo, rc)
pickle.dump(data, open(args.pickle, 'w'))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment