From eb48e1860619684190d76e6c4e687b4113205372 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Fri, 21 Aug 2026 23:34:34 +0500 Subject: [PATCH] =?UTF-8?q?ci(links):=20CONTENT-329=20=D0=B5=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D1=81=D1=8B?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=20=D1=81=D0=BE=20=D1=81=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC=20issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/links.yml | 64 +++++++++++++++++++++++++++++++++++++ .lycheeignore | 18 +++++++++++ 2 files changed, 82 insertions(+) create mode 100644 .github/workflows/links.yml create mode 100644 .lycheeignore diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml new file mode 100644 index 0000000..768e92d --- /dev/null +++ b/.github/workflows/links.yml @@ -0,0 +1,64 @@ +name: Links + +on: + workflow_dispatch: + schedule: + - cron: "0 7 * * 1" # понедельник, 10:00 МСК + +permissions: + contents: read + issues: write + +jobs: + linkChecker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: lycheeverse/lychee-action@v2 + id: lychee + with: + args: >- + --no-progress --root-dir "$GITHUB_WORKSPACE" + --accept 200,206,403,429 --max-retries 3 --timeout 30 + --user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36" + --cache --max-cache-age 1d + 'docs/**/*.md' + fail: false + format: markdown + output: lychee/report.md + + - name: Обновить сводный issue + env: + GH_TOKEN: ${{ github.token }} + EXIT_CODE: ${{ steps.lychee.outputs.exit_code }} + run: | + set -euo pipefail + + if [ "$EXIT_CODE" = "0" ]; then + title="Ссылки: все живы, проверено $(date +%d.%m.%Y)" + else + title="Ссылки: есть мёртвые, проверено $(date +%d.%m.%Y)" + fi + + { + cat lychee/report.md + echo + echo "---" + echo + echo "Отчёт перезаписывается каждым прогоном \`.github/workflows/links.yml\`." + echo "Последний прогон: [$GITHUB_RUN_ID]($GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID)." + } > body.md + + gh label create link-check --color 0e8a16 --description "Сводка проверки ссылок" --force + + number=$(gh issue list --label link-check --state all --limit 1 --json number --jq '.[0].number // empty') + + if [ -z "$number" ]; then + gh issue create --title "$title" --label link-check --body-file body.md + else + gh issue edit "$number" --title "$title" --body-file body.md + if [ "$(gh issue view "$number" --json state --jq .state)" = "CLOSED" ] && [ "$EXIT_CODE" != "0" ]; then + gh issue reopen "$number" + fi + fi diff --git a/.lycheeignore b/.lycheeignore new file mode 100644 index 0000000..f736aa6 --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,18 @@ +# Статика Docusaurus живёт в static/, а ссылки на неё абсолютные (/img/...), +# поэтому от корня репозитория такие файлы не находятся. Битые пути внутри +# сайта ловит сама сборка: onBrokenLinks: 'throw' в docusaurus.config.ts. +^file://.*/img/ + +# Ozon отвечает бесконечной цепочкой 307 всему, что не браузер. +ozon\.ru + +# Реферальная ссылка DigitalOcean: 400 на любой запрос без браузерных заголовков. +m\.do\.co + +# Наши короткие ссылки на карточки книг ведут в Ozon, а он зацикливает 307. +ru\.hexlet\.io/link/ + +# Сертификаты от национального УЦ: curl и lychee видят ошибку TLS, +# в браузере сайт открывается. +tinkoff\.ru +sberbank\.com