summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAric Gardner <agardner@linuxfoundation.org>2018-09-12 14:12:51 -0400
committerTrevor Bramwell <tbramwell@linuxfoundation.org>2018-09-18 15:47:17 -0700
commitc0c6f23c2c494cefa01398f6c18e95af4c801d1a (patch)
treea4bb9d5684146dc4151442ccc6b2c5adfcf533c4
parent0ee36b71b34afa6f54415a8ed7bcd25222591a4e (diff)
Create branches via ssh rather than the https
Previously we created the branches over Gerrit's HTTPS interface. One or two projects from the previous release did not have their stable branches created at the correct place. Switch to using ssh for branch creation will be more reliable and easier for us to verify. Change-Id: If7f24d2b19e74513b59889bd64d25919aa048e4c Signed-off-by: Aric Gardner <agardner@linuxfoundation.org> Signed-off-by: Trevor Bramwell <tbramwell@linuxfoundation.org>
-rw-r--r--jjb/releng/releng-release-create-branch.sh15
-rw-r--r--jjb/releng/releng-release-jobs.yaml2
-rw-r--r--releases/scripts/create_branch.py143
-rw-r--r--releases/scripts/repos.py31
4 files changed, 44 insertions, 147 deletions
diff --git a/jjb/releng/releng-release-create-branch.sh b/jjb/releng/releng-release-create-branch.sh
index 92be0e637..663ff19e7 100644
--- a/jjb/releng/releng-release-create-branch.sh
+++ b/jjb/releng/releng-release-create-branch.sh
@@ -26,7 +26,20 @@ STREAM=${STREAM:-'nostream'}
RELEASE_FILES=$(git diff HEAD^1 --name-only -- "releases/$STREAM")
for release_file in $RELEASE_FILES; do
- python releases/scripts/create_branch.py -f $release_file
+
+ while read -r repo branch ref; do
+
+ echo "$repo" "$branch" "$ref"
+ branches="$(git ls-remote "https://gerrit.opnfv.org/gerrit/$repo.git" "refs/heads/$branch")"
+
+ if ! [ -z "$branches" ]; then
+ echo "refs/heads/$branch already exists at $ref ($branches)"
+ else
+ ssh -n -f -p 29418 gerrit.opnfv.org gerrit create-branch "$repo" "$branch" "$ref"
+ fi
+
+ done < <(python releases/scripts/repos.py -b -f "$release_file")
+
python releases/scripts/create_jobs.py -f $release_file
NEW_FILES=$(git status --porcelain --untracked=no | cut -c4-)
if [ -n "$NEW_FILES" ]; then
diff --git a/jjb/releng/releng-release-jobs.yaml b/jjb/releng/releng-release-jobs.yaml
index 89519ae9b..3136d7855 100644
--- a/jjb/releng/releng-release-jobs.yaml
+++ b/jjb/releng/releng-release-jobs.yaml
@@ -107,7 +107,7 @@
- shell: !include-raw-escape:
- releng-release-create-venv.sh
- releng-release-tagging.sh
- # - releng-release-create-branch.sh
+ - releng-release-create-branch.sh
publishers:
- email-jenkins-admins-on-failure
diff --git a/releases/scripts/create_branch.py b/releases/scripts/create_branch.py
deleted file mode 100644
index fa3c92def..000000000
--- a/releases/scripts/create_branch.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env python2
-# SPDX-License-Identifier: Apache-2.0
-##############################################################################
-# Copyright (c) 2018 The Linux Foundation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-"""
-Create Gerrit Branchs
-"""
-
-import argparse
-
-try:
- import ConfigParser
-except ImportError:
- import configparser as ConfigParser
-
-import logging
-import os
-import yaml
-
-from requests.compat import quote
-from requests.exceptions import RequestException
-
-from pygerrit2.rest import GerritRestAPI
-from pygerrit2.rest.auth import HTTPDigestAuthFromNetrc, HTTPBasicAuthFromNetrc
-
-
-logging.basicConfig(level=logging.INFO)
-
-
-def quote_branch(arguments):
- """
- Quote is used here to escape the '/' in branch name. By
- default '/' is listed in 'safe' characters which aren't escaped.
- quote is not used in the data of the PUT request, as quoting for
- arguments is handled by the request library
- """
- new_args = arguments.copy()
- new_args['branch'] = quote(new_args['branch'], '')
- return new_args
-
-
-def create_branch(api, arguments):
- """
- Create a branch using the Gerrit REST API
- """
- logger = logging.getLogger(__file__)
-
- branch_data = """
- {
- "ref": "%(branch)s"
- "revision": "%(commit)s"
- }""" % arguments
-
- # First verify the commit exists, otherwise the branch will be
- # created at HEAD
- try:
- request = api.get("/projects/%(project)s/commits/%(commit)s" %
- arguments)
- logger.debug(request)
- logger.debug("Commit exists: %(commit)s", arguments)
- except RequestException as err:
- if hasattr(err, 'response') and err.response.status_code in [404]:
- logger.warn("Commit %(commit)s for %(project)s does"
- " not exist. Not creating branch.", arguments)
- logger.warn(err)
- else:
- logger.error("Error: %s", str(err))
- # Skip trying to create the branch
- return
-
- # Try to create the branch and let us know if it already exist.
- try:
- request = api.put("/projects/%(project)s/branches/%(branch)s" %
- quote_branch(arguments), branch_data)
- logger.info("Branch %(branch)s for %(project)s successfully created",
- arguments)
- except RequestException as err:
- if hasattr(err, 'response') and err.response.status_code in [412, 409]:
- logger.info("Branch %(branch)s already created for %(project)s",
- arguments)
- logger.info(err)
- else:
- logger.error("Error: %s", str(err))
-
-
-def main():
- """Given a yamlfile that follows the release syntax, create branches
- in Gerrit listed under branches"""
-
- config = ConfigParser.ConfigParser()
- config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)),
- 'defaults.cfg'))
- config.read([os.path.expanduser('~/releases.cfg'), 'releases.cfg'])
-
- gerrit_url = config.get('gerrit', 'url')
-
- parser = argparse.ArgumentParser()
- parser.add_argument('--file', '-f',
- type=argparse.FileType('r'),
- required=True)
- parser.add_argument('--basicauth', '-b', action='store_true')
- args = parser.parse_args()
-
- GerritAuth = HTTPDigestAuthFromNetrc
- if args.basicauth:
- GerritAuth = HTTPBasicAuthFromNetrc
-
- try:
- auth = GerritAuth(url=gerrit_url)
- except ValueError as err:
- logging.error("%s for %s", err, gerrit_url)
- quit(1)
- restapi = GerritRestAPI(url=gerrit_url, auth=auth)
-
- project = yaml.safe_load(args.file)
-
- create_branches(restapi, project)
-
-
-def create_branches(restapi, project):
- """Create branches for a specific project defined in the release
- file"""
-
- branches = []
- for branch in project['branches']:
- repo, ref = next(iter(branch['location'].items()))
- branches.append({
- 'project': repo,
- 'branch': branch['name'],
- 'commit': ref
- })
-
- for branch in branches:
- create_branch(restapi, branch)
-
-
-if __name__ == "__main__":
- main()
diff --git a/releases/scripts/repos.py b/releases/scripts/repos.py
index 47ce42d88..91c4e9300 100644
--- a/releases/scripts/repos.py
+++ b/releases/scripts/repos.py
@@ -63,20 +63,28 @@ def main():
type=str,
help="Only print"
"SHAs for the specified release")
+ parser.add_argument('--branches', '-b',
+ action='store_true',
+ default=False,
+ help="Print Branch info")
+
args = parser.parse_args()
project = yaml.safe_load(args.file)
- list_repos(project, args)
+ if args.branches:
+ list_branches(project, args)
+ else:
+ list_repos(project, args)
def list_repos(project, args):
"""List repositories in the project file"""
lookup = project.get('releases', [])
+
if 'releases' not in project:
exit(0)
-
repos = set()
for item in lookup:
repo, ref = next(iter(item['location'].items()))
@@ -90,5 +98,24 @@ def list_repos(project, args):
print(repo)
+def list_branches(project, args):
+ """List branches in the project file"""
+
+ lookup = project.get('branches', [])
+
+ if 'branches' not in project:
+ exit(0)
+ repos = set()
+ for item in lookup:
+ repo, ref = next(iter(item['location'].items()))
+ if args.names:
+ repos.add(Repo(repo))
+ elif args.release and item['name'] == args.release:
+ repos.add(Repo(repo, ref))
+ elif not args.release:
+ repos.add(Repo(repo, item['name'], ref))
+ for repo in repos:
+ print(repo)
+
if __name__ == "__main__":
main()