Ускорьте работу локальной среды разработки с помощью Tilt

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

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

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

Установка

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

curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Первые шаги

Tilt работает, читая файл под названием 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 теперь следит за изменениями в кодах проекта, и если они происходят, он выполняет компиляцию, генерацию контейнеров и обновление окружения!

Kubernetes!!!

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

На 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 демонстрирует потрясающая Эллен Корбес, которая работает в Tilt, посмотрите это видео.

Первоначально опубликовано на сайте https://eltonminetto.dev 31 августа 2022 года.

Оцените статью
devanswers.ru
Добавить комментарий