Firebase Functions + GitHub + VS Code Remote Container = 🎉
Задача
- 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.
- Создать .devcontainer/Dockerfile с указанием версии Node.js
# .devcontainer/DockerfileFROM: node:10
- Создать .devcontainer/devcontainer.json
/* .devcontainer/devcontainer.json */{"name": "Node.js 10 Container","dockerFile": "Dockerfile","settings": {"terminal.integrated.shell.linux": null}}
Открыть папку с проектом в Remote Container: F1 -> Remote Container: Open Folder in Container
Выбрать Clone Volume для более быстрого доступа к файлам
Настройка CI/CD процеcса
Для деплоя Firebase Functions используются GitHub Actions. GitHub Actions нужно предоставить доступ к Firebase Functions:
- Получить Firebase токен — firebase login:ci на машине с браузером
- Добавить полученный токен в гитхаб — Settings -> Secrets -> New secret
- Использовать добавленный токен в GitHub Action:
# .github/workflows/deploy.ymlname: Deploy Firebaseon:push:branches: [master]jobs:build:runs-on: ubuntu-lateststrategy: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 dependenciesrun: yarn install --production --pure-lockfile --non-interactive- name: Deployrun: |firebase deploy --token {{secrets.$FIREBASE_TOKEN}}env:CI: trueFIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
Созданный workflow обеспечивает запуск Deploy Firebase каждый раз при пуше в master.
Заключение
Использование связки Firebase Functions + Visual Studio Code Remote Containers + GitHub позволяет добиться гладкого процесса разработки и деплоя облачных функций.