Рубрики
Uncategorized

Миграция до докера / Qemu

Мы переписываем наш тестирующий трубопровод CI. В предыдущем посте мы смотрели на использование бродяга для управления Wi … Теги с DevOps, Docker, Qemu.

Мы переписываем наш тестирующий трубопровод 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.

Еще несколько чтений:

Ржавчина

Наша первая морская свинка одна из наших библиотек 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

В .travis.yml.yml.yml :

after_success:
  - ./scripts/qemu_arm64.sh

NB: если какой-либо тест не проходит не- 0 Значение будет возвращено, но After_success не потерпит неудачу . Если мы решили сохранить это, и как только ARM64 стабилизируется, мы могли бы переместить его на более раннюю фазу и позволить ему потерпиться.

Это довольно минимальный пример, использующий небольшой проект, но все же займет всего за 5 минут на Трэвисе. Большие проекты могут работать Afoul of Построить тайм-ауты Отказ Еще раз, YMMV.

Оригинал: «https://dev.to/jeikabu/migrating-to-dockerqemu-2af6»