|

|  How to Integrate GitLab CI/CD API to Manage Pipelines in Python

How to Integrate GitLab CI/CD API to Manage Pipelines in Python

October 31, 2024

Discover how to seamlessly integrate GitLab CI/CD API with Python to efficiently manage and automate your pipelines in this comprehensive, easy-to-follow guide.

How to Integrate GitLab CI/CD API to Manage Pipelines in Python

 

Integrate GitLab CI/CD API with Python

 

  • To manage pipelines in GitLab via a Python application, you need to interact with the GitLab CI/CD API. This allows you to trigger, monitor, and control pipelines directly from your Python code.

 

import requests
import json

GITLAB_BASE_URL = "https://gitlab.example.com/api/v4"
PERSONAL_ACCESS_TOKEN = "your_personal_access_token"
PROJECT_ID = "your_project_id"
HEADERS = {"PRIVATE-TOKEN": PERSONAL_ACCESS_TOKEN}

 

Trigger a Pipeline

 

  • To trigger a pipeline programmatically, send a POST request to the pipelines endpoint, specifying the branch and any variables required for the pipeline.

 

def trigger_pipeline(branch="main", variables={}):
    url = f"{GITLAB_BASE_URL}/projects/{PROJECT_ID}/pipeline"
    data = {"ref": branch}
    if variables:
        data["variables"] = variables
    
    response = requests.post(url, headers=HEADERS, json=data)
    if response.ok:
        return response.json()
    else:
        return response.raise_for_status()

# Example of triggering with a specific branch and variables
pipeline_response = trigger_pipeline(branch="develop", variables={"BUILD_ENV": "staging"})
print(json.dumps(pipeline_response, indent=4))

 

List Pipelines

 

  • You can list existing pipelines to monitor the status of past and running pipelines by making a GET request to the pipelines endpoint.

 

def list_pipelines():
    url = f"{GITLAB_BASE_URL}/projects/{PROJECT_ID}/pipelines"
    response = requests.get(url, headers=HEADERS)
    if response.ok:
        return response.json()
    else:
        return response.raise_for_status()

# Retrieve and print a list of all pipelines
pipelines = list_pipelines()
for pipeline in pipelines:
    print(f"Pipeline ID: {pipeline['id']}, Status: {pipeline['status']}")

 

Get Pipeline Details

 

  • For detailed information on a specific pipeline, a GET request to the pipeline's endpoint by its unique ID can be used. This includes status, stages, and jobs.

 

def get_pipeline_details(pipeline_id):
    url = f"{GITLAB_BASE_URL}/projects/{PROJECT_ID}/pipelines/{pipeline_id}"
    response = requests.get(url, headers=HEADERS)
    if response.ok:
        return response.json()
    else:
        return response.raise_for_status()

# Example usage
pipeline_id = 123456
pipeline_details = get_pipeline_details(pipeline_id)
print(json.dumps(pipeline_details, indent=4))

 

Cancel a Pipeline

 

  • To cancel a running pipeline, issue a POST request to the pipeline's endpoint using the pipeline ID. This is useful for stopping builds in progress.

 

def cancel_pipeline(pipeline_id):
    url = f"{GITLAB_BASE_URL}/projects/{PROJECT_ID}/pipelines/{pipeline_id}/cancel"
    response = requests.post(url, headers=HEADERS)
    if response.ok:
        return response.json()
    else:
        return response.raise_for_status()

# Example of canceling a pipeline
cancel_response = cancel_pipeline(pipeline_id=123456)
print(json.dumps(cancel_response, indent=4))

 

Retry a Pipeline

 

  • If a job fails in a pipeline, it can be retried by sending a POST request to the retry endpoint.

 

def retry_pipeline(pipeline_id):
    url = f"{GITLAB_BASE_URL}/projects/{PROJECT_ID}/pipelines/{pipeline_id}/retry"
    response = requests.post(url, headers=HEADERS)
    if response.ok:
        return response.json()
    else:
        return response.raise_for_status()

# Example of retrying a pipeline
retry_response = retry_pipeline(pipeline_id=123456)
print(json.dumps(retry_response, indent=4))

 

Conclusion

 

  • Integrating GitLab CI/CD with Python involves using the API to control and monitor your pipelines. It's important to handle API requests and responses correctly, particularly with error handling and authentication.