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.