From 1b853463323a1b2330aee4f34e77a0619b8ef518 Mon Sep 17 00:00:00 2001
From: Tim Jaacks <tim.jaacks@garz-fricke.com>
Date: Tue, 19 Jan 2021 12:56:52 +0100
Subject: [PATCH] Add error handling to retriggering jobs

---
 retrigger_mr_pipeline_job.py  | 27 +++++++++++++--------------
 retrigger_mr_pipeline_jobs.py | 17 +++++++++++++++--
 2 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/retrigger_mr_pipeline_job.py b/retrigger_mr_pipeline_job.py
index 5357ba67..b9b425ec 100755
--- a/retrigger_mr_pipeline_job.py
+++ b/retrigger_mr_pipeline_job.py
@@ -6,7 +6,7 @@ import sys
 from gitlab import Gitlab, GitlabGetError
 
 
-def retrigger_mr_pipeline_job(project, mr, job_name):
+def retrigger_mr_pipeline_job(project, mr, job_name, status_list):
     # Get pipeline
     pipeline = project.pipelines.get(mr.pipeline.get("id"), retry_transient_errors=True)
 
@@ -15,20 +15,19 @@ def retrigger_mr_pipeline_job(project, mr, job_name):
     for pipelinejob in pipeline.jobs.list():
         if pipelinejob.name == job_name:
             job = project.jobs.get(pipelinejob.id, retry_transient_errors=True)
-
     if not job:
-        sys.exit(
-            "ERROR: could not find job '%s' in pipeline of !%s" % (job_name, mr.iid)
-        )
+        print("Could not find job '%s' in pipeline of !%s" % (job_name, mr.iid))
+        return None
+
+    # Only retrigger if job is in certain status
+    if job.status not in status_list:
+        return None
 
-    # Retrigger if not already failed
-    if job.status not in ["failed", "skipped"]:
-        job.retry()
-        print("Retrigger job '%s' of pipeline #%s:" % (job_name, pipeline.id))
-        job = project.jobs.get(job.id, retry_transient_errors=True)
-        print(job.web_url)
-    else:
-        job = None
+    # Retrigger job
+    job.retry()
+    print("Retrigger job '%s' of pipeline #%s:" % (job_name, pipeline.id))
+    job = project.jobs.get(job.id, retry_transient_errors=True)
+    print(job.web_url)
 
     return job
 
@@ -80,7 +79,7 @@ def main():
     if not mr:
         sys.exit("ERROR: could not find merge request %s!%s" % (project.name, args.iid))
 
-    retrigger_mr_pipeline_job(project, mr, args.job)
+    retrigger_mr_pipeline_job(project, mr, args.job, ["success", "running"])
 
 
 if __name__ == "__main__":
diff --git a/retrigger_mr_pipeline_jobs.py b/retrigger_mr_pipeline_jobs.py
index 95e40da9..24019bbf 100755
--- a/retrigger_mr_pipeline_jobs.py
+++ b/retrigger_mr_pipeline_jobs.py
@@ -2,7 +2,8 @@
 import common
 
 import argparse
-from gitlab import Gitlab
+import sys
+from gitlab import Gitlab, GitlabJobRetryError
 
 from get_merge_requests import get_merge_requests
 from retrigger_mr_pipeline_job import retrigger_mr_pipeline_job
@@ -72,8 +73,20 @@ def main():
         commit=args.commit,
     )
 
+    failed = 0
     for mr in mrs:
-        retrigger_mr_pipeline_job(project, mr, args.job)
+        try:
+            retrigger_mr_pipeline_job(project, mr, args.job, ["success", "running"])
+        except GitlabJobRetryError as e:
+            print(
+                "ERROR: Could not retrigger job '%s' of %s!%s: %s"
+                % (args.job, args.project, mr.iid, e)
+            )
+            failed = failed + 1
+            continue
+
+    if failed > 0:
+        sys.exit(1)
 
 
 if __name__ == "__main__":
-- 
GitLab