1 """Sensor for retrieving latest GitLab CI job information."""
3 from __future__
import annotations
5 from datetime
import timedelta
8 from gitlab
import Gitlab, GitlabAuthenticationError, GitlabGetError
9 import voluptuous
as vol
12 PLATFORM_SCHEMA
as SENSOR_PLATFORM_SCHEMA,
22 _LOGGER = logging.getLogger(__name__)
24 ATTR_BUILD_BRANCH =
"build branch"
25 ATTR_BUILD_COMMIT_DATE =
"commit date"
26 ATTR_BUILD_COMMIT_ID =
"commit id"
27 ATTR_BUILD_DURATION =
"build_duration"
28 ATTR_BUILD_FINISHED =
"build_finished"
29 ATTR_BUILD_ID =
"build id"
30 ATTR_BUILD_STARTED =
"build_started"
31 ATTR_BUILD_STATUS =
"build_status"
32 ATTRIBUTION =
"Information provided by https://gitlab.com/"
34 CONF_GITLAB_ID =
"gitlab_id"
36 DEFAULT_NAME =
"GitLab CI Status"
37 DEFAULT_URL =
"https://gitlab.com"
39 ICON_HAPPY =
"mdi:emoticon-happy"
40 ICON_OTHER =
"mdi:git"
41 ICON_SAD =
"mdi:emoticon-sad"
45 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
47 vol.Required(CONF_GITLAB_ID): cv.string,
48 vol.Required(CONF_TOKEN): cv.string,
49 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
50 vol.Optional(CONF_URL, default=DEFAULT_URL): cv.string,
58 add_entities: AddEntitiesCallback,
59 discovery_info: DiscoveryInfoType |
None =
None,
61 """Set up the GitLab sensor platform."""
62 _name = config.get(CONF_NAME, DEFAULT_NAME)
63 _interval = config.get(CONF_SCAN_INTERVAL, SCAN_INTERVAL)
64 _url = config.get(CONF_URL)
67 priv_token=config[CONF_TOKEN],
68 gitlab_id=config[CONF_GITLAB_ID],
77 """Representation of a GitLab sensor."""
79 _attr_attribution = ATTRIBUTION
81 def __init__(self, gitlab_data: GitLabData, name: str) ->
None:
82 """Initialize the GitLab sensor."""
89 """Return the icon to use in the frontend."""
97 """Collect updated data from GitLab API."""
102 ATTR_BUILD_STATUS: self.
_gitlab_data_gitlab_data.status,
103 ATTR_BUILD_STARTED: self.
_gitlab_data_gitlab_data.started_at,
104 ATTR_BUILD_FINISHED: self.
_gitlab_data_gitlab_data.finished_at,
105 ATTR_BUILD_DURATION: self.
_gitlab_data_gitlab_data.duration,
106 ATTR_BUILD_COMMIT_ID: self.
_gitlab_data_gitlab_data.commit_id,
107 ATTR_BUILD_COMMIT_DATE: self.
_gitlab_data_gitlab_data.commit_date,
109 ATTR_BUILD_BRANCH: self.
_gitlab_data_gitlab_data.branch,
115 """GitLab Data object."""
117 def __init__(self, gitlab_id, priv_token, interval, url):
118 """Fetch data from GitLab API for most recent CI job."""
121 self.
_gitlab_gitlab = Gitlab(url, private_token=priv_token, per_page=1)
138 _last_pipeline = _projects.pipelines.list(page=1)[0]
139 _last_job = _last_pipeline.jobs.list(page=1)[0]
140 self.
statusstatus = _last_pipeline.attributes.get(
"status")
141 self.
started_atstarted_at = _last_job.attributes.get(
"started_at")
142 self.
finished_atfinished_at = _last_job.attributes.get(
"finished_at")
143 self.
durationduration = _last_job.attributes.get(
"duration")
144 _commit = _last_job.attributes.get(
"commit")
145 self.
commit_idcommit_id = _commit.get(
"id")
146 self.
commit_datecommit_date = _commit.get(
"committed_date")
147 self.
build_idbuild_id = _last_job.attributes.get(
"id")
148 self.
branchbranch = _last_job.attributes.get(
"ref")
150 except GitlabAuthenticationError
as erra:
151 _LOGGER.error(
"Authentication Error: %s", erra)
153 except GitlabGetError
as errg:
154 _LOGGER.error(
"Project Not Found: %s", errg)
def __init__(self, gitlab_id, priv_token, interval, url)
_attr_extra_state_attributes
None __init__(self, GitLabData gitlab_data, str name)
StateType|date|datetime|Decimal native_value(self)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
def add_entities(account, async_add_entities, tracked)