Spec-Zone.ru › Swift

Упаковывание приложений для развертывания

После того, как приложение построено для производства, его необходимо упаковать перед развертыванием на серверы. Существует несколько стратегий упаковки приложений Swift для развертывания.

Docker

Один из самых популярных способов упаковки приложений в наши дни — использование технологий контейнеризации, таких как Docker.

Используя инструменты Docker, мы можем создать и упаковать приложение в виде образа Docker, опубликовать его в репозитории Docker и позже запустить его непосредственно на сервере или на платформе, поддерживающей развертывание Docker, такой как Kubernetes. Многие поставщики облачных услуг, включая AWS, GCP, Azure, IBM и другие, поддерживают такой тип развертывания.

Вот пример Dockerfile, который строит и упаковывает приложение поверх CentOS:

#------- build -------
FROMswift:centos8asbuilder

# set up the workspace
RUN mkdir /workspace
WORKDIR /workspace

# copy the source to the docker image
COPY . /workspace

RUN swift build -c release --static-swift-stdlib

#------- package -------
FROM centos
# copy executables
COPY --from=builder /workspace/.build/release/<executable-name> /

# set the entry point (application name)
CMD ["<executable-name>"]

Чтобы создать локальный образ Docker из Dockerfile, используйте команду docker build из расположения исходного кода приложения, например:

$ docker build . -t <my-app>:<my-app-version>

Для тестирования локального образа используйте команду docker run, например:

$ docker run <my-app>:<my-app-version>

Наконец, используйте команду docker push для публикации образа приложения Docker в выбранный вами репозиторий Docker, например:

$ docker tag <my-app>:<my-app-version> <docker-hub-user>/<my-app>:<my-app-version>
$ docker push <docker-hub-user>/<my-app>:<my-app-version>

В этот момент образ приложения Docker готов к развертыванию на серверных хостах (которые должны работать с docker) или на одной из платформ, поддерживающих развертывание Docker.

Для получения более подробной информации о Docker см. документацию Docker.

Distroless

Distroless — проект Google, который пытается создать минимальные образы, содержащие только приложение и его зависимости времени выполнения. Они не содержат менеджеров пакетов, оболочек или других программ, которые вы ожидаете найти в стандартном дистрибутиве Linux.

Поскольку distroless поддерживает Docker и основан на Debian, упаковка приложения Swift на нем довольно похожа на процесс Docker, описанный выше. Вот пример Dockerfile, который строит и упаковывает приложение поверх базового образа C++ distroless:

#------- build -------
# Building using Ubuntu Bionic since its compatible with Debian runtime
FROMswift:bionicasbuilder

# set up the workspace
RUN mkdir /workspace
WORKDIR /workspace

# copy the source to the docker image
COPY . /workspace

RUN swift build -c release --static-swift-stdlib

#------- package -------
# Running on distroless C++ since it includes
# all(*) the runtime dependencies Swift programs need
FROM gcr.io/distroless/cc-debian10
# copy executables
COPY --from=builder /workspace/.build/release/<executable-name> /

# set the entry point (application name)
CMD ["<executable-name>"]

Обратите внимание, что выше используется gcr.io/distroless/cc-debian10 в качестве образа времени выполнения, который должен работать для программ Swift, не использующих FoundationNetworking или FoundationXML. Для обеспечения более полной поддержки мы (сообщество) можем добавить PR в distroless для введения базового образа для Swift, включающего libcurl и libxml, которые необходимы для FoundationNetworking и FoundationXML соответственно.

Архив (Tarball, ZIP-архив и т. д.)

Поскольку кросс-компиляция Swift для Linux пока не поддерживается на Mac или Windows, для компиляции приложений, предназначенных для запуска в Linux, необходимо использовать технологии виртуализации, такие как Docker.

Тем не менее, это не означает, что мы также должны упаковывать приложения в виде образов Docker для их развертывания. Хотя использование образов Docker для развертывания удобно и популярно, приложение также может быть упаковано с помощью простого и легкого архива, такого как tarball или ZIP-архив, затем загружено на сервер, где он может быть распакован и запущен.

Вот пример использования Docker и tar для построения и упаковки приложения для развертывания на серверах Ubuntu:

Сначала используйте команду docker run из расположения исходного кода приложения, чтобы его скомпилировать:

$ docker run --rm \
  -v "$PWD:/workspace" \
  -w /workspace \
  swift:bionic \
  /bin/bash -cl "swift build -c release --static-swift-stdlib"

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

Затем мы можем создать область подготовки с исполняемым файлом приложения:

$ docker run --rm \
  -v "$PWD:/workspace" \
  -w /workspace \
  swift:bionic  \
  /bin/bash -cl ' \
     rm -rf .build/install && mkdir -p .build/install && \
     cp -P .build/release/<executable-name> .build/install/'

Обратите внимание, что эту команду можно объединить с командой сборки выше – мы разделили их, чтобы сделать пример более понятным.

Наконец, создайте tarball из каталога подготовки:

$ tar cvzf <my-app>-<my-app-version>.tar.gz -C .build/install .

Мы можем проверить целостность tarball, извлекая его в каталог и запуская приложение в контейнере Docker runtime:

$ cd <extracted directory>
$ docker run -v "$PWD:/app" -w /app bionic ./<executable-name>

Развертывание tarball приложения на целевой сервер можно выполнить с помощью утилит, таких как scp, или в более сложной настройке с помощью систем управления конфигурацией, таких как chef, puppet, ansible и т. д.

Распространение исходного кода

Еще один распространенный способ распространения, популярный для динамических языков, таких как Ruby или Javascript, — это распределение исходного кода на сервер, а затем его компиляция на самом сервере.

Для компиляции приложений Swift непосредственно на сервере на сервере должна быть установлена соответствующая среда Swift. Swift.org публикует среды для различных дистрибутивов Linux, убедитесь, что вы используете ту, которая соответствует версии Linux вашего сервера и желаемой версии Swift.

Главное преимущество этого подхода — простота. Дополнительное преимущество заключается в том, что на сервере есть полная среда (например, отладчик), которая может помочь в устранении неполадок «в реальном времени» на сервере.

Главный недостаток этого подхода в том, что на сервере есть полная среда (например, компилятор), что означает, что у сложного злоумышленника могут быть возможности для выполнения кода. Они также могут потенциально получить доступ к исходному коду, который может быть конфиденциальным. Если код приложения необходимо клонировать из частного или защищенного репозитория, серверу нужен доступ к учетным данным, что увеличивает зону атаки.

В большинстве случаев из-за этих проблем с безопасностью распространение исходного кода не рекомендуется.

Статическая компоновка и Curl/XML

Примечание: если вы компилируете с помощью -static-stdlib и используете Curl с FoundationNetworking или XML с FoundationXML, на целевой системе должны быть установлены libcurl и/или libxml2, чтобы это работало.

The Swift Programming Language, Copyright © 2014-2025 Apple Inc.
Swift and the Swift logo are trademarks of Apple Inc.

Documentation for Swift 6.0.3


https://www.swift.org/documentation/server/guides/packaging.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API