Автоматический деплой serverless функций из Git

    image

    На примере gitlab бота я покажу, каким образом можно автоматизировать процесс релиза для serverless функций через автоматическое их обновление из git репозитория. Переходим от игр к практической разработке на serverless.

    Что за gitlab бот?


    Представьте, что вам нужно автоматизировать процесс реакции на создание задач/багов в вашем трекере, например Gitlab (Issues) или Jira. Вам может потребоваться автоматически добавлять исполнителя в зависимости от тегов, двигать задачу на определенный milestone, добавить комментарий или просто закрыть противный баг. Все это очень легко делается с помощью serverless функций. В качестве примера мы возьмем добавление комментария (Note в терминологии Gitlab) к вновь созданной задаче (Issue).

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

    Настройка окружения


    Для начала нам нужно создать проект на Gitlab. Если у вас нет аккаунта Gitlab, то его можно создать здесь. Создать новый публичный проект можно, например, сделав форк моего проекта https://gitlab.com/bbelky/gitbotswf, нажав кнопку Fork в правом верхнем углу.

    image

    Чтобы иметь возможность редактировать код бота его нужно склонировать локально. На самом деле для целей этого гайда мы можем делать это и онлайн, но будем ближе к реальной жизни. Откройте свой терминал и склонируйте git репозиторий. Ссылку можно найти в правом верхнем углу вашего проекта Clone > Clone with HTTPS. Сохраните ее как Gitlab URL, она нам еще пригодится.

    git clone <link to your repo>
    cd gitbotswf/
    ls
    README.md main.go

    В клонированном репозитории есть файл main.go. Это и есть наш бот, написанный на golang. Бот очень простой: он получает webhook от Gitlab по событию создания новой задачи (Issue) и добавляет комментарий (note в терминологии Gitlab) к созданной задаче. В main.go есть комментарии, которые помогут вам разобраться в том, как устроен бот. Не будем останавливаться на этом подробнее.

    Не закрывайте терминал — чуть позже нам потребуется редактировать файл main.go.

    Также нам нужно создать Gitlab API Token, чтобы обращаться к API гитлаба.

    1. Перейдите в ваш Gitlab профиль > Settings > Access Tokens.
    2. Создайте новый токен с api scope.
    3. Скопируйте его и сохраните как GITLABTOKEN.

    The бот


    Время создать сам бот. Создадим serverless функцию с кодом нашего бота на базе serverless платформы Swifty. Если у вас еще нет аккаунта на Rusonyx Swifty, то время его создать. Мы хотим автоматизировать процесс деплоя новой функции, поэтому проделаем следующую последовательность: подключим наш гит репозиторий, создадим функцию на основе кода из гит, а также поместим gitlab api token в безопасное хранилище.

    image

    1. Войдите в Swifty и выберите Repositories
    2. Нажмите Attach Repo, выберите тип Git URL и вставьте свой Gitlab URL.
    3. Не забудьте выбрать параметр Mirror repository automatically и нажмите Done.

    image

    Теперь Swifty будет автоматически синхронизироваться с вашим репозиторием (делать git pull) каждый 30 минут. Теперь создадим саму функцию:

    1. Перейдите Functions > New Function > вкладка From repo (Templates).
    2. Выберите только что добавленный репозиторий, например, gitlab.com/bbelky/gitbotswf.git. Теперь вы видите файлы из вашего репозитория.
    3. Выберите файл main.go, нажмите Next.
    4. Выберите опцию Sync with repository, введите имя функции gitbotswf и нажмите Create.

    image

    Теперь нам нужен HTTP API триггер, при вызове которого функция будет срабатывать:

    1. Перейдите на вкладку Triggers > Add Trigger > REST API (URL).
    2. Скопируйте получившийся URL и сохраните его как BOT_URL.

    image

    Отлично, теперь у нас есть репозиторий и функция, которая синхронизируется с ним автоматически. Теперь добавим наш Gitlab API Token в Swifty Accounts — безопасное и шифрованное хранилище для паролей и токенов.

    1. Перейдите Accounts > Create Account.
    2. Выберите тип Generic.
    3. Задайте имя GITLABTOKEN и скопируйте ваш токен. Сохраните.

    image

    Теперь добавим токен в функцию:

    1. Перейдите Functions > функция gitbotswf > Access и нажмите Add.
    2. Выберите тип Accounts, GITLABTOKEN и нажмите Add.

    Включаем webhook


    На последнем этапе нам нужно создать webhook на Gitlab, который будет срабатывать каждый раз при создании новой Issue. Перейдем в Gitlab.

    1. Выберите свой проект > Settings > Integrations.
    2. Добавьте сохраненный ранее BOT_URL в URL поле.
    3. Поставьте галочку напротив Issues events и нажмите Add webhook.

    Протестируем


    Перейдем в проект на Gitlab, на вкладку Issues и создадим новую Issue. Проверим комментарии. Ага! Если, все сработало хорошо, то мы увидим комментарий «Thanks for reporting new issue!». Если где-то случилась ошибка, то спросите нас здесь или задайте вопрос в слеке.

    Обновление и автоматический релиз бота


    Что, если нам нужно обновить наш бот? Благодаря проделанной интеграции с гит, все что вам нужно это обновить ваш код (измените текст note, например), запушить код в Gitlab и Swifty автоматически обновит вашу функцию!

    Итак, открываем файл main.go в терминале и меняем переменную note:

    note := "Comments%20changed!"

    Обновляем гит:

    git add *
    git commit -m "changes"
    git push origin master

    Go serverless!
    Rusonyx
    101,00
    Компания
    Поделиться публикацией

    Комментарии 15

      0
      Я думал будет что-то интересное, типа DIY для Gitlab, кроме как подключить n-ю платформа к своему репозиторию… Но спасибо и на этом.
        0
        а что имеется ввиду под DIY для gitlab?
          0
          Например все в 1м бинарнике go и только настраивается с помощью конфиг файла, без участия Swifty и тд.

          UPD: пропустил serveless сорян…
            0
            Вы имеете ввиду несколько функций в одном бинарнике? Или код функции + библиотеки? Вообще концепция serverless предполагает, что отдельная функция выполняет конкретную задачу в приложении и объединять ее с другими в один package особо смысла нет. Как, собственно, и паковать ее в бинарник, так как это делает сама serverless платформа.

            Если нужно разворачивать сложное приложение с множеством функций, то для этого у нас есть сущность deployment. Deployment это шаблон, описывающий несколько функций и их обвязку. Пример deploy config для todo приложения github.com/swiftycloud/swifty.demo/blob/master/todoapp.yaml
              +2

              Я думал, что будет что-то интересное. Либо лямбда для Амазона написана, либо взят свой кубернетес и на него whisk водружен. А это опять Swifty… Ну, разочарование. Прям совсем.

                0

                Ну извините, мы пишем про свою систему, так как считаем, что она во многих кейсах лучше перечисленных;) А чем свой виск поверх кубера интереснее? Сложностью? Неудобностью? Траблшутингом? А лямбда чем интереснее? Необходимостью делать 10 действий там, где можно сделать одно?)

                  0

                  Я объясню почему. Потому что либо я уже являюсь пользователем amazon/azure/google и там есть (или будет в ближайшее время) faas из коробки. Либо у меня приватное облако и я хочу faas поверх него.
                  Подскажите — правильно же я понимаю, что свой сервис вы предлагаете по модели SaaS на своих мощностях (а не на мощностях клиента)? Ну, и кто ваша целевая аудитория тогда?

                    0

                    Мы предлагаем Swifty по двум моделям: SaaS и on-premises. Если вам удобнее использовать serverless on prem, то мы с удовольствием поможем вам его развернуть.

                      0
                      на сайте свифти не нашел информации о ценниках, ни ссылок на скачивание дистрибутива, только отправка имейла непонятно для чего. Информации минимум. Соответственно вопрос — какой ценник на эту систему (если например я хочу ее развернуть у себя на домашнем сервере), какие ограничения и тд.
                        0
                        + интересует технические спецификации. То есть — среда ставится поверх заранее подготовленные ноды с Linux (какие требования по дистрибутивам, по среде etc.)? Как она интегрируется с kubernetes, если, он уже, например, есть?
                          0
                          Swifty ставится поверх голых ubuntu/fedora, kuber и его окружение мы ставим свой и настраиваем его так, как считаем оптимальным для наших кейсов. Почему мы приносим свой кубер можно посмотреть, например, здесь https://youtu.be/aP_bw255fD4 В принципе, можем поставить и на ваш кубер, но тогда преимуществ описанных в видео выше у вас не будет.

                          Минимальное число нод зависит от сервисов, которыми вы хотите пользоваться. Полный комплект с HA и мониторингом займет 6 нод или виртуальных машин. На четырех t2.medium на AWS вполне можно потестить. Ставится все парочкой ansible плейбуков, никакого rocket science.
                          0
                          На домашнем сервере это все можно развернуть бесплатно — за некоммерческое (или если вы самостоятельный разработчик и не используете swifty в интересах компании) использование денег не берут. В скором времени зарелизим тулзу, которая позволит развернуть swifty на любое облако, нужно будет лишь скормить ей IP адреса.
                            0
                            в идеале бы не тулзу а гайд, ибо у меня все поднято на докер контейнерах и чтобы была возможность самому загнать систему в контейнер, или иметь официальный. Ну или docker-compose файлик с минимальной инструкцией и настройками через переменные среды. В домашних условиях (назовем для личного некоммерческого использования) поднимать связку с кубером и 6 нодами смысла нет :)
                              0
                              К сожалению, там все не так просто, чтобы поднимать композом и в готовых докер контейнерах. Фич то тьма, компонентов соответственно тоже. Может в личных некоммерческих целях лучше пробовать у провайдера? У Русоникса 3 месяца бесплатного использования, потом переходите на Free план, который достаточно вольготный, чтобы запускать не очень нагруженные приложения. При этом вы свободны — захотелось свое, можно поставить свое.
                                0
                                в общем ожидаем гайды, тулзы и пр. Может получится собрать под себя контейнеры под минималку :)

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое