Рубрики
Без рубрики

Пусть посады начнутся – День 16 #25Daysofserverles вызов

Создайте конвейер CI/CD для функций Azure. Tagged с 25daysofserverless, без сервера, Azure, Python.

Эта статья является частью #25daysofserverless Анкет Новые проблемы будут публиковаться каждый день от Microsoft Cloud Advocates в течение месяца месяца. Узнайте больше о том, как Microsoft Azure позволяет вашему Без сервера функции Анкет

Есть идея или решение? Поделитесь своими мыслями в Твиттере!

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

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

Соревнование

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

Советы:

  1. Чтобы разрешить обновление решения и данных как можно быстрее, развертывание должно быть сделано автоматически после объединения запроса на привлечение. Вы можете достичь этого, используя такие услуги, как действия GitHub или Azure Tipvines.
  2. Вы можете указать местоположения любым способом, который вы предпочитаете (то есть адреса, широты и пары долготы). Тем не менее, вам нужно убедиться, что каждое добавленное место придерживается одного и того же формата.
  3. Есть много способов, которыми вы можете реализовать это решение; Мы рекомендуем начать с простого, реализовать свой трубопровод CI/CD и уточнить позже.

Решение

В этой конкретной проблеме основное внимание уделяется созданию конвейера CI/CD для функции Azure, поэтому я решил использовать Python для этой задачи. Поскольку основной фокус не является самой функцией, я собираюсь кратко изложить процесс. Тем не менее, вы можете следовать этот учебник В случае, если вам нужно пошаговое руководство по созданию HTTP-запускаемой функции Azure в Python.

Я использовал VS -код и расширение функций Azure для создания инициаторов Python HTTP с предварительно определенными шаблонами в качестве отправной точки.

Следующим шагом является определение формата для мест для вызова. В моем случае я создал локации.json Файл, который выглядит примерно так:

{
 "locations": [
    {
       "name": "Bellas Artes",
       "date": "December 16, 2019",
       "host": "Tania Allard",
       "type": "geopoint",
       "location": {
       "lon": 19.4352,
       "lat": 99.1412
       }
    },
    {
       "name": "Museo de Antropologia",
       "date": "December 17, 2019",
       "host": "Tania Allard",
       "type": "geopoint",
       "location": {
       "lon": 19.4260,
       "lat": 99.1863
       }
    }
 ]
}

И я изменил __init__.py сценарий соответственно:

import datetime
import json
import logging
from pathlib import Path

import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
 logging.info("Someone is looking for a posada! ✨")

 day = req.params.get("day")
 if not day:
 locations = json_locations()
 return func.HttpResponse(f"{json.dumps(locations)}", status_code=200)

 if day:
 locations = json_locations()
 posada = get_loc(day, locations)
 return func.HttpResponse(f"{json.dumps(posada)}", status_code=200)
 else:
 return func.HttpResponse("Please pass a day", status_code=400)


def json_locations():
 """Function to parse the json file with the locations,
 we use Pathlib to resolve the full path of the file
 """
 loc_path = Path("./posadas/data/locations.json").resolve()
 with open(loc_path, "r") as json_file:
 locations = json.load(json_file)
 return locations.get("locations")


def get_loc(day, locations):
 """This function searches for the location corresponding to the 
 query day. 
 We need to make sure the dates are actually converted into DateTime objects.
 """
 for posada in locations:

 date = datetime.datetime.strptime(posada.get("date"), "%B %d, %Y").date()
 if date.day == int(day):
 return posada

Приведенный выше код позволяет пользователю:

  1. Предоставьте день в качестве строки запроса для API функции, и в этом случае он возвращает только данные для соответствующего дня (например, Отправьте запрос GET в первичную конечную точку, чтобы он возвращал все даты и местоположения в файле местоположения.

После тестирования на локальном запуске Func Host Start И убедившись, что все работает, я развернул свое приложение для функций в Azure. Мне нравится использовать Azure CLI для такого рода вещей (опять же, пошаговый можно найти здесь ). Если у вас установлено расширение функций Azure для VS -кода, вы также можете опубликовать свое приложение прямо оттуда, и это сэкономит вам некоторое время.

После развертывания я позаботился о том, чтобы моя функция работала правильно, выполнив запрос GET:

Как только функция будет развернута, мы можем продолжить и создать трубопровод CI/CD. Для этой задачи я решил использовать Действия GitHub Анкет Для этого нам нужно выполнить следующие шаги:

  1. Создать Сервис принципал Анкет Это позволит нам развернуть нашу функцию, используя действия GitHub. Если вы используете свою командную строку с помощью CLI Azure или облачной оболочки Azure, вы можете использовать следующую команду:
 az ad sp create-for-rbac --name "myApp" \
 --role contributor \
 --scopes /subscriptions//resourceGroups//providers/Microsoft.Web/sites/ --sdk-auth

Обратите внимание, что мы даем это только участник Доступ для ограничения объема этого доступа.

  1. Теперь обязательно скопируйте вывод вышеупомянутой команды, как вам это понадобится. Перейдите в репозиторий GitHub, где у вас есть код функции, перейдите к Настройки> Секреты Вставьте выход, когда вы создали принципал сервиса (Обратите внимание, что вам также нужно добавить идентификатор подписки).
  2. Теперь вернемся в местный репозиторий, мы собираемся создать .github/Workflows каталог. Это место, где все наши определения конвейера CI/CD будут расположены для GitHub, чтобы найти их. Теперь давайте создадим python_function.yaml Файл (вы можете изменить имя).

Я собираюсь объяснить контент, так что вы знаете, что это делает.

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

name: Python function

on:
 push:
 branches:
 - master

jobs:
 build-and-deploy:
 runs-on: ubuntu-latest
 steps:
 - name: "Checkout GitHub Action"
 uses: actions/checkout@master

Затем мы входим в Azure и устанавливаем нашу среду Python. Вот где вы также устанавливаете зависимости.

 - name: "Login via Azure CLI"
 uses: azure/login@v1
 with:
 creds: ${{ secrets.AZURE_CREDENTIALS }}

 - name: Setup Python 3.7
 uses: actions/setup-python@v1
 with:
 python-version: 3.7

 - name: "Run pip"
 shell: bash
 run: |
 pushd .
 python -m pip install --upgrade pip
 pip install -r requirements.txt --target=".python_packages/lib/python3.7/site-packages"
 popd

Наконец мы публикуем нашу функцию:

 - name: "Run Azure Functions Action"
 uses: Azure/functions-action@v1
 id: fa
 with:
 app-name: posadastrallard
 package: "."

Теперь, если мы сделаем git add .github/workflows/python_function.yaml И натолкнуть, мы должны увидеть, как рабочий процесс работает сразу под Действия :

Наконец, вы можете сделать обновление в файл локаций, дождаться завершения развертывания и увидеть обновленное ваше приложение!

Успех!

Вы можете увидеть окончательную функцию Python HTTP, а также рабочие процессы GitHub Daices в Репозиторий GitHub Вам нужно больше вдохновения.

Хотите отправить свое решение в этот вызов? Создайте решение локально, а затем Отправить проблему Анкет Если ваше решение не включает код, вы можете записать короткое видео и отправить его в качестве ссылки в выпуске. Обязательно сообщите нам, какой вызов решению. Мы рады видеть, что вы строите! У вас есть комментарии или вопросы? Добавьте их в область комментариев ниже.

Следите за сюрпризами в течение декабря, когда мы празднуем 25 дней без сервера. Следите за обновлениями здесь на Dev.To, поскольку мы представляем проблемы и решения! Подпишитесь на Бесплатная учетная запись на Azure Чтобы подготовиться к испытаниям!

Оригинал: “https://dev.to/azure/let-the-posadas-begin-day-16-of-the-25daysofserverles-challenge-57hm”