Мы переписываем наш тестирующий трубопровод CI. В предыдущем посте мы смотрели на использование бродяга для управления виртуальными винтами Windows.
Здесь мы используем Докер и Qemu расширить тестирование на ARM64. Наши примеры покрывают Ржавчина и C #/. NET, но это легко адаптируемо к любому языку/рамки вашего вкуса.
Qemu
Мы хотели расширить тестирование на более «экзотические» платформы, в частности ARM64/AARCH64. Эта сочная эмиссия Travis-Ci заставил нас направиться в этом направлении. Они изначально используют Debian «Джесси», но «растягиваться» — это Первый с поддержкой ARM64 Отказ
На Ubuntu 18.04 хост, сначала Установите Docker на Ubuntu тогда:
docker run --rm --privileged multiarch/qemu-user-static:register docker run -it --rm multiarch/debian-debootstrap:arm64-stretch
В полученной оболочке запускаются uname -a
:
root@f190ea8ef8cc:/# uname -a Linux f190ea8ef8cc 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 aarch64 GNU/Linux
Примечание Aarch64. . Довольно слабил.
«Магия» здесь Linux Binfmt который пересылает произвольные исполняемые форматы на приложение пользовательского пространства — в этом случае QEMU.
Еще несколько чтений:
- https://www.tomaz.me/2013/12/02/running-travis-ci-tests-on-arm.html
- https://blog.hypriot.com/post/setup-simple-ci-pipeline-for-arm-images/
Ржавчина
Наша первая морская свинка одна из наших библиотек Rust . Вот докер Для установки ржавчины в среде ARM64:
FROM multiarch/debian-debootstrap:arm64-stretch RUN apt-get update && apt-get install -y \ build-essential \ ca-certificates \ clang \ cmake \ curl ARG RUST_VER=1.32.0 # Make sure rustup and cargo are in PATH ENV PATH "~/.cargo/bin:$PATH" # Install rustup, skip latest toolchain and get a specific version RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain none && \ ~/.cargo/bin/rustup default $RUST_VER
Clang
иCmake
Предпосылки для БегCA-сертификаты
состоит в том, чтобы справиться с скручиванием:
ERROR: The certificate of `XXX' is not trusted
Это было подтолкнуло до докерского хаба, как Jeikabu/Debian-Rust
Таким образом, вы можете попробовать это с:
docker run -it --rm jeikabu/debian-rust:arm64v8-stretch-1.32.0
Использование груз
Чтобы запустить наши тесты:
docker run -t -v $(pwd):/usr/src jeikabu/debian-rust:arm64v8-stretch-1.32.0 /bin/bash -c "cd /usr/src; cargo test"
NB: код выхода 0.
Если все тесты добиваются успеха.
.СЕТЬ Основной
У Microsoft имеет Эпическое количество изображений, связанных с .NET Core Отказ Особый интерес есть DockerFile для .NET. Core 3.0 Предварительный просмотр ARM64 Отказ Используя это снова включить тестирование на ARM64 через QEMU:
FROM multiarch/debian-debootstrap:arm64-stretch RUN apt-get update && apt-get install -y \ curl \ gnupg \ icu-devtools # From: # https://github.com/dotnet/dotnet-docker/blob/master/3.0/sdk/stretch/arm64v8/Dockerfile ENV DOTNET_SDK_VERSION 3.0.100-preview-010184 RUN curl -SL --output dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-linux-arm64.tar.gz \ && dotnet_sha512='3fd7338fdbcc194cdc4a7472a0639189830aba4f653726094a85469b383bd3dc005e3dad4427fee398f76b40b415cbd21b462bd68af21169b283f44325598305' \ && echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \ && mkdir -p /usr/share/dotnet \ && tar -zxf dotnet.tar.gz -C /usr/share/dotnet \ && rm dotnet.tar.gz \ && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
Если вы за пределами Северной Америки, вы можете использовать URL-адреса загрузки в Выпуск ноты Отказ В Китае, скачивание из https://download.visualstudio.microsoft.com было много раз быстрее, чем использование https://dotnetcli.blob.core.windows.net. (как в официальном доке DockerFile). YMMV.
Это изображение также было подтолкнуто к Docker Hub AS Jeikabu/Debian-Dotnet-SDK
Отказ
Давайте запустим наши тесты:
docker run -t -v $(pwd):/usr/src jeikabu/debian-dotnet-sdk:arm64v8-stretch /bin/bash -c "cd /usr/src; dotnet test"
icu-devtools
Пакет в противном случае вы получите:
root@79106a1b502f:/# cd /usr/src root@864d67ab40bb:/usr/src# dotnet clean qemu: Unsupported syscall: 283 FailFast: Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support. at System.Environment.FailFast(System.String) at System.Globalization.GlobalizationMode.GetGlobalizationInvariantMode() at System.Globalization.GlobalizationMode..cctor() at System.Globalization.CultureData.CreateCultureWithInvariantData() at System.Globalization.CultureData.get_Invariant() at System.Globalization.CultureData.GetCultureData(System.String, Boolean) at System.Globalization.CultureInfo..ctor(System.String, Boolean) at System.Reflection.RuntimeAssembly.GetLocale() at System.Reflection.RuntimeAssembly.GetName(Boolean) at System.Reflection.Assembly.GetName() at System.Diagnostics.Tracing.EventPipeController.GetAppName() at System.Diagnostics.Tracing.EventPipeController..ctor() at System.Diagnostics.Tracing.EventPipeController.Initialize() at System.StartupHookProvider.ProcessStartupHooks() qemu: uncaught target signal 6 (Aborted) - core dumped Aborted (core dumped)
Есть несколько блогов и вопросов стойки, содержащие решения, которые, кажется, являются вариантами из Документация Dotnet для RHEL Отказ Мы не пытаемся создавать педантически сокращенные изображения, поэтому добавление icu-devtools
Пакет будет достаточно.
Трэвис
Это должно работать на Большинство Системы Linux. Давайте попробуем запустить его как часть нашего Трэвис СИ .
Создать QEMU_ARM64.SH
Чтобы запустить тесты:
#!/usr/bin/env bash if [["$TRAVIS_OS_NAME" == "linux"]] || [["$OSTYPE" == "linux-gnu"]]; then docker run --rm --privileged multiarch/qemu-user-static:register --reset docker run -t -v $(pwd):/usr/src jeikabu/debian-dotnet-sdk:arm64v8-stretch /bin/bash -c "cd /usr/src && dotnet build && dotnet test --filter 'platform!=windows' --verbosity normal" fi
after_success: - ./scripts/qemu_arm64.sh
NB: если какой-либо тест не проходит не- 0
Значение будет возвращено, но After_success
не потерпит неудачу . Если мы решили сохранить это, и как только ARM64 стабилизируется, мы могли бы переместить его на более раннюю фазу и позволить ему потерпиться.
Это довольно минимальный пример, использующий небольшой проект, но все же займет всего за 5 минут на Трэвисе. Большие проекты могут работать Afoul of Построить тайм-ауты Отказ Еще раз, YMMV.
Оригинал: «https://dev.to/jeikabu/migrating-to-dockerqemu-2af6»