Оптимизируйте развертывание пользовательских функций BigQuery с помощью автоматизации GitHub Actions.

Введение

Как профессионалы в области данных, мы постоянно ищем лучшие и более эффективные способы управления нашим хранилищем данных. Google BigQuery — впечатляющее бессерверное хранилище данных, которое позволяет анализировать огромные наборы данных в режиме реального времени. Одним из интересных аспектов BigQuery является его поддержка пользовательских функций с использованием SQL и JavaScript. Однако, несмотря на удобство пользовательских функций, их развертывание может оказаться утомительной задачей.

Не бойся! В этой статье мы рассмотрим возможности GitHub Actions для автоматизации развертывания ваших пользовательских функций BigQuery. Используя возможности CI/CD GitHub Actions, вы можете сосредоточиться на создании безупречного кода, в то время как процесс развертывания выполняется автоматически.

Разминка перед игрой

Создайте учетную запись службы для GitHub

Перейдите в раздел IAM консоли GCP и добавьте новую учетную запись службы.

В разделе «Предоставить этому сервисному аккаунту доступ к проекту» выберите либо Администратор BigQuery, либо Пользователь задания BigQuery. Сервисный аккаунт должен иметь возможность запускать задания BigQuery!

Теперь перейдите в раздел «Сервисные аккаунты» и выберите созданный вами новый аккаунт — надеюсь, вы назвали его как-то разумно, например GitHub_Actions или подобное. Затем перейдите на вкладку Ключи и сгенерируйте новый ключ. После того, как вы загрузили ключ JSON, пришло время добавить его в качестве секрета на GitHub.

Добавьте секрет в репозиторий GitHub

В настройках репозитория выберите "Секреты и переменные > Действия" и добавьте новый секрет репозитория. Назовите это GCP_SA_KEY. Это имя я буду использовать в примерах ниже.

Добавление пользовательской функции

Шаг 1. Разместите свои пользовательские функции BigQuery

Начните с создания каталога в вашем репозитории GitHub, посвященного вашим пользовательским функциям. Я покажу вам, как создавать пользовательские функции SQL, но создавать функции JavaScript так же просто. У каждой функции должен быть свой собственный файл SQL, соответствующий определенному соглашению об именах, например «имя_функции.sql».

Вот пример функции SQL:

CREATE OR REPLACE FUNCTION circle_area(radius FLOAT64)
RETURNS FLOAT64
AS (
  3.141592653589793 * POW(radius, 2)
) OPTIONS (
  description = 'Calculate the area of a circle.'
);

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

Для получения дополнительной информации о пользовательских функциях ознакомьтесь с документацией или прочтите некоторые из моих статей 😉:



Шаг 2. Подготовка к рабочему процессу GitHub Actions

Чтобы установить новый рабочий процесс GitHub Actions, добавьте новый файл YAML (например, bigquery-deploy.yml) в каталог .github/workflows/ вашего репозитория. В этом файле будет храниться конфигурация, необходимая для вашего процесса развертывания.

Шаг 3. Суть дела: настройка рабочего процесса

Теперь давайте вдохнем жизнь в файл bigquery-deploy.yml, настроив следующие параметры:

Триггер: определите, что развертывание будет инициировано push-событием в основной ветке. Чтобы узнать больше о событиях, ознакомьтесь с документацией GitHub.

on:
  push:
    branches:
      - main

Переменные среды. Введите идентификатор проекта GCP и идентификатор набора данных BigQuery в качестве переменных среды. Это сообщит BigQuery, какой проект и набор данных нужно обновить.

env:
  GCP_PROJECT_ID: your_project_id
  BQ_DATASET_ID: your_dataset_id

Задания. Опишите шаги, необходимые для развертывания ваших пользовательских функций в BigQuery. Мы начнем с извлечения репозитория, аутентификации с помощью официального шага GCP Github Action, добавления инструментов gcloud и, наконец, мы отправим несколько команд для каждого файла в папке custom_functions:

jobs:
  deploy-custom-functions:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
      
      - id: 'auth'
        uses: 'google-github-actions/auth@v1'
        with:
          credentials_json: '${{ secrets.GCP_SA_KEY }}'

      - name: 'Set up Cloud SDK'
        uses: 'google-github-actions/setup-gcloud@v1'

      - name: Deploy BigQuery custom functions
        run: |
          for function in custom_functions/*; do
            bq --project_id $GCP_PROJECT_ID --dataset_id $BQ_DATASET_ID query --nouse_legacy_sql "$(cat $function)"
          done

Вот полный yaml-файл рабочего процесса, который можно легко скопировать:

Не забудьте обновить your_project_id и your_dataset_id, а также GCP_SA_KEY (если вы назвали свой секрет по-другому)!

Время для тест-драйва: внесите свои изменения

Зафиксируйте и отправьте файл bigquery-deploy.yml в свой репозиторий. Это запустит рабочий процесс GitHub Actions, беспрепятственно развернув ваши пользовательские функции в BigQuery. После завершения конвейера вы должны увидеть свои пользовательские функции под routines в разделе GCP BigQuery.

Вот наша функция в действии:

Заключение

Используя GitHub Actions, вы можете автоматизировать развертывание пользовательских функций BigQuery, сделав свой процесс разработки более эффективным и безошибочным. Помните, что вы можете добавить в эту папку столько функций SQL, сколько захотите, и скрипт без проблем развернет их все. Эта настройка позволяет вам сосредоточиться на написании качественного кода, в то время как GitHub Actions обрабатывает процесс развертывания. Удачного кодирования!