mirror of
https://github.com/Cheviiot/Nivora.git
synced 2026-08-03 15:51:12 +00:00
feat: create autonomous Nivora package repository
Maintain a validated cross-distribution package catalog. Automate upstream updates, isolated builds, diagnostics, and direct publication. Build the official GitHub Desktop sources for Linux with working OAuth.
This commit is contained in:
Executable
+68
@@ -0,0 +1,68 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
results_dir="${AUTONOMOUS_UPDATE_RESULTS_DIR:?AUTONOMOUS_UPDATE_RESULTS_DIR is required}"
|
||||
repository="${GITHUB_REPOSITORY:?GITHUB_REPOSITORY is required}"
|
||||
run_url="https://github.com/${repository}/actions/runs/${GITHUB_RUN_ID:?GITHUB_RUN_ID is required}"
|
||||
issues_json="$(
|
||||
gh api --paginate --slurp \
|
||||
"repos/${repository}/issues?state=all&per_page=100"
|
||||
)"
|
||||
code_fence='```'
|
||||
|
||||
find_issue() {
|
||||
local marker="$1"
|
||||
jq -r --arg marker "$marker" '
|
||||
[
|
||||
.[][]
|
||||
| select(has("pull_request") | not)
|
||||
| select((.body // "") | contains($marker))
|
||||
][0].number // empty
|
||||
' <<<"$issues_json"
|
||||
}
|
||||
|
||||
while IFS=$'\t' read -r package phase; do
|
||||
[[ -n "$package" ]] || continue
|
||||
marker="<!-- nivora-autonomous-update:${package} -->"
|
||||
issue_number="$(find_issue "$marker")"
|
||||
report="${results_dir}/${package}/issue-body.md"
|
||||
{
|
||||
printf '%s\n\n' "$marker"
|
||||
printf 'Автономное обновление пакета **%s** остановлено на фазе **%s**.\n\n' \
|
||||
"$package" "$phase"
|
||||
printf -- '- Последний запуск: %s\n' "$run_url"
|
||||
printf -- '- Диагностика Actions хранится 30 дней в artifact запуска.\n'
|
||||
printf -- '- Остальные пакеты обновляются независимо от этого сбоя.\n\n'
|
||||
printf '### Состояние\n\n%stext\n' "$code_fence"
|
||||
sed -n '1,80p' "${results_dir}/${package}/FAILED"
|
||||
printf '%s\n\n### Последние строки журнала\n\n%stext\n' \
|
||||
"$code_fence" "$code_fence"
|
||||
tail -n 80 "${results_dir}/${package}/update.log" 2>/dev/null || true
|
||||
printf '%s\n\n### Изменения рецепта\n\n%sdiff\n' \
|
||||
"$code_fence" "$code_fence"
|
||||
sed -n '1,200p' "${results_dir}/${package}/failed.patch" \
|
||||
2>/dev/null || true
|
||||
printf '%s\n' "$code_fence"
|
||||
} >"$report"
|
||||
|
||||
if [[ -n "$issue_number" ]]; then
|
||||
gh api --method PATCH "repos/${repository}/issues/${issue_number}" \
|
||||
-f state=open \
|
||||
-f body="$(<"$report")" >/dev/null
|
||||
else
|
||||
gh api --method POST "repos/${repository}/issues" \
|
||||
-f title="[autoupdate] ${package}: требуется диагностика" \
|
||||
-f body="$(<"$report")" >/dev/null
|
||||
fi
|
||||
done <"${results_dir}/failed-packages"
|
||||
|
||||
while IFS= read -r package; do
|
||||
[[ -n "$package" ]] || continue
|
||||
marker="<!-- nivora-autonomous-update:${package} -->"
|
||||
issue_number="$(find_issue "$marker")"
|
||||
if [[ -n "$issue_number" ]]; then
|
||||
gh api --method PATCH "repos/${repository}/issues/${issue_number}" \
|
||||
-f state=closed \
|
||||
-f state_reason=completed >/dev/null
|
||||
fi
|
||||
done <"${results_dir}/successful-packages"
|
||||
Reference in New Issue
Block a user