ci: рабочие процессы разбираются, а не сверяются по подстрокам - #156
Merged
Merged
Conversation
Линтера рабочих процессов не было ни одного. Это заметили, когда правка унесла заголовок работы `publish` из `release.yml`: `audit-native` и `audit-draft` остались с `needs: publish`, указывающим в пустоту, — GitHub такой файл не запускает вовсе, то есть релиз было не выпустить. Оба набора тестов при этом остались зелёными, потому что сверяли подстроки, а строка `needs: [publish, audit-native]` никуда не делась; делась работа. Появляются две проверки, и обе блокирующие. `actionlint` в работе `contract` на ubuntu разбирает все файлы целиком: синтаксис, имена контекстов и выражений, а вместе с доступным на раннере `shellcheck` — ещё и содержимое `run:`. Версия и сумма зафиксированы в дереве по той же причине, что и у cargo-deny: гейт блокирующий, и плавающий инструмент краснел бы без единой правки рабочего процесса. Через `uses:` его не поставить — `taiki-e/install-action` actionlint не поддерживает, а закрепление образа по digest нарушило бы правило про сорокасимвольный SHA. `test_every_workflow_job_graph_resolves` проверяет то же самое устройство, но не зависит ни от сети, ни от внешнего двоичного файла: каждая работа имеет шаги, и каждая названная в `needs` существует. Разбор идёт по отступам, без PyYAML: в CI нет ни одного `pip install`, и завезённый ради одной проверки импорт уже ронял обе работы Happy Path. Разбор сверен с PyYAML на всех трёх файлах — состав работ совпадает. Обе проверены пробой: снятый заголовок `publish` роняет примету и даёт actionlint две ошибки `job-needs`. Шаг установки прогнан целиком — адрес, сумма, имя файла в архиве, извлечение.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Почему
Линтера рабочих процессов не было ни одного:
git grep -i 'actionlint\|yamllint'по.github,Makefile.toml,testsиscriptsне находил ничего.Это заметили, когда правка на #155 унесла заголовок работы
publishизrelease.yml.audit-nativeиaudit-draftостались сneeds: publish, указывающим в пустоту. GitHub такой файл не запускает вовсе — релиз было не выпустить.Оба набора тестов при этом остались зелёными: они сверяют подстроки, а строка
needs: [publish, audit-native]никуда не делась. Делась работа.Что добавляется
Две проверки, обе блокирующие.
actionlintв работеcontract(ubuntu) разбирает все файлы целиком: синтаксис, имена контекстов и выражений, а вместе с доступным на раннереshellcheck— ещё и содержимоеrun:.test_every_workflow_job_graph_resolvesпроверяет то же устройство, но без сети и внешнего двоичного файла: у каждой работы есть шаги, и каждая названная вneedsсуществует. По всем файлам в.github/workflows/, не только поrelease.yml.Два отступления от постановки
Инструмент ставится не через
uses:.taiki-e/install-action, которым репозиторий ставитcargo-makeиcargo-deny, actionlint не поддерживает — в егоmanifests/такого файла нет. Закрепить образdocker://rhysd/actionlint@sha256:…тоже нельзя:test_all_actions_are_pinned_to_full_commit_shaтребует ровно сорок шестнадцатеричных символов, а digest в эту форму не укладывается. Поэтому двоичный файл скачивается с закреплённой версией и сверяется по SHA-256, зафиксированной в дереве, — по той же причине, по которой пинится версия cargo-deny.PyYAML не используется. В постановке предложено
yaml.safe_load, но в CI нет ни одногоpip install, и этот импорт уже ронял обе работы Happy Path час назад, когда я завёл его ради одной проверки. Структура читается разбором отступов — так же, как реестр читает своё front matter. Разбор сверен с PyYAML на всех трёх файлах: состав работ совпадает.Проверки
actionlint .github/workflows/*.yml— чисто, включая сам изменённыйci.ymlpython3 tests/release_governance.py— 18 passedpython3 tests/release_assets.py— 11 passedpublishроняет примету и даёт actionlint две ошибкиjob-needs8aca8db9…), имя файла в архиве, извлечение — статический ELF x86-64Существующие файлы гейт проходят:
shellcheckлокально установлен той же версии, что на раннере, и претензий кrun:-блокам нет. Блоковshell: pythonв репозитории нет, так чтоpyflakesв игру не вступает.Что надо знать ревьюеру
Ветка от master, сам сломанный
publish:здесь не чинится — это сделано на #155. Если #155 вольётся первым, actionlint на master подтвердит, что там всё цело.На #155 живёт более узкая версия той же приметы, только для
release.yml. Имена у функций разные, так что слияние пройдёт без конфликта, но после вливания обеих узкую стоит убрать как поглощённую — сделаю отдельной правкой.