mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 12:10:37 +00:00
60e6b62dae
Use a path, which contains the namespace and the repo name instead of the complete URL when triggering the Cerbero CI pipeline. Some of the jobs in the Cerbero pipeline (specifically the examples build) need to curl the API, and they need the path for that, not the website or git URL. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7799>
123 lines
4 KiB
Python
Executable file
123 lines
4 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
import time
|
|
import os
|
|
import sys
|
|
import gitlab
|
|
|
|
CERBERO_PROJECT = 'gstreamer/cerbero'
|
|
|
|
|
|
class Status:
|
|
FAILED = 'failed'
|
|
MANUAL = 'manual'
|
|
CANCELED = 'canceled'
|
|
SUCCESS = 'success'
|
|
SKIPPED = 'skipped'
|
|
CREATED = 'created'
|
|
|
|
@classmethod
|
|
def is_finished(cls, state):
|
|
return state in [
|
|
cls.FAILED,
|
|
cls.MANUAL,
|
|
cls.CANCELED,
|
|
cls.SUCCESS,
|
|
cls.SKIPPED,
|
|
]
|
|
|
|
|
|
def fprint(msg):
|
|
print(msg, end="")
|
|
sys.stdout.flush()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
server = os.environ['CI_SERVER_URL']
|
|
gl = gitlab.Gitlab(server,
|
|
private_token=os.environ.get('GITLAB_API_TOKEN'),
|
|
job_token=os.environ.get('CI_JOB_TOKEN'))
|
|
|
|
def get_matching_user_project(project, branch):
|
|
cerbero = gl.projects.get(project)
|
|
# Search for matching branches, return only if the branch name matches
|
|
# exactly
|
|
for b in cerbero.branches.list(search=cerbero_branch, iterator=True):
|
|
if branch == b.name:
|
|
return cerbero
|
|
return None
|
|
|
|
cerbero = None
|
|
# We do not want to run on (often out of date) user upstream branch
|
|
if os.environ["CI_COMMIT_REF_NAME"] != os.environ['GST_UPSTREAM_BRANCH']:
|
|
try:
|
|
cerbero_name = f'{os.environ["CI_PROJECT_NAMESPACE"]}/cerbero'
|
|
cerbero_branch = os.environ["CI_COMMIT_REF_NAME"]
|
|
cerbero = get_matching_user_project(cerbero_name, cerbero_branch)
|
|
except gitlab.exceptions.GitlabGetError:
|
|
pass
|
|
|
|
if cerbero is None:
|
|
cerbero_name = CERBERO_PROJECT
|
|
cerbero_branch = os.environ["GST_UPSTREAM_BRANCH"]
|
|
cerbero = gl.projects.get(cerbero_name)
|
|
|
|
fprint(f"-> Triggering on branch {cerbero_branch} in {cerbero_name}\n")
|
|
|
|
# CI_PROJECT_URL is not necessarily the project where the branch we need to
|
|
# build resides, for instance merge request pipelines can be run on
|
|
# 'gstreamer' namespace. Fetch the branch name in the same way, just in
|
|
# case it breaks in the future.
|
|
if 'CI_MERGE_REQUEST_SOURCE_PROJECT_URL' in os.environ:
|
|
project_path = os.environ['CI_MERGE_REQUEST_SOURCE_PROJECT_PATH']
|
|
project_branch = os.environ['CI_MERGE_REQUEST_SOURCE_BRANCH_NAME']
|
|
else:
|
|
project_path = os.environ['CI_PROJECT_PATH']
|
|
project_branch = os.environ['CI_COMMIT_REF_NAME']
|
|
|
|
variables = {
|
|
"CI_GSTREAMER_PATH": project_path,
|
|
"CI_GSTREAMER_REF_NAME": project_branch,
|
|
# This tells cerbero CI that this is a pipeline started via the
|
|
# trigger API, which means it can use a deps cache instead of
|
|
# building from scratch.
|
|
"CI_GSTREAMER_TRIGGERED": "true",
|
|
}
|
|
|
|
meson_commit = os.environ.get('MESON_COMMIT')
|
|
if meson_commit:
|
|
# Propagate the Meson commit to cerbero pipeline and make sure it's not
|
|
# using deps cache.
|
|
variables['MESON_COMMIT'] = meson_commit
|
|
del variables['CI_GSTREAMER_TRIGGERED']
|
|
|
|
try:
|
|
pipe = cerbero.trigger_pipeline(
|
|
token=os.environ['CI_JOB_TOKEN'],
|
|
ref=cerbero_branch,
|
|
variables=variables,
|
|
)
|
|
except gitlab.exceptions.GitlabCreateError as e:
|
|
if e.response_code == 400:
|
|
exit('''
|
|
|
|
Could not start cerbero sub-pipeline due to insufficient permissions.
|
|
|
|
This is not a problem and is expected if you are not a GStreamer
|
|
developer with merge permission in the cerbero project.
|
|
|
|
When your Merge Request is assigned to Marge (our merge bot), it
|
|
will trigger the cerbero sub-pipeline with the correct permissions.
|
|
''')
|
|
else:
|
|
exit(f'Could not create cerbero sub-pipeline. Error: {e}')
|
|
|
|
fprint(f'Cerbero pipeline running at {pipe.web_url} ')
|
|
while True:
|
|
time.sleep(15)
|
|
pipe.refresh()
|
|
if Status.is_finished(pipe.status):
|
|
fprint(f": {pipe.status}\n")
|
|
sys.exit(0 if pipe.status == Status.SUCCESS else 1)
|
|
else:
|
|
fprint(".")
|