Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 4 additions & 18 deletions backend/routes/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,15 +185,14 @@ async def trigger_workflow_get(
repo: str = Query(None),
workflow_id: str = Query(None),
ref: str = Query("main"),
tests: str = Query(None),
ui: bool = Query(False)
):
"""
GET endpoint для запуска workflow через URL

Примеры:
- /workflow/trigger?owner=naspirato&repo=my-repo&workflow_id=ci.yml
- /workflow/trigger?owner=naspirato&repo=my-repo&workflow_id=ci.yml&ref=main&tests=unit,integration
- /workflow/trigger?owner=naspirato&repo=my-repo&workflow_id=ci.yml&ref=main
"""
# Определяем режим (UI или JSON)
accept_header = request.headers.get("Accept", "")
Expand All @@ -218,15 +217,11 @@ async def trigger_workflow_get(

# Добавляем все остальные параметры (workflow inputs)
query_params = dict(request.query_params)
excluded_params = {"owner", "repo", "workflow_id", "ref", "ui", "tests", "return_url"}
excluded_params = {"owner", "repo", "workflow_id", "ref", "ui", "return_url"}
for key, value in query_params.items():
if key not in excluded_params and value:
params.append(f"{key}={value}")

# Если есть tests, добавляем его
if tests:
params.append(f"tests={tests}")

query_string = "&".join(params)
return RedirectResponse(url=f"/?{query_string}")

Expand Down Expand Up @@ -272,10 +267,6 @@ async def trigger_workflow_get(
if key not in excluded_params and value:
inputs[key] = value

# Если есть tests (для обратной совместимости)
if tests:
inputs["tests"] = tests

return await _trigger_and_show_result(
request, owner, repo, workflow_id, ref, inputs, return_json, return_url
)
Expand All @@ -287,8 +278,7 @@ async def trigger_workflow_post(
owner: str = Form(None),
repo: str = Form(None),
workflow_id: str = Form(None),
ref: str = Form("main"),
tests: str = Form("")
ref: str = Form("main")
):
"""
POST endpoint для запуска workflow из формы
Expand Down Expand Up @@ -324,7 +314,7 @@ async def trigger_workflow_post(
inputs = {}

# Обрабатываем все поля кроме служебных
excluded_fields = {"owner", "repo", "workflow_id", "ref", "tests", "return_url"}
excluded_fields = {"owner", "repo", "workflow_id", "ref", "return_url"}
for key, value in form_data.items():
if key not in excluded_fields:
# Обработка boolean полей - если значение есть, используем его
Expand All @@ -335,10 +325,6 @@ async def trigger_workflow_post(
inputs[key] = value
# Если значение пустое, но это может быть необязательное поле - пропускаем

# Если есть tests (для обратной совместимости)
if tests:
inputs["tests"] = tests

return await _trigger_and_show_result(
request, owner, repo, workflow_id, ref, inputs, return_json=False, return_url=return_url
)
Expand Down
20 changes: 19 additions & 1 deletion frontend/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ <h1>Run GitHub Action</h1>
const workflowInputs = {};

// Список служебных параметров, которые не являются workflow inputs
const excludedParams = ['owner', 'repo', 'workflow_id', 'ref', 'ui', 'tests'];
const excludedParams = ['owner', 'repo', 'workflow_id', 'ref', 'ui', 'return_url'];

// Извлекаем все параметры кроме служебных
for (const [key, value] of urlParams.entries()) {
Expand Down Expand Up @@ -1000,6 +1000,24 @@ <h1>Run GitHub Action</h1>

// Инициализация при загрузке
function initAll() {
// Инициализируем скрытое поле return_url из URL параметров, если его нет
const form = document.getElementById('workflowForm');
if (form) {
const urlParams = new URLSearchParams(window.location.search);
const returnUrlFromUrl = urlParams.get('return_url');
if (returnUrlFromUrl) {
let returnUrlInput = form.querySelector('input[name="return_url"]');
if (!returnUrlInput) {
// Создаем скрытое поле, если его нет
returnUrlInput = document.createElement('input');
returnUrlInput.type = 'hidden';
returnUrlInput.name = 'return_url';
form.insertBefore(returnUrlInput, form.firstChild);
}
returnUrlInput.value = returnUrlFromUrl;
}
}

initSearchableSelect('workflow_search', 'workflow_id', 'workflow_dropdown');
initSearchableSelect('branch_search', 'ref', 'branch_dropdown');
setupRepositoryField();
Expand Down
4 changes: 2 additions & 2 deletions frontend/templates/result.html
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ <h2>Success</h2>
<div class="action-links" style="display: flex; margin-top: 12px;">
{% if return_url %}
<a href="{{ return_url }}" target="_blank" class="btn btn-secondary">
← Back
← Back to PR
</a>
{% endif %}
{% if workflow_url %}
Expand Down Expand Up @@ -124,7 +124,7 @@ <h2>Error</h2>
<div class="action-links">
{% if return_url %}
<a href="{{ return_url }}" target="_blank" class="btn btn-secondary">
← Back
← Back to PR
</a>
{% endif %}
{% if owner and repo and workflow_id %}
Expand Down