Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
get_pipeline_jobs.py 3.41 KiB
#!/usr/bin/env python3
"""

Queries the jobs of a given pipeline, filtered by stage

"""

import argparse
import logging
import sys

import gitlab as gl

import common

__author__ = "Jonas Höppner"
__email__ = "jonas.hoeppner@garz-fricke.com"

verbose = 0


def get_pipeline_pipelinejobs(gitlab, project, pipeline, name=None, stage=None):
    # Accept either an gitlab object, or name or id to specify a project
    if isinstance(project, gl.v4.objects.projects.Project):
        gl_project = project
    else:
        gl_project = gitlab.projects.get(project)

    gl_pipeline = gl_project.pipelines.get(pipeline)
    jobs = gl_pipeline.jobs.list(all=True)
    if stage is not None:
        jobs = list(filter(lambda j: j.stage == stage, jobs))
    if name is not None:
        jobs = list(filter(lambda j: j.name == name, jobs))

    return jobs


def get_pipeline_jobs(gitlab, project, pipeline, name=None, stage=None):
    # Accept either an gitlab object, or name or id to specify a project
    if isinstance(project, gl.v4.objects.projects.Project):
        gl_project = project
    else:
        gl_project = gitlab.projects.get(project)

    pipeline_jobs = get_pipeline_pipelinejobs(gitlab, project, pipeline, name, stage)
    jobs = []
    # Project Jobs from Pipeline Job
    for job in pipeline_jobs:
        jobs.append(gl_project.jobs.get(job.id))
    return jobs


def get_pipeline_job_ids(gitlab, project, pipeline, name=None, stage=None):
    jobs = get_pipeline_pipelinejobs(gitlab, project, pipeline, name, stage)
    return [j.id for j in jobs]


def main(args):
    parser = argparse.ArgumentParser(description=__doc__, usage="%(prog)s [OPTIONS]")

    parser.add_argument(
        "--gitlab-url",
        help="""URL to the GitLab instance""",
        dest="gitlab_url",
        action="store",
        default=common.GITLAB_URL,
    )
    parser.add_argument(
        "--token",
        help="""GitLab REST API private access token""",
        dest="token",
        required=True,
    )
    parser.add_argument(
        "--project",
        action="store",
        dest="project",
        help="Specify the project by either by id or by path.",
        required=True,
    )
    parser.add_argument(
        "--pipeline",
        action="store",
        dest="pipeline",
        help="Specify the pipeline by id.",
    )
    parser.add_argument(
        "-s",
        "--stage",
        action="store",
        default=None,
        help="Filter the jobs by the given stage, if omnitted all jobs are returned.",
    )
    parser.add_argument(
        "-n",
        "--name",
        action="store",
        default=None,
        help="Filter the jobs by given name, if omnitted all jobs are returned.",
    )
    parser.add_argument(
        "-v",
        "--verbose",
        action="count",
        dest="verbose",
        default=0,
        help="Increase verbosity.",
    )

    options = parser.parse_args(args)
    if options.verbose:
        logging.basicConfig(level=logging.DEBUG)

    logging.debug(options)
    gitlab = gl.Gitlab(options.gitlab_url, private_token=options.token)
    jobs = get_pipeline_jobs(
        gitlab, options.project, options.pipeline, options.name, options.stage
    )

    for j in jobs:
        print(j.name, j.id)

    job_ids = get_pipeline_job_ids(
        gitlab, options.project, options.pipeline, options.name, options.stage
    )
    for j in job_ids:
        print(j)


if __name__ == "__main__":
    main(sys.argv[1:])