Spaces:
Build error
Build error
fix ci errors
Browse files- src/gradio_space_ci/webhook.py +29 -34
src/gradio_space_ci/webhook.py
CHANGED
|
@@ -30,7 +30,7 @@ from huggingface_hub import (
|
|
| 30 |
upload_folder,
|
| 31 |
delete_space_secret,
|
| 32 |
delete_space_variable,
|
| 33 |
-
delete_space_storage
|
| 34 |
)
|
| 35 |
from huggingface_hub.repocard import RepoCard
|
| 36 |
from huggingface_hub.utils import (
|
|
@@ -248,22 +248,33 @@ async def trigger_ci_on_pr(payload: WebhookPayload, task_queue: BackgroundTasks)
|
|
| 248 |
space_id = payload.repo.name
|
| 249 |
|
| 250 |
has_task = False
|
| 251 |
-
|
| 252 |
-
pr_num = payload.discussion.num
|
| 253 |
-
details = get_discussion_details(repo_id=space_id, repo_type="space", discussion_num=pr_num)
|
| 254 |
-
event_author = details.events[-1]._event["author"]["name"] # username of that event
|
| 255 |
-
|
| 256 |
if (
|
| 257 |
-
# Means "a new PR has been opened"
|
| 258 |
payload.event.scope.startswith("discussion")
|
| 259 |
and payload.event.action == "create"
|
| 260 |
and payload.discussion is not None
|
| 261 |
and payload.discussion.isPullRequest
|
| 262 |
and payload.discussion.status == "open"
|
| 263 |
):
|
| 264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 265 |
# New PR! Sync task scheduled
|
| 266 |
-
task_queue.add_task(sync_ci_space, space_id=space_id, pr_num=
|
| 267 |
has_task = True
|
| 268 |
elif (
|
| 269 |
# Means "a PR has been merged or closed"
|
|
@@ -276,7 +287,7 @@ async def trigger_ci_on_pr(payload: WebhookPayload, task_queue: BackgroundTasks)
|
|
| 276 |
task_queue.add_task(
|
| 277 |
delete_ci_space,
|
| 278 |
space_id=space_id,
|
| 279 |
-
pr_num=
|
| 280 |
)
|
| 281 |
has_task = True
|
| 282 |
elif (
|
|
@@ -287,30 +298,15 @@ async def trigger_ci_on_pr(payload: WebhookPayload, task_queue: BackgroundTasks)
|
|
| 287 |
# => loop through all PRs and check if new changes happened
|
| 288 |
for discussion in get_repo_discussions(repo_id=space_id, repo_type="space"):
|
| 289 |
if discussion.is_pull_request and discussion.status == "open":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 290 |
if not is_pr_synced(space_id=space_id, pr_num=discussion.num):
|
| 291 |
# Found a PR that is not yet synced
|
| 292 |
-
if event_author not in EPHEMERAL_SPACES_CONFIG["trusted_authors"] :
|
| 293 |
-
# if change by untrusted author unset config
|
| 294 |
-
unset_config(space_id=space_id,pr_num=pr_num)
|
| 295 |
task_queue.add_task(sync_ci_space, space_id=space_id, pr_num=discussion.num)
|
| 296 |
has_task = True
|
| 297 |
-
if (
|
| 298 |
-
# Means comment by a trusted author
|
| 299 |
-
payload.event.scope == "discussion.comment"
|
| 300 |
-
and payload.event.action == "create"
|
| 301 |
-
and payload.discussion.isPullRequest
|
| 302 |
-
and payload.discussion.status == "open"
|
| 303 |
-
and event_author in EPHEMERAL_SPACES_CONFIG["trusted_authors"]
|
| 304 |
-
):
|
| 305 |
-
print("Comment detected with content:\n", payload.comment.content)
|
| 306 |
-
if payload.comment.content == "/trust_pr":
|
| 307 |
-
print("trusting pr ...")
|
| 308 |
-
set_config(space_id=space_id,pr_num=pr_num)
|
| 309 |
-
print("pr has been trusted")
|
| 310 |
-
elif payload.comment.content == "/untrust_pr":
|
| 311 |
-
print("untrusting pr ...")
|
| 312 |
-
unset_config(space_id=space_id,pr_num=pr_num)
|
| 313 |
-
print("pr has been untrusted")
|
| 314 |
|
| 315 |
if has_task:
|
| 316 |
return Response("Task scheduled to sync/delete Space", status_code=status.HTTP_202_ACCEPTED)
|
|
@@ -503,16 +499,15 @@ def unset_config(space_id: str, pr_num: int) -> None:
|
|
| 503 |
variables: Dict[str, str] = EPHEMERAL_SPACES_CONFIG["variables"]
|
| 504 |
secrets: Dict[str, str] = EPHEMERAL_SPACES_CONFIG["secrets"]
|
| 505 |
# Unset space variables and secrets
|
| 506 |
-
for key
|
| 507 |
delete_space_variable(ci_space_id, key)
|
| 508 |
-
for key in secrets.keys():
|
| 509 |
delete_space_secret(ci_space_id, key)
|
| 510 |
# Reset hardware
|
| 511 |
-
request_space_hardware(ci_space_id,SpaceHardware.CPU_BASIC)
|
| 512 |
delete_space_storage(ci_space_id)
|
| 513 |
|
| 514 |
|
| 515 |
-
|
| 516 |
NOTIFICATION_TEMPLATE_CREATED_AND_CONFIGURED = """\
|
| 517 |
Following the creation of this PR, an ephemeral Space [{ci_space_id}](https://huggingface.co/spaces/{ci_space_id}) has been started. Any changes pushed to this PR will be synced with the test Space.
|
| 518 |
Since this PR has been created by a trusted author, the ephemeral Space has been configured with the correct hardware, storage, and secrets.
|
|
|
|
| 30 |
upload_folder,
|
| 31 |
delete_space_secret,
|
| 32 |
delete_space_variable,
|
| 33 |
+
delete_space_storage,
|
| 34 |
)
|
| 35 |
from huggingface_hub.repocard import RepoCard
|
| 36 |
from huggingface_hub.utils import (
|
|
|
|
| 248 |
space_id = payload.repo.name
|
| 249 |
|
| 250 |
has_task = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
if (
|
| 252 |
+
# Means "a new PR has been opened" or a new comment
|
| 253 |
payload.event.scope.startswith("discussion")
|
| 254 |
and payload.event.action == "create"
|
| 255 |
and payload.discussion is not None
|
| 256 |
and payload.discussion.isPullRequest
|
| 257 |
and payload.discussion.status == "open"
|
| 258 |
):
|
| 259 |
+
# A comment, is it by a trusted author ?
|
| 260 |
+
if payload.event.scope == "discussion.comment":
|
| 261 |
+
pr_num = payload.discussion.num
|
| 262 |
+
details = get_discussion_details(repo_id=space_id, repo_type="space", discussion_num=pr_num)
|
| 263 |
+
event_author = details.events[-1]._event["author"]["name"] # username of that event
|
| 264 |
+
if event_author in EPHEMERAL_SPACES_CONFIG["trusted_authors"]:
|
| 265 |
+
print("Comment detected with content:\n", payload.comment.content)
|
| 266 |
+
if payload.comment.content == "/trust_pr":
|
| 267 |
+
print("trusting pr ...")
|
| 268 |
+
set_config(space_id=space_id, pr_num=pr_num)
|
| 269 |
+
print("pr has been trusted")
|
| 270 |
+
elif payload.comment.content == "/untrust_pr":
|
| 271 |
+
print("untrusting pr ...")
|
| 272 |
+
unset_config(space_id=space_id, pr_num=pr_num)
|
| 273 |
+
print("pr has been untrusted")
|
| 274 |
+
# Always sync (in case the space was sleeping or building)
|
| 275 |
+
if not is_pr_synced(space_id=space_id, pr_num=payload.discussion.num):
|
| 276 |
# New PR! Sync task scheduled
|
| 277 |
+
task_queue.add_task(sync_ci_space, space_id=space_id, pr_num=payload.discussion.num)
|
| 278 |
has_task = True
|
| 279 |
elif (
|
| 280 |
# Means "a PR has been merged or closed"
|
|
|
|
| 287 |
task_queue.add_task(
|
| 288 |
delete_ci_space,
|
| 289 |
space_id=space_id,
|
| 290 |
+
pr_num=payload.discussion.num,
|
| 291 |
)
|
| 292 |
has_task = True
|
| 293 |
elif (
|
|
|
|
| 298 |
# => loop through all PRs and check if new changes happened
|
| 299 |
for discussion in get_repo_discussions(repo_id=space_id, repo_type="space"):
|
| 300 |
if discussion.is_pull_request and discussion.status == "open":
|
| 301 |
+
# Was the pr updated by an untrusted author ?
|
| 302 |
+
event_author = discussion._event["author"]["name"] # username of that event
|
| 303 |
+
if event_author not in EPHEMERAL_SPACES_CONFIG["trusted_authors"]:
|
| 304 |
+
# Untrusted author, we unset the config as part or security reasons
|
| 305 |
+
unset_config(space_id=space_id, pr_num=discussion.num)
|
| 306 |
if not is_pr_synced(space_id=space_id, pr_num=discussion.num):
|
| 307 |
# Found a PR that is not yet synced
|
|
|
|
|
|
|
|
|
|
| 308 |
task_queue.add_task(sync_ci_space, space_id=space_id, pr_num=discussion.num)
|
| 309 |
has_task = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 310 |
|
| 311 |
if has_task:
|
| 312 |
return Response("Task scheduled to sync/delete Space", status_code=status.HTTP_202_ACCEPTED)
|
|
|
|
| 499 |
variables: Dict[str, str] = EPHEMERAL_SPACES_CONFIG["variables"]
|
| 500 |
secrets: Dict[str, str] = EPHEMERAL_SPACES_CONFIG["secrets"]
|
| 501 |
# Unset space variables and secrets
|
| 502 |
+
for key in variables.keys():
|
| 503 |
delete_space_variable(ci_space_id, key)
|
| 504 |
+
for key in secrets.keys():
|
| 505 |
delete_space_secret(ci_space_id, key)
|
| 506 |
# Reset hardware
|
| 507 |
+
request_space_hardware(ci_space_id, SpaceHardware.CPU_BASIC)
|
| 508 |
delete_space_storage(ci_space_id)
|
| 509 |
|
| 510 |
|
|
|
|
| 511 |
NOTIFICATION_TEMPLATE_CREATED_AND_CONFIGURED = """\
|
| 512 |
Following the creation of this PR, an ephemeral Space [{ci_space_id}](https://huggingface.co/spaces/{ci_space_id}) has been started. Any changes pushed to this PR will be synced with the test Space.
|
| 513 |
Since this PR has been created by a trusted author, the ephemeral Space has been configured with the correct hardware, storage, and secrets.
|