Как стать автором
Обновить

Техникум: Автоматическое Aрхивирование Aртефактов

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров1.5K

В программировании микроконтроллеров на электронных платах на выходе всегда получается довольно много артефактов. Это прошивка, документация, отладочная инфа.

По мере возможности всё это добро надо как-то связать и заточить в один архив, чтобы всегда можно было ассоциировать .hex с нужным для него .map и .elf. Также один архив очень удобен при транспортировке программного обеспечения железнодорожными видами транспорта ).

Логичным шагом будет являться архивация всех этих файликов в *.tar архив, чтобы всё это не рассыпалось по жесткому диску.

Терминология

Артефакты (Artifact) в контексте программирования микроконтроллеров артефакты - это то полезное, что кристаллизируется на выходе tool chain(а). В самом общем случае это

Расширение

type

Назначение

1

*.hex

text

бинарный образ прошивки в ASCI символах

2

*.bin

bin

Бинарный образ прошивки

3

*.elf

bin

образ с отладочными символами для пошаговой отладки

4

*.map

text

спецификация разметки памяти

5

*.gv

text

граф зависимостей программных компонентов на Graphviz

6

?

?

doxygen документация на ПО

7

*.fw

bin

бинарь прошивки с цифровой подписью

8

...

...

прочее

Фактически артефакты - это и есть результат работы программиста микроконтроллера для бизнеса.

Некоторые также называют артефакты словом дистрибутив.

Постановка задачи

Надо реализовать автоматическую архивацию артефактов прошивки. Написать один общий для всех проектов make скрипт для упаковки артефактов. Вмонтировать это действие в общий конвейер сборки любого проекта из репозитория.

Реализация

Для этого можно воспользоваться классической утилитой tar. Это консольная утилита для архивирования файлов. Вот её справка.

tar -h
tar(bsdtar): manipulate archive files
First option must be a mode specifier:
  -c Create  -r Add/Replace  -t List  -u Update  -x Extract
Common Options:
  -b #  Use # 512-byte records per I/O block
  -f <filename>  Location of archive (default \\.\tape0)
  -v    Verbose
  -w    Interactive
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
  <file>, <dir>  add these items to archive
  -z, -j, -J, --lzma  Compress archive with gzip/bzip2/xz/lzma
  --format {ustar|pax|cpio|shar}  Select archive format
  --exclude <pattern>  Skip files that match pattern
  -C <dir>  Change to <dir> before processing remaining files
  @<archive>  Add entries from <archive> to output
List: tar -t [options] [<patterns>]
  <patterns>  If specified, list only entries that match
Extract: tar -x [options] [<patterns>]
  <patterns>  If specified, extract only entries that match
  -k    Keep (don't overwrite) existing files
  -m    Don't restore modification times
  -O    Write entries to stdout, don't restore to disk
  -p    Restore permissions (including ACLs, owner, file flags)
bsdtar 3.5.2 - libarchive 3.5.2 zlib/1.2.5.f-ipp

Нам понадобятся только вот эти опции утилиты tar

ключ

назначение

-?

показать короткую справку по ключам утилиты

-f

путь и имя результирующего файла архива

-v

Активировать логирование. Показать что именно будет заархивированно.

--version

показать версию программы

Префикс после которого через пробел надо перечислить полные пути к тем файлам, которые мы хотим поместить в архив

Надо организовать вот такой конвейер обработки файлов

Для начала поэкспериментируем в windows cmd. Вот этим скриптом в принципе можно решить задачу.

echo off
cls

set project_name=boardname_appname_m
set project_dir=%cd%
set artefact_dir=%project_dir%\build
echo project_dir=%project_dir%

set FILES_TO_PACK=%artefact_dir%\%project_name%.map
set FILES_TO_PACK=%artefact_dir%\%project_name%.bin %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.elf %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.hex %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.jpeg %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.pdf %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%.svg %FILES_TO_PACK%
set FILES_TO_PACK=%artefact_dir%\%project_name%_dep.gv %FILES_TO_PACK%

echo artefact_dir=%artefact_dir%
echo FILES_TO_PACK=%FILES_TO_PACK%

tar.exe -v -f %artefact_dir%\%project_name%.tar -c %FILES_TO_PACK%  --

Однако система сборки у меня Make поэтому надо написать общий на все сборки скрипт для упаковки файлов. Вот так может выглядеть make скрипт archive_artifacts.mk для упаковки бинарей в архив

$(info ArchiveArtifactsScript)


TIME_STAMP_FILE = $(BUILD_DIR)/time_stamp.txt
FILES_TO_PACK += $(TIME_STAMP_FILE)
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).pdf
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).svg
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).jpeg
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET)_dep.gv
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).map
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).elf
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).hex
FILES_TO_PACK += $(BUILD_DIR)/$(TARGET).bin

ARCHIVE_FILE := $(TARGET).tar

.PHONY: compose_time_stamp
compose_time_stamp:
	$(info ComposeTimeStamp)
	$(info TIME_STAMP_FILE=$(TIME_STAMP_FILE))
	$(shell date > $(TIME_STAMP_FILE))


.PHONY: archive_artifacts
archive_artifacts: compose_time_stamp generate_dep auto_version_target 
	$(info BUILD_DIR=$(BUILD_DIR))
	$(info FILES_TO_PACK=$(FILES_TO_PACK))
	$(info ARCHIVE_FILE=$(ARCHIVE_FILE))
	$(info Archive Artifacts...)
	tar.exe -v -f $(ARCHIVE_FILE) -c $(FILES_TO_PACK) --



После отработки этого скрипта в папке build (BUILD_DIR) корня проекта появляется *.tar архив с бинарями. Сюда же в архив капнет временная отметка time_stamp.txt, чтобы показывать насколько эта сборка новая.

Итоги

Удалось добавить автоматическое архивирование бинарей в общий процесс сборки проекта.

Ссылки

#

название

URL

1

Create .zip folder from the command line - (Windows)

https://superuser.com/questions/201371/create-zip-folder-from-the-command-line-windows

2

TAR - архивирование данных в Windows 10.

https://ab57.ru/cmdlist/tar.html

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы делаете автоматическую архивацию артефактов при программировании микроконтроллеров?
22.22% да2
77.78% нет7
Проголосовали 9 пользователей. Воздержался 1 пользователь.
Теги:
Хабы:
Всего голосов 11: ↑5 и ↓6+3
Комментарии38

Публикации

Истории

Работа

Программист С
34 вакансии
DevOps инженер
47 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн