From d914375070dc67dead065425fc3e3633fea4e0d3 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:52 -0400 Subject: scripts/ci/gitlab-pipeline-status: make branch name configurable With the utility function `get_local_staging_branch_commit()`, the name of the branch is hard coded (including in the function name). For extensibility reasons, let's make that configurable. Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-2-crosa@redhat.com> Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index 348a49b6a4..194dd4d0bb 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -23,20 +23,20 @@ import time import sys -def get_local_staging_branch_commit(): +def get_local_branch_commit(branch='staging'): """ Returns the commit sha1 for the *local* branch named "staging" """ - result = subprocess.run(['git', 'rev-parse', 'staging'], + result = subprocess.run(['git', 'rev-parse', branch], stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, cwd=os.path.dirname(__file__), universal_newlines=True).stdout.strip() - if result == 'staging': - raise ValueError("There's no local branch named 'staging'") + if result == branch: + raise ValueError("There's no local branch named '%s'" % branch) if len(result) != 40: - raise ValueError("Branch staging HEAD doesn't look like a sha1") + raise ValueError("Branch '%s' HEAD doesn't look like a sha1" % branch) return result @@ -110,7 +110,7 @@ def main(): 'for https://gitlab.com/qemu-project/qemu, that ' 'is, "%(default)s"')) try: - default_commit = get_local_staging_branch_commit() + default_commit = get_local_branch_commit() commit_required = False except ValueError: default_commit = '' -- cgit v1.2.3-55-g7522 From 6dfcbff8bf7ca8c52a5ee2d351ec9c291e22fd5e Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:53 -0400 Subject: scripts/ci/gitlab-pipeline-status: improve message regarding timeout The script has its own timeout, which is about how long the script will wait (when called with --wait) for the pipeline to complete, and not necessarily for the pipeline to complete. Hopefully this new wording will be clearer. Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-3-crosa@redhat.com> Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index 194dd4d0bb..2a36f74696 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -69,7 +69,10 @@ def wait_on_pipeline_success(timeout, interval, start = time.time() while True: if time.time() >= (start + timeout): - print("Waiting on the pipeline timed out") + msg = ("Timeout (-t/--timeout) of %i seconds reached, " + "won't wait any longer for the pipeline to complete") + msg %= timeout + print(msg) return False status = get_pipeline_status(project_id, commit_sha) -- cgit v1.2.3-55-g7522 From db5424dfda1329da226ad98904c3a26fc9f7310f Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:54 -0400 Subject: scripts/ci/gitlab-pipeline-status: give early feedback on running pipelines When waiting for a pipeline to run and finish, it's better to give early feedback, and then sleep and wait, than the other wait around. Specially for the first iteration, it's frustrating to see nothing while the script is sleeping. Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-4-crosa@redhat.com> Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index 2a36f74696..18609553be 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -77,8 +77,8 @@ def wait_on_pipeline_success(timeout, interval, status = get_pipeline_status(project_id, commit_sha) if status['status'] == 'running': - time.sleep(interval) print('running...') + time.sleep(interval) continue if status['status'] == 'success': -- cgit v1.2.3-55-g7522 From 91641d555ae06726169f6ec8b57caeebcb0b71d0 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:55 -0400 Subject: scripts/ci/gitlab-pipeline-status: refactor parser creation Out of the main function. Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-5-crosa@redhat.com> Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index 18609553be..8355b6a427 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -89,10 +89,7 @@ def wait_on_pipeline_success(timeout, interval, return False -def main(): - """ - Script entry point - """ +def create_parser(): parser = argparse.ArgumentParser( prog='pipeline-status', description='check or wait on a pipeline status') @@ -127,7 +124,13 @@ def main(): parser.add_argument('--verbose', action='store_true', default=False, help=('A minimal verbosity level that prints the ' 'overall result of the check/wait')) + return parser +def main(): + """ + Script entry point + """ + parser = create_parser() args = parser.parse_args() try: -- cgit v1.2.3-55-g7522 From 79df438eeb5e754a0ae22210238e4e6555e7428f Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:56 -0400 Subject: scripts/ci/gitlab-pipeline-status: handle keyboard interrupts So that exits based on user requests are handled more gracefully. Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-6-crosa@redhat.com> Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index 8355b6a427..ced488f27c 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -132,7 +132,7 @@ def main(): """ parser = create_parser() args = parser.parse_args() - + success = False try: if args.wait: success = wait_on_pipeline_success( @@ -145,9 +145,11 @@ def main(): args.commit) success = status['status'] == 'success' except Exception as error: # pylint: disable=W0703 - success = False if args.verbose: print("ERROR: %s" % error.args[0]) + except KeyboardInterrupt: + if args.verbose: + print("Exiting on user's request") if success: if args.verbose: -- cgit v1.2.3-55-g7522 From 176498ab57dc14a7c14a58b490aa16319f0cf638 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:57 -0400 Subject: scripts/ci/gitlab-pipeline-status: use more descriptive exceptions For two very different error conditions. Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-7-crosa@redhat.com> Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index ced488f27c..628150ce0b 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -23,6 +23,14 @@ import time import sys +class CommunicationFailure(Exception): + """Failed to communicate to gitlab.com APIs.""" + + +class NoPipelineFound(Exception): + """Communication is successfull but pipeline is not found.""" + + def get_local_branch_commit(branch='staging'): """ Returns the commit sha1 for the *local* branch named "staging" @@ -50,14 +58,14 @@ def get_pipeline_status(project_id, commit_sha1): connection.request('GET', url=url) response = connection.getresponse() if response.code != http.HTTPStatus.OK: - raise ValueError("Failed to receive a successful response") + raise CommunicationFailure("Failed to receive a successful response") json_response = json.loads(response.read()) # As far as I can tell, there should be only one pipeline for the same # project + commit. If this assumption is false, we can add further # filters to the url, such as username, and order_by. if not json_response: - raise ValueError("No pipeline found") + raise NoPipelineFound("No pipeline found") return json_response[0] -- cgit v1.2.3-55-g7522 From ea8bf1e514d2f442dd1a008794eb1563e2ee1c48 Mon Sep 17 00:00:00 2001 From: Cleber Rosa Date: Fri, 4 Sep 2020 12:42:58 -0400 Subject: scripts/ci/gitlab-pipeline-status: wait for pipeline creation When called in wait mode, this script will also wait for the pipeline to be get to a "running" state. Because many more status may be seen until a pipeline gets to "running", and those need to be handle too. Reference: https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines Signed-off-by: Cleber Rosa Message-Id: <20200904164258.240278-8-crosa@redhat.com> Signed-off-by: Thomas Huth --- scripts/ci/gitlab-pipeline-status | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'scripts') diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status index 628150ce0b..bac8233079 100755 --- a/scripts/ci/gitlab-pipeline-status +++ b/scripts/ci/gitlab-pipeline-status @@ -83,13 +83,22 @@ def wait_on_pipeline_success(timeout, interval, print(msg) return False - status = get_pipeline_status(project_id, commit_sha) - if status['status'] == 'running': - print('running...') + try: + status = get_pipeline_status(project_id, commit_sha) + except NoPipelineFound: + print('Pipeline has not been found, it may not have been created yet.') + time.sleep(1) + continue + + pipeline_status = status['status'] + status_to_wait = ('created', 'waiting_for_resource', 'preparing', + 'pending', 'running') + if pipeline_status in status_to_wait: + print('%s...' % pipeline_status) time.sleep(interval) continue - if status['status'] == 'success': + if pipeline_status == 'success': return True msg = "Pipeline failed, check: %s" % status['web_url'] -- cgit v1.2.3-55-g7522