Нам нужен портативный Docker-контейнер, который содержит наше приложение Angular вместе с его сервером и каким бы образом компьютера он ни требовал, который мы можем отобразить на любом облачном провайдере. Мы собираемся создать весь конвейер, который будет инкрементным. «Правила докера» - это быстро. По сути, он предоставляет инструментальные средства, добавляя новые слои Docker, так что изменения, которые вы вносите в приложение, являются единственными вещами, которые отправляются по проводной связи на облачный хост. Кроме того, поскольку образы Docker помечены с помощью SHA, мы повторно развернем только измененные образы. Для управления производственным развертыванием мы будем использовать Kubernetes, для которого также существуют правила Bazel. Построить образ Docker из Dockerfile с использованием Bazel, насколько мне известно, невозможно, поскольку он не разрешен из-за негерметичного характера Dockerfile. (Источник: https://blog.bazel.build/2015/07/28/docker_build.html)
Изменения, внесенные как часть исходного кода, будут развернуты в кластере Kubernetes. Это один из способов добиться следующего с помощью Bazel.
Мы должны перевести Bazel в режим наблюдения, а Deploy replace говорит кластеру Kubernetes обновить развернутую версию приложения. A.
Команда: ibazel run: deploy.replace
В случае каких-либо изменений исходного кода сделайте это в угловом формате.
- Базель постепенно перестраивает только те части графика сборки, которые зависят от измененного файла. В данном случае это включаетизмененный модуль ng_module, приложение Angular, включающее этот модуль, и Docker nodejs_image, в котором находится сервер. Если вы хотите обновить развертывание, то после завершения сборки он помещает новый контейнер Docker в реестр контейнеров Google, и экземпляр Kubernetes Engine начинает его обслуживать. Базель понимает график сборки, он только перестраивает то, что изменилось.
Вот несколько советов на уровне фрагментов, которые действительно могут помочь.
ФАЙЛ WORKSPACE:
Создание файла рабочего пространства Bazel, WORKSPACEФайл сообщает Bazel, что этот каталог является «рабочим пространством», которое похоже на корневой каталог проекта. Вещи, которые должны быть сделаны в Bazel Workspace, перечислены ниже. • Имя рабочей области должно совпадать с пакетом npm, в котором мы публикуем, так что этот импорт также имеет смысл при обращении к опубликованному пакету. • Упомяните все правила в рабочей области Bazel, используя «http_archive». Поскольку мы используем angular и node, правила должны быть упомянуты для rxjs, angular, angular_material, io_bazel_rules_sass, angular-version, build_bazel_rules_typescript, build_bazel_rules_nodejs. • Далее мы должны загрузить зависимости, используя «load». sass_repositories, ts_setup_workspace, angular_material_setup_workspace, ng_setup_workspace, • Загрузите также базовые образы докера, в нашем случае это «@ io_bazel_rules_docker // nodejs: image.bzl», • Не забудьте упомянуть хранилище веб-тестов (репозитарии веб-тестов (хранилище веб-тестов)True, firefox = True,)
Файл "BUILD.bazel".
• Загрузите загруженные модули ng_module, модуль проекта и т. Д. • Установите значение по умолчаниювидимость с использованием «default_visibility» • если у вас есть какие-либо тесты Jasmine, используйте ts_config и упомяните зависимости внутри него. • ng_module (здесь должны быть упомянуты активы, источники и Depndeencies). • Если у вас есть какие-либо сценарии отложенной загрузки, укажите это как часть пакета. • Укажите корневые каталоги в web_package. • В заключение упомяните данные и страницу приветствия / страницу по умолчанию.
Пример фрагмента:
load("@angular//:index.bzl", "ng_module")
ng_module(
name = "src",
srcs = glob(["*.ts"]),
tsconfig = ":tsconfig.json",
deps = ["//src/hello-world"],
)
load("@build_bazel_rules_nodejs//:future.bzl", "rollup_bundle")
rollup_bundle(
name = "bundle",
deps = [":src"]
entry_point = "angular_bazel_example/src/main.js"
)
Сборка комплекта с помощью команды ниже.
bazel build :bundle
Трубопровод: через Дженкинс
Создание трубопровода через Дженкинс и запуск трубопровода существуют этапы. Каждая стадия выполняет отдельные задачи, но в нашем случае мы используем стадию для публикации изображения, используя BaZel Run.
pipeline {
agent any
stages {
stage('Publish image') {
steps {
sh 'bazel run //src/server:push'
}
}
}
}
Примечание:
bazel run :dev.apply
DevПрименить маps to kubectl apply, который создаст или заменит существующую конфигурацию. (Для получения дополнительной информации см. документацию kubectl.) Это применяет разрешенный шаблон, который включает повторную публикацию изображений. Это действие должно стать рабочей лошадкой для разработки с быстрой итерацией (перестройка / повторная публикация / повторное развертывание).
Если вы хотите извлекать контейнеры, используя файл рабочей области, используйте тег ниже
container_pull (name = "debian_base", digest = "sha256: **", registry = "gcr.io", хранилище = "google-appengine / debian9",)
Если используется GKE, необходимо установить gcloud sdk, и, поскольку мы используем GKE (Google Contianer Enginer), его можно аутентифицировать, используя следующий метод.
gcloud container clusters get-credentials <CLUSTER NAME>
Объект Deploymnet следует упомянуть вследующий формат:
load ("@ io_bazel_rules_k8s // k8s: object.bzl", "k8s_object")
k8s_object(
name = "dev",
kind = "deployment",
template = ":deployment.yaml",
images = {
"gcr.io/rules_k8s/server:dev": "//server:image"
},
)
Sources :
• https://docs.bazel.build/versions/0.19.1/be/workspace.html
• https://github.com/thelgevold/angular-bazel-example
• https://medium.com/@Jakeherringbone/deploying-an-angular-app-to-kubernetes-using-bazel-preview-91432b8690b5
• https://github.com/bazelbuild/rules_docker
• https://github.com/GoogleCloudPlatform/gke-bazel-demo
• https://github.com/bazelbuild/rules_k8s#update
• https://codefresh.io/howtos/local-k8s-draft-skaffold-garden/
• https://github.com/bazelbuild/rules_k8s