Firebase Functions + GitHub + VS Code Remote Container = 🎉

Firebase Functions + GitHub + VS Code Remote Container = 🎉

firebase
github
vscode
CI/CD

Задача

Исходные данные

  • Firebase Functions в качестве облачного serverless решения
  • GitHub в качестве репозитория кода
  • VS Code в качестве IDE

Необходимо

  • Настроить локальное рабочее окружение:
    • Firebase Functions требуют определённую версию Node.js (на момент написания статьи — 10), что является проблемой при локальной разработке нескольких проектов, которые используют более поздние версии Node.js. Необходимо обеспечить требуемой версией Node.js каждый проект без глобального изменения версии (например, через nvm).
  • Настроить CI/CD процесс

Настройка локального рабочего окружения

Visual Studio Code Remote Container позволяют использовать Docker контейнеры как полнофункциональую среду для разработки. Контейнеры позволяют создавать изолированное окружение для отдельно взятого проекта, что в том числе позволяет использовать для каждого проекта необходимую ему версию Node.js.

  1. Создать .devcontainer/Dockerfile с указанием версии Node.js
# .devcontainer/Dockerfile
FROM: node:10
  1. Создать .devcontainer/devcontainer.json
/* .devcontainer/devcontainer.json */
{
"name": "Node.js 10 Container",
"dockerFile": "Dockerfile",
"settings": {
"terminal.integrated.shell.linux": null
}
}
  1. Предоставить доступ контейнеру к git

  2. Открыть папку с проектом в Remote Container: F1 -> Remote Container: Open Folder in Container

  3. Выбрать Clone Volume для более быстрого доступа к файлам

Настройка CI/CD процеcса

Для деплоя Firebase Functions используются GitHub Actions. GitHub Actions нужно предоставить доступ к Firebase Functions:

  1. Получить Firebase токен — firebase login:ci на машине с браузером
  2. Добавить полученный токен в гитхаб — Settings -> Secrets -> New secret
  3. Использовать добавленный токен в GitHub Action:
# .github/workflows/deploy.yml
name: Deploy Firebase
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [10.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
- run: npm i -g firebase-tools
- name: Install dependencies
run: yarn install --production --pure-lockfile --non-interactive
- name: Deploy
run: |
firebase deploy --token {{secrets.$FIREBASE_TOKEN}}
env:
CI: true
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

Созданный workflow обеспечивает запуск Deploy Firebase каждый раз при пуше в master.

Заключение

Использование связки Firebase Functions + Visual Studio Code Remote Containers + GitHub позволяет добиться гладкого процесса разработки и деплоя облачных функций.