fix(ci): build and publish images for linux/arm64 - #28
Merged
Conversation
Опубликованный манифест hexletcomponents/devops-example-app содержал только linux/amd64. На Apple Silicon образ идёт через эмуляцию и Docker печатает предупреждение о несовпадении платформы, а при отключённой Rosetta запуск падает. Образ используется в уроках 300 и 600 курса docker_basics_course, и это первое, что студент вообще запускает. Причина была не в отсутствии настройки, а в том, что CI не пользовался тем, что уже настроено. В main.yml стоят setup-qemu-action и setup-buildx-action, но у шагов публикации не задан platforms, поэтому build-push-action собирал только под архитектуру раннера, то есть amd64. Мультиарх-команда в репозитории была — цель docker-push в Makefile, — но CI её не вызывает. Добавлен platforms: linux/amd64,linux/arm64 обоим шагам публикации, приложению и caddy. Шаг «Build and export to Docker» не тронут: у него load: true, а он с несколькими платформами не работает и нужен только для прогона тестов. Отдельно release.yml. Он собирал версионный тег через pull, tag и push, а этот паттерн схлопывает мультиарх: pull забирает образ только под платформу раннера. То есть даже с починенным main.yml теги v* остались бы однoархитектурными. Заменено на docker buildx imagetools create, который работает с манифестом в реестре, а не со скачанным образом. Оба Dockerfile архитектурно нейтральны: node:26-slim и caddy мультиарховые, пиновок под amd64 нет. Сборка под arm64 локально не проверялась — на машине не зарегистрирован binfmt, эмуляцию на раннере поднимает setup-qemu-action.
imagetools-команды влезают в одну строку, комментарий сокращён до причины. Закомментированные uses в release.yml удалены: checkout, qemu и buildx этой джобе не нужны, а рядом с новой правкой они читаются как незаконченный шаг. Цель docker-push в Makefile мертва: публикацию делает CI, и после правки он собирает обе платформы сам. Комментарий про запуск x86-образа на ARM снят вместе с ней — образ мультиарховый. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
У события create фильтр tags игнорируется: воркфлоу срабатывал и на создание ветки, а github.ref_name тогда равен её имени. Так на Docker Hub попали теги content-326-multiarch-images, remove-biome, fix-main-ci и fix-stop-server — у обоих образов. У push фильтр по тегам работает. Мусорные теги удаляются в Docker Hub руками, воркфлоу их не трогает. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Тикет: CONTENT-326, выделен из CONTENT-324 — актуализации курса «Docker».
Проблема
Опубликованный манифест содержит только
linux/amd64:linux/arm64нет. На Apple Silicon образ идёт через эмуляцию, Docker печатает предупреждение о несовпадении платформы, а при отключённой Rosetta запуск падает. Образ используется в уроках 300 и 600 курсаdocker_basics_course— это первое, что студент вообще запускает в курсе, и проходят курс в основном на macOS.Причина не в отсутствии настройки
Настройка под мультиарх в репозитории уже была, ей просто никто не пользовался.
В
main.ymlстоятsetup-qemu-actionиsetup-buildx-action, но у шагов публикации не заданplatforms. Без негоbuild-push-actionсобирает только под архитектуру раннера, то естьubuntu-latest→ amd64. QEMU и buildx стоят рядом и не используются.Мультиарх-команда в репозитории тоже есть — цель
docker-pushвMakefile:Но CI её не вызывает: публикация идёт через
build-push-action. По отношению к опубликованному образу эта цель мертва, она осталась для ручного пуша.Что изменено
1.
main.yml—platformsобоим шагам публикации, приложению и caddy.Шаг «Build and export to Docker» намеренно не тронут: у него
load: true, аloadс несколькими платформами не работает. Он нужен только чтобы прогнатьmake compose-test-ciиmake compose-lint-ciперед публикацией, и остаётся однoплатформенным.2.
release.yml—imagetools createвместоpull/tag/push.Это вторая, менее заметная половина проблемы. Версионный тег собирался так:
docker pullзабирает образ только под платформу раннера, поэтому re-tag и push публикуют однoархитектурный образ. То есть даже с починеннымmain.ymlтегиv*остались бы amd64-only: этот паттерн схлопывает мультиарх-манифест.docker buildx imagetools createработает с манифестом в реестре, а не со скачанным образом, поэтому переносит все платформы.Проверено
node:26-slimиcaddyмультиарховые, пиновок под amd64 или имён артефактов видаx86_64нет. У caddy-образа вообще толькоCOPYyq)binfmtдля arm64, а регистрировать его — правка хостовой системы. На раннере эмуляцию поднимаетsetup-qemu-action, который в workflow уже есть. Фактическую проверку даст этот CI-прогонПриёмка
После мержа и прогона
main:docker buildx imagetools inspect hexletcomponents/devops-example-app:latestдолжен показать и
linux/amd64, иlinux/arm64. То же дляhexletcomponents/devops-example-caddy.Смежное, за пределами этого PR
За время, пока курс не трогали, образ уже пересобирали:
CMDсталbin/start.sh, флаг Fastify-Pстал-o, поменялся формат лога. Выводы уроков 300 и 600 под это подтянуты в CONTENT-324. Если после мержа образ соберётся заново и что-то из этого изменится — стоит сверить уроки ещё раз.