Skip to content

Commit af20054

Browse files
committed
added commit to builder
1 parent 49716a7 commit af20054

File tree

7 files changed

+66
-40
lines changed

7 files changed

+66
-40
lines changed

readthedocs/api/v2/views/integrations.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ def get_external_version_response(self, project):
219219
project, identifier, verbose_name
220220
)
221221
# returns external version verbose_name (pull/merge request number)
222-
to_build = build_external_version(project, external_version)
222+
to_build = build_external_version(
223+
project=project, version=external_version, commit=identifier
224+
)
223225

224226
return {
225227
'build_triggered': True,

readthedocs/core/utils/__init__.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def broadcast(type, task, args, kwargs=None, callback=None): # pylint: disable=
6060
def prepare_build(
6161
project,
6262
version=None,
63+
commit=None,
6364
record=True,
6465
force=False,
6566
immutable=True,
@@ -72,6 +73,7 @@ def prepare_build(
7273
7374
:param project: project's documentation to be built
7475
:param version: version of the project to be built. Default: ``project.get_default_version()``
76+
:param commit: commit sha of the version required for sending build status reports
7577
:param record: whether or not record the build in a new Build object
7678
:param force: build the HTML documentation even if the files haven't changed
7779
:param immutable: whether or not create an immutable Celery signature
@@ -102,6 +104,7 @@ def prepare_build(
102104
kwargs = {
103105
'record': record,
104106
'force': force,
107+
'commit': commit,
105108
}
106109

107110
if record:
@@ -131,11 +134,11 @@ def prepare_build(
131134
options['soft_time_limit'] = time_limit
132135
options['time_limit'] = int(time_limit * 1.2)
133136

134-
if build:
137+
if build and commit:
135138
# Send pending Build Status using Git Status API for External Builds.
136139
send_external_build_status(
137140
version_type=version.type, build_pk=build.id,
138-
commit=version.identifier, status=BUILD_STATUS_PENDING
141+
commit=commit, status=BUILD_STATUS_PENDING
139142
)
140143

141144
return (
@@ -149,7 +152,7 @@ def prepare_build(
149152
)
150153

151154

152-
def trigger_build(project, version=None, record=True, force=False):
155+
def trigger_build(project, version=None, commit=None, record=True, force=False):
153156
"""
154157
Trigger a Build.
155158
@@ -158,6 +161,7 @@ def trigger_build(project, version=None, record=True, force=False):
158161
159162
:param project: project's documentation to be built
160163
:param version: version of the project to be built. Default: ``latest``
164+
:param commit: commit sha of the version required for sending build status reports
161165
:param record: whether or not record the build in a new Build object
162166
:param force: build the HTML documentation even if the files haven't changed
163167
:returns: Celery AsyncResult promise and Build instance
@@ -166,6 +170,7 @@ def trigger_build(project, version=None, record=True, force=False):
166170
update_docs_task, build = prepare_build(
167171
project,
168172
version,
173+
commit,
169174
record,
170175
force,
171176
immutable=True,

readthedocs/core/views/hooks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def delete_external_version(project, identifier, verbose_name):
157157
return None
158158

159159

160-
def build_external_version(project, version):
160+
def build_external_version(project, version, commit):
161161
"""
162162
Where we actually trigger builds for external versions.
163163
@@ -173,6 +173,6 @@ def build_external_version(project, version):
173173
project.slug,
174174
version.slug,
175175
)
176-
trigger_build(project=project, version=version, force=True)
176+
trigger_build(project=project, version=version, commit=commit, force=True)
177177

178178
return version.verbose_name

readthedocs/projects/tasks.py

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ def __init__(
321321
build=None,
322322
project=None,
323323
version=None,
324+
commit=None,
324325
task=None,
325326
):
326327
self.build_env = build_env
@@ -332,6 +333,7 @@ def __init__(
332333
self.version = {}
333334
if version is not None:
334335
self.version = version
336+
self.commit = commit
335337
self.project = {}
336338
if project is not None:
337339
self.project = project
@@ -342,7 +344,7 @@ def __init__(
342344

343345
# pylint: disable=arguments-differ
344346
def run(
345-
self, version_pk, build_pk=None, record=True, docker=None,
347+
self, version_pk, build_pk=None, commit=None, record=True, docker=None,
346348
force=False, **__
347349
):
348350
"""
@@ -363,6 +365,7 @@ def run(
363365
364366
:param version_pk int: Project Version id
365367
:param build_pk int: Build id (if None, commands are not recorded)
368+
:param commit: commit sha of the version required for sending build status reports
366369
:param record bool: record a build object in the database
367370
:param docker bool: use docker to build the project (if ``None``,
368371
``settings.DOCKER_ENABLE`` is used)
@@ -379,6 +382,7 @@ def run(
379382
self.project = self.version.project
380383
self.build = self.get_build(build_pk)
381384
self.build_force = force
385+
self.commit = commit
382386
self.config = None
383387

384388
# Build process starts here
@@ -577,36 +581,42 @@ def run_build(self, docker, record):
577581
log.warning('No build ID, not syncing files')
578582

579583
if self.build_env.failed:
584+
# TODO: Send RTD Webhook notification for build failure.
580585
self.send_notifications(self.version.pk, self.build['id'])
581-
send_external_build_status(
582-
version_type=self.version.type,
583-
build_pk=self.build['id'],
584-
commit=self.build['commit'],
585-
status=BUILD_STATUS_FAILURE
586-
)
586+
587+
if self.commit:
588+
send_external_build_status(
589+
version_type=self.version.type,
590+
build_pk=self.build['id'],
591+
commit=self.commit,
592+
status=BUILD_STATUS_FAILURE
593+
)
587594
elif self.build_env.successful:
588-
send_external_build_status(
589-
version_type=self.version.type,
590-
build_pk=self.build['id'],
591-
commit=self.build['commit'],
592-
status=BUILD_STATUS_SUCCESS
593-
)
595+
# TODO: Send RTD Webhook notification for build success.
596+
if self.commit:
597+
send_external_build_status(
598+
version_type=self.version.type,
599+
build_pk=self.build['id'],
600+
commit=self.commit,
601+
status=BUILD_STATUS_SUCCESS
602+
)
594603
else:
595-
msg = 'Unhandled Build Status'
596-
send_external_build_status(
597-
version_type=self.version.type,
598-
build_pk=self.build['id'],
599-
commit=self.build['commit'],
600-
status=BUILD_STATUS_FAILURE
601-
)
602-
log.warning(
603-
LOG_TEMPLATE,
604-
{
605-
'project': self.project.slug,
606-
'version': self.version.slug,
607-
'msg': msg,
608-
}
609-
)
604+
if self.commit:
605+
msg = 'Unhandled Build Status'
606+
send_external_build_status(
607+
version_type=self.version.type,
608+
build_pk=self.build['id'],
609+
commit=self.commit,
610+
status=BUILD_STATUS_FAILURE
611+
)
612+
log.warning(
613+
LOG_TEMPLATE,
614+
{
615+
'project': self.project.slug,
616+
'version': self.version.slug,
617+
'msg': msg,
618+
}
619+
)
610620

611621
build_complete.send(sender=Build, build=self.build_env.build)
612622

readthedocs/rtd_tests/tests/test_api.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -784,12 +784,13 @@ def setUp(self):
784784
self.github_payload = {
785785
'ref': 'master',
786786
}
787+
self.commit = "ec26de721c3235aad62de7213c562f8c821"
787788
self.github_pull_request_payload = {
788789
"action": "opened",
789790
"number": 2,
790791
"pull_request": {
791792
"head": {
792-
"sha": "ec26de721c3235aad62de7213c562f8c821"
793+
"sha": self.commit
793794
}
794795
}
795796
}
@@ -932,7 +933,8 @@ def test_github_pull_request_opened_event(self, trigger_build, core_trigger_buil
932933
self.assertEqual(resp.data['project'], self.project.slug)
933934
self.assertEqual(resp.data['versions'], [external_version.verbose_name])
934935
core_trigger_build.assert_called_once_with(
935-
force=True, project=self.project, version=external_version
936+
force=True, project=self.project,
937+
version=external_version, commit=self.commit
936938
)
937939
self.assertTrue(external_version)
938940

@@ -963,7 +965,8 @@ def test_github_pull_request_reopened_event(self, trigger_build, core_trigger_bu
963965
self.assertEqual(resp.data['project'], self.project.slug)
964966
self.assertEqual(resp.data['versions'], [external_version.verbose_name])
965967
core_trigger_build.assert_called_once_with(
966-
force=True, project=self.project, version=external_version
968+
force=True, project=self.project,
969+
version=external_version, commit=self.commit
967970
)
968971
self.assertTrue(external_version)
969972

@@ -1007,7 +1010,8 @@ def test_github_pull_request_synchronize_event(self, trigger_build, core_trigger
10071010
self.assertEqual(resp.data['project'], self.project.slug)
10081011
self.assertEqual(resp.data['versions'], [external_version.verbose_name])
10091012
core_trigger_build.assert_called_once_with(
1010-
force=True, project=self.project, version=external_version
1013+
force=True, project=self.project,
1014+
version=external_version, commit=self.commit
10111015
)
10121016
# `synchronize` webhook event updated the identifier (commit hash)
10131017
self.assertNotEqual(prev_identifier, external_version.identifier)

readthedocs/rtd_tests/tests/test_config_integration.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,7 @@ def get_update_docs_task(self):
371371
build={
372372
'id': 99,
373373
'state': BUILD_STATE_TRIGGERED,
374-
'commit': 'abc859dada4faf'
375-
}
374+
},
376375
)
377376
return update_docs
378377

readthedocs/rtd_tests/tests/test_core_utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def test_trigger_build_when_version_not_provided_default_version_exist(self, upd
5252
'record': True,
5353
'force': False,
5454
'build_pk': mock.ANY,
55+
'commit': None
5556
}
5657

5758
update_docs_task.signature.assert_called_with(
@@ -74,6 +75,7 @@ def test_trigger_build_when_version_not_provided_default_version_doesnt_exist(se
7475
'record': True,
7576
'force': False,
7677
'build_pk': mock.ANY,
78+
'commit': None
7779
}
7880

7981
update_docs_task.signature.assert_called_with(
@@ -92,6 +94,7 @@ def test_trigger_custom_queue(self, update_docs):
9294
'record': True,
9395
'force': False,
9496
'build_pk': mock.ANY,
97+
'commit': None
9598
}
9699
options = {
97100
'queue': 'build03',
@@ -113,6 +116,7 @@ def test_trigger_build_time_limit(self, update_docs):
113116
'record': True,
114117
'force': False,
115118
'build_pk': mock.ANY,
119+
'commit': None
116120
}
117121
options = {
118122
'queue': mock.ANY,
@@ -135,6 +139,7 @@ def test_trigger_build_invalid_time_limit(self, update_docs):
135139
'record': True,
136140
'force': False,
137141
'build_pk': mock.ANY,
142+
'commit': None
138143
}
139144
options = {
140145
'queue': mock.ANY,
@@ -157,6 +162,7 @@ def test_trigger_build_rounded_time_limit(self, update_docs):
157162
'record': True,
158163
'force': False,
159164
'build_pk': mock.ANY,
165+
'commit': None
160166
}
161167
options = {
162168
'queue': mock.ANY,

0 commit comments

Comments
 (0)