diff --git a/CI/check_twin_pipelines.py b/CI/check_twin_pipelines.py index 13c08db29ff33a08043424552a80166aaced58d2..b095960b12cc313b042af9619421c0a6cbdb9c10 100644 --- a/CI/check_twin_pipelines.py +++ b/CI/check_twin_pipelines.py @@ -22,24 +22,64 @@ import os import urllib.request import urllib.parse import json +import re +import time + +""" +Send a request to Gitlab and return the answer +The request parameter is added after `project/:id/` +""" +def GitlabRequest(request, project=53,data={}, token=''): + gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/" + gitlab_url+= str(project) + '/' + request + params = '' + if data: + params = urllib.parse.urlencode(data) + gitlab_request = urllib.request.Request(gitlab_url) + if token: + gitlab_request.add_header('PRIVATE-TOKEN' , token ) + res = urllib.request.urlopen(gitlab_request, data=params.encode('ascii')) + return json.loads(res.read().decode()) + +""" +Check needed environment parameters +""" +def CheckEnvParameters(params): + for p in params: + if not p in os.environ.keys(): + print("Missing environment variable '"+p+"'") + return False + return True """ Check for any duplicated twin pipeline and cancel it """ if __name__ == "__main__": + if not CheckEnvParameters(['CI_COMMIT_SHA']): + sys.exit(1) env = os.environ sha1 = env['CI_COMMIT_SHA'] + # are we in a merge_request pipeline ? if 'CI_MERGE_REQUEST_IID' in env.keys(): - gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/" - gitlab_url+= env['CI_PROJECT_ID'] + '/pipelines?sha='+sha1 - gitlab_request = urllib.request.Request(gitlab_url) - gitlab_request.add_header('PRIVATE-TOKEN' , env['K8S_SECRET_TWIN_PIPELINE'] ) - res = urllib.request.urlopen(gitlab_request).read().decode() - jres = json.loads(res) - for item in jres: - if item["id"] < int(env['CI_PIPELINE_ID']) and item["status"] == "running": - gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/" - gitlab_url+= env['CI_PROJECT_ID'] + '/pipelines/'+str(item["id"])+'/cancel' - gitlab_request = urllib.request.Request(gitlab_url) - gitlab_request.add_header('PRIVATE-TOKEN' , env['K8S_SECRET_TWIN_PIPELINE'] ) - res2 = urllib.request.urlopen(gitlab_request).read().decode() + if not CheckEnvParameters(['K8S_SECRET_TWIN_PIPELINE','CI_PROJECT_ID','CI_PIPELINE_ID']): + sys.exit(1) + mrInfo = GitlabRequest('merge_requests/'+env['CI_MERGE_REQUEST_IID'],token=env['K8S_SECRET_TWIN_PIPELINE']) + wip_regex = re.compile("^[Ww][Ii][Pp]:") + # is it a "WIP" merge request ? + if wip_regex.search(mrInfo["title"]): + # Yes: cancel the current pipeline + print("Cancel current pipeline "+env['CI_PIPELINE_ID']) + GitlabRequest('pipelines/'+env['CI_PIPELINE_ID']+'/cancel', \ + project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE']) + time.sleep(180) + print("Error: this pipeline should have been canceled") + sys.exit(1) + else: + # No: cancel any previous "normal" pipeline on the same SHA1 + jres = GitlabRequest('pipelines', project=env['CI_PROJECT_ID'], data={'sha':sha1}, token=env['K8S_SECRET_TWIN_PIPELINE']) + for item in jres: + if item["id"] < int(env['CI_PIPELINE_ID']) and item["status"] == "running": + print("Cancel pipeline "+str(item["id"])) + jres2 = GitlabRequest('pipelines/'+str(item["id"])+'/cancel', \ + project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE']) +