Мы часами разрабатываем приложения на наших машинах, предъявляя все более высокие требования и сложность. Кроме того, любое современное приложение имеет несколько контейнеров, микросервисов, развертываний в разных средах, различных стеков и т. д. Так что любой инструмент, который может сделать наш поток более гибким, удобен.

В этом посте я хочу представить мощный инструмент, который может сэкономить вам много времени в процессе разработки. Это Наклончто было недавно приобретенный от Докера.

Чтобы немного продемонстрировать, что вы можете делать с помощью тильта, я буду использовать это хранилище Я использовал в разговоре о микросервисы (на португальском). Примеры будут сделаны на Go, но в официальной документации можно посмотреть, как его использовать с другие технологии и сценарии.


Монтаж

Первый шаг — установка приложения из командной строки. Для этого на моей macOS я запустил:

curl -fsSL  | bash
Войти в полноэкранный режим

Выйти из полноэкранного режима

документация показано, как установить его на другие операционные системы.


Первые шаги

Наклон работает, читая файл с именем Tiltfile в корне вашего проекта. Он имеет синтаксис, напоминающий Pythonи документация очень подробно показывает все варианты, которые мы можем использовать.

Содержание Tiltfile файл выглядел так:

local_resource('auth', cmd='cd auth; go build -o bin/auth main.go',
               serve_cmd='auth/bin/auth', deps=['auth/main.go', 'auth/security', 'auth/user', 'pkg'])

local_resource('feedbacks', cmd='cd feedbacks; go build -o bin/feedbacks main.go',
               serve_cmd='feedbacks/bin/feedbacks', deps=['feedbacks/main.go', 'feedbacks/feedback', 'pkg'])


local_resource('votes', cmd='cd votes; go build -o bin/votes main.go',
               serve_cmd='votes/bin/votes', deps=['votes/main.go', 'votes/vote', 'pkg'])

Войти в полноэкранный режим

Выйти из полноэкранного режима

local_resource Функция настраивает действия, которые будут выполняться на вашем локальном компьютере, а первый параметр — это имя, которое мы даем ресурсу, которое должно быть уникальным в пределах Tiltfile.

cmd параметр содержит команду, которую необходимо выполнить. Информация, содержащаяся в serve_cmd параметр будет выполняться Tilt и ожидается, что он не завершится. То есть это команда, которая будет запускать наш сервис.

Последний параметр, deps, является одним из самых интересных. Он указывает, какие каталоги проектов будет смотреть Tilt; если будут внесены изменения, он автоматически запустит процесс. Так, например, если происходят какие-либо изменения в auth/main.go, auth/security, auth/userили же pkg, в auth сервис будет перекомпилирован и запущен снова. Поскольку это компилируемый язык, такой как Go, это очень помогает, потому что изменение файла автоматически сгенерирует его, что сэкономит нам, разработчикам, драгоценное время.

Так как наш проект состоит из трех микросервисов, остальные Tiltfile настраивает одинаковое поведение для всех.

Чтобы запустить Tilt, просто откройте терминал и введите:

tilt up
Войти в полноэкранный режим

Выйти из полноэкранного режима

Представлено следующее:

наклон

Нажатие пробела приводит нас к графическому интерфейсу Tilt, где мы проведем много времени:

наклон

Мы можем проверить журнал компиляции каждого приложения в этом интерфейсе и снова выполнить нужный шаг. Он также объединяет журналы приложений и позволяет нам выполнять поиск по ним:

наклон

Ошибки компиляции также появляются на этом экране:

наклон

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


Контейнеры

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

Новая версия Tiltfile выглядит так:

local_resource(
    'auth-compile',
    cmd='cd auth; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/auth main.go',
    deps=['auth/main.go', 'auth/security', 'auth/user', 'pkg'],
)

docker_build(
    'auth-image',
    './auth',
    dockerfile='auth/Dockerfile',
)

local_resource(
    'feedbacks-compile',
    cmd='cd feedbacks; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/feedbacks main.go',
    deps=['feedbacks/main.go', 'feedbacks/feedback', 'pkg'],
)

docker_build(
    'feedbacks-image',
    './feedbacks',
    dockerfile='feedbacks/Dockerfile',
)

local_resource(
    'votes-compile',
    cmd='cd votes; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/votes main.go',
    deps=['votes/main.go', 'votes/vote', 'pkg'],
)

docker_build(
    'votes-image',
    './votes',
    dockerfile='votes/Dockerfile',
)

docker_compose('./docker-compose.yml')
Войти в полноэкранный режим

Выйти из полноэкранного режима

я добавил docker_build функция. Как следует из названия, он генерирует образ контейнера. Для этого создание Dockerfile был необходим для каждого микросервиса. Например, тот, что для auth сервис выглядит так:

FROM alpine
ADD bin/auth /
EXPOSE 8081
CMD ["/auth"]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Другие сервисы были очень похожи, просто менялись имя исполняемого файла и порт: feedbacks работает в порту 8082 а также votes на 8083.

При внесении этого изменения Tilt предупредит, что необходимо иметь какой-то способ развертывания контейнеров; в противном случае это не сработает. Один из способов сделать это — создать docker-compose.yml и использовать его в docker_compose функция. Ваш контент выглядит так:

version: "3"
services:
  auth:
    image: auth-image
    ports:
      - "8081:8081"
    container_name: auth
  feedbacks:
    image: feedbacks-image
    ports:
      - "8082:8082"
    container_name: feedbacks
  votes:
    image: votes-image
    ports:
      - "8083:8083"
    container_name: votes
Войти в полноэкранный режим

Выйти из полноэкранного режима

С этими изменениями Tilt теперь наблюдает за изменениями в кодах проекта, и если они происходят, он выполняет компиляцию, генерацию контейнеров и обновление среды!

наклон


Кубернетес!!

А теперь давайте сделаем это немного серьезнее! Пусть Tilt развернет наше приложение в кластере Kubernetes. Для этого я буду использовать миникубрешение, которое устанавливает локальную среду для разработки.

В macOS просто запустите:

brew install minikube
minikube start
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь, когда мы настроили наш кластер, давайте изменим наш Tiltfile чтобы отразить новую среду:

load('ext://restart_process', 'docker_build_with_restart')
local_resource(
    'auth-compile',
    cmd='cd auth; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/auth main.go',
    deps=['auth/main.go', 'auth/security', 'auth/user', 'pkg'],
)

docker_build_with_restart(
    'auth-image',
    './auth',
    dockerfile='auth/Dockerfile',
    entrypoint=['/auth'],
    live_update=[
        sync('./auth/bin/auth', '/auth'),
    ],
)

k8s_yaml('auth/kubernetes.yaml')
k8s_resource('ms-auth', port_forwards=8081,
             resource_deps=['auth-compile'])


local_resource(
    'feedbacks-compile',
    cmd='cd feedbacks; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/feedbacks main.go',
    deps=['feedbacks/main.go', 'feedbacks/feedback', 'pkg'],
)

docker_build_with_restart(
    'feedbacks-image',
    './feedbacks',
    dockerfile='feedbacks/Dockerfile',
    entrypoint=['/feedbacks'],
    live_update=[
        sync('./feedbacks/bin/feedbacks', '/feedbacks'),
    ],
)

k8s_yaml('feedbacks/kubernetes.yaml')
k8s_resource('ms-feedbacks', port_forwards=8082,
             resource_deps=['feedbacks-compile'])


local_resource(
    'votes-compile',
    cmd='cd votes; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/votes main.go',
    deps=['votes/main.go', 'votes/vote', 'pkg'],
)

docker_build_with_restart(
    'votes-image',
    './votes',
    dockerfile='votes/Dockerfile',
    entrypoint=['/votes'],
    live_update=[
        sync('./votes/bin/votes', '/votes'),
    ],
)

k8s_yaml('votes/kubernetes.yaml')
k8s_resource('ms-votes', port_forwards=8083,
             resource_deps=['votes-compile'])

Войти в полноэкранный режим

Выйти из полноэкранного режима

Много нового где!

Первый — это load функция, загружающая Tilt расширения. Это способ расширить возможности инструмента и несколько доступны. Здесь мы используем docker_build_with_restart, который обновит контейнер, работающий внутри нашего кластера Kubernetes.

Еще одно изменение связано с настройками развертывания приложений в Kubernetes. k8s_yaml указывает, какой файл содержит «рецепт», используемый для развертывания. И k8s_resource здесь используется для перенаправления порта кластера в нашу локальную среду, что делает тестирование более доступным.

Содержание auth/kubernetes.yaml файл:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: ms-auth
  name: ms-auth
spec:
  ports:
    - port: 8081
      name: http
      protocol: TCP
      targetPort: 8081
  selector:
    app: ms-auth
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ms-auth
  labels:
    app: ms-auth
spec:
  selector:
    matchLabels:
      app: ms-auth
  template:
    metadata:
      labels:
        app: ms-auth
    spec:
      containers:
        - name: ms-auth
          image: auth-image
          ports:
            - containerPort: 8081
Войти в полноэкранный режим

Выйти из полноэкранного режима

Остальные файлы практически такие же, только меняется имя бинарника и порт.

Теперь Tilt делает всю тяжелую работу за нас:

наклон

Чтобы проверить, работают ли наши микросервисы в кластере, мы можем использовать команду:

kubectl get pods -n default
NAME                          READY   STATUS    RESTARTS   AGE
ms-auth-7446897869-89r2j      1/1     Running   0          81s
ms-feedbacks-b5df67d6-wzbj2   1/1     Running   0          81s
ms-votes-76565ddc9c-nkkt7     1/1     Running   0          81s
Войти в полноэкранный режим

Выйти из полноэкранного режима


Выводы

Я не знаю, удалось ли мне продемонстрировать, насколько я взволнован этим инструментом!

Я использовал Tilt в течение нескольких недель в сложном проекте по созданию Kubernetes. Контроллер. Благодаря всей этой автоматизации я могу сосредоточиться на логике приложения, в то время как все остальное делается автоматически. И это экономит много времени.

Спасибо моему коллеге Фелипе Паес де Оливейра, который познакомил меня с этим фантастическим инструментом. И если вы хотите увидеть демонстрацию тильта невероятными Эллен Корбескто работает в Tilt, посмотрите это видео.

Первоначально опубликовано на 31 августа 2022 г.