Недавно я создал весь рабочий процесс CI/CD для проекта на работе, это был первый раз, когда я действительно давал конфигурацию CI и автоматическое развертывание с этим стеком. С комбинацией инструментов ниже я чувствую, что достигли правильного сочетания доверия/автоматизации для наших текущих потребностей.
Инструменты и их обязанности
- Кабинета : Мы используем Circleci Для проведения всех наших тестов/проверка линтирования/типа как для переднего конца, так и для бэкинда. Это также оркестровое развертывание бэкэнда для функции FireBase
- Vercel : Мы используем Vercel Развернуть наш передний конец. Это связано с нашим репо GitHub, чтобы автоматически развернуть интерфейс.
- Firebase : Мы используем Firebase Для бэкэнда (безвесочных функций, а также база данных и аутентификация). Как правило, мы будем использовать один проект для разработки и один проект для Prod.
Обзор
Внешний интерфейс
Наш клиент в основном Nextjs Ract app. Он очень хорошо с Vercel с Vercel так как они позади Neardjs, интеграция/инструментарий действительно жидкости.
Чтобы начать, вам нужно:
- У 2 филиалов на Github (обычно я иду с развитием и мастером)
- Зарегистрируйте свои домены PROD и DEV на Vercel
- Свяжите свои 2 домены на правый филиал GitHub
Это должно быть достаточно, чтобы вы начали и могли автоматически развернуть, когда вы объединяете на настроенный ветвь на Vercel.
Если вам нужно настроить шаг застройки, тогда как это команда или выходная папка, вы можете следовать их документация
Переменная среды
Все ваши переменные среды можно настроить непосредственно на Vercel
Если вам нужно предоставить разные значения в вашей кодовой базе на основе ветви, которую вы находитесь на (и, следовательно, вы нацеливаете вашу постановку или продку), вы можете полагаться на Система Env Переменные
export const getEnvVar = (key: string): string => { const isProd = process.env.NEXT_PUBLIC_VERCEL_GITHUB_COMMIT_REF === 'master'; switch (key) { case 'NEXT_PUBLIC_FIREBASE_API_KEY': return isProd ? process.env.NEXT_PUBLIC_PROD_FIREBASE_API_KEY : process.env.NEXT_PUBLIC_FIREBASE_API_KEY; default: throw new Error(`key ${key} is not recognized `); } }
Примечание на хостинге FireBase: Чтобы развернуть его, мы изначально использовали хостинг Firebase, но он был довольно медленным, поскольку вам нужно полагаться на функцию без сервеса от Firebase, чтобы служить контенту сервера.
Если вы хотите использовать хостинг FireBase, вы будете ограничены функцией в US-Central1.
. Это Известное ограничение А пока, если вы хотите служить динамическому контенту, вам придется настроить Google Cloud Run вместо
Задний конец — Firebase Fearbase Функции
Эта часть немного сложнее между местными и продуктами. За этим наблюдается несколько концепций ключа Firebase.
- Проект Firebase Обычно вы используете проект FireBase для вашего продукта, и один для вашей постановки. Это означает, что вам нужно будет переключаться между проектом, когда вы хотите развернуть код на постановке или на PROD. Это будет автоматизировано через CI.
- Сервисная учетная запись : Это один из способов аутентификации самостоятельно в качестве администратора проекта FireBase. Ваша учетная запись услуг может быть сгенерирована на консоли Firebase
- Runtimeconfig: Это конфиг, который вы можете настроить через
Firebase Cli
Обычно добавлять переменные ENV, связанные с вашим проектом FireBase. - Firebase CLI: Инструмент командной строки, который позволяет выполнять несколько задач на Firebase, как:
- Войдите в свой проект FireBase.
- Добавление/выбор проекта, на котором вы сейчас работаете
- Добавление переменной env в ваш проект
- генерировать FirebAsetoken, необходимый для развертывания через CI
Мы пройдем через каждый из них в настройке ниже, не волнуйтесь (я в основном я говорю с собой в следующий раз, когда мне нужно настроить это 😄)
Настройка общих для местных, так и для постановки/Prod
Конфигурация проекта Firebase:
- Поэтому вы сначала нуждаетесь в доступе к одной или двум проектам FireBase. Эта установка будет в основном прохождение, имеющую 2 проекта Firebase (постановка и профзарнита) с каждой собственной аутентификацией и базой данных. Просто войдите на Firebase и следуйте шагам
- Установите Firebase-CLI
npm install -g firebase-tools
- Войдите через Firebase-Cli. Это позволяет следующим шагам
firebase login
- Как только вы вошли в систему, вы сможете добавить различные проекты Firebase в текущую конфигурацию:
firebase use --add
Это должно привести к .firebaserc
Файл в вашем проекте, где у вас будет список ваших проектов. Это важно, поскольку мы полагаемся на эти псевдонимы, чтобы нацелить правильный проект для развертывания на основе филиала позже. Вы бы имели какой-либо выпуск, вы можете обратиться к Firebase-CLI Документация что довольно хорошо.
Переменная среды:
Для ваших переменных ENV вы можете добавить их непосредственно на ваш проект FireBase через Firebase CLI:
firebase functions:config:set someservice.id="THE CLIENT ID"
Вы можете позже получить доступ через:
const functions = require('firebase-functions'); ... const id = functions.config().someservice.id,
Примечание: Эти переменные среды хранятся непосредственно в вашем проекте на Firebase и как таковые вам не нужны их локально. Обычно вы загружаете их локально, чтобы проверить значение вручную. Может быть, хорошая идея для гитигнала, на всякий случай.
Инициализировать администратор SDK:
Чтобы настроить и добавить свой FireBase-admin SDK, вам нужно Добавить учетную запись услуг .
Это приведет к локальному файлу .json, который вы будете размещать под определенной папкой Gitignore на вашем компьютере.
Затем Firebase рекомендует поставить путь к файлу в переменной среды (предыдущий раздел) — вы можете обратиться к Документы Firebase, если это необходимо
import * as admin from 'firebase-admin'; ... const config = functions.config(); const app = admin.initializeApp({ credential: admin.credential.cert(config.credentials.google_application), databaseURL: `https://${config.credentials.project_id}.firebaseio.com` });
Местная настройка
Чтобы разработать локально, обычно я в конечном итоге использую промежуточный проект для базы данных/AUTH и SERVERLENLE. Это может быть достигнуто:
- Выберите свой проект FireBase вручную через Firebase CLI с
Firebase --use xxx.
Примечание: Обратите внимание на какой проект, который вы используете в настоящее время, иногда вы хотите запустить скрипт против PROD, и вы в конечном итоге используете Firebase --use Master
Какой будет выбранный проект, пока вы повторете постановку постановки/Ваш тест ENV
Мы хотим избегать развертывания функций без сервеса вручную на данном этапе и захотите передать эту ответственность перед CI
Настройка CI
CI будет отвечать за развертывание наших функций для FireBase.
Очевидно, некоторые ограничения:
- Вы не хотите разоблачить ваш сервопривод в вашем репо
- Вам необходимо переключить проект, используемый для развертывания на основе ветви
Для достижения этих целей мы должны настроить несколько вещей:
- Возьмите путь к тому, где должна храниться учетная запись вашей службы, и сохраняет ее как переменную ENV на CIRCLECI.
- Возьмите свой местный сервис и кодировать его на Base64 Чтобы сохранить его как переменную env на circleci. Это позволяет Circleci хранить сложную структуру как строку.
- Хорошая практика — это добавить
Base_64
В конце вашего имени переменной. Обычно я в конечном итоге 2 var в circleci, что-то вроде:Function_prod_service_account_base64
иFunction_staging_service_account_base64.
- Возьмите VerviceAccount от CircleCi и декодируйте/скопируйте его через CI в папку Build:
command: echo << parameters.key_env_name >> | base64 -di > ./keys/<< parameters.key_path >>
- Теперь ваш код должен быть готов к развернутую, но вам все равно нужно убедиться, что у вас есть токен, чтобы позволить вашему CI обрабатывать развертывание. Это можно сделать с токен Firebase. Это делается только один раз — вам не нужно делать это каждый раз, когда вы переключаете проект, который вы используете.
- Оттуда вы должны быть в состоянии развернуть функции без серверов, основанные на вашей ветке, как так:
command: ./node_modules/.bin/firebase deploy --token "$FIREBASE_TOKEN" -P << parameters.environment >> --only functions:hubspot,functions:users
Это может быть вызвано только основанным на ветви, против слияния. Вот так
- functions_deploy: requires: - functions-build environment: staging key_path: $STAGING_SERVICE_ACCOUNT_PATH key_env_name: $FUNCTION_STAGING_SERVICE_ACCOUNT_BASE64 filters: branches: only: develop - functions_deploy: requires: - functions-build environment: prod key_path: $PROD_SERVICE_ACCOUNT_PATH key_env_name: $FUNCTION_PROD_SERVICE_ACCOUNT_BASE64 filters: branches: only: master
functions_deploy: executor: node parameters: environment: type: string key_path: type: string key_env_name: type: string working_directory: ~/project/app/functions steps: - checkout: path: ~/project - attach_workspace: at: ~/project - run: name: add service account command: echo << parameters.key_env_name >> | base64 -di > ./keys/<< parameters.key_path >> - run: name: Firebase Deploy command: ./node_modules/.bin/firebase deploy --token "$FIREBASE_TOKEN" -P << parameters.environment >> --only functions:hubspot,functions:users
Это должно быть, и теперь вы должны иметь полностью автоматизированное развертывание с Vercel и Firebase как для переднего конца, так и для резервного копирования вашей среды постановки и продукта.
Я надеюсь, что это было полезно для вас, и что вы узнали несколько вещей по пути, я обязательно сделал!
Оригинал: «https://dev.to/matthieuveillon/continuous-integration-and-deployment-workflow-with-vercel-firebase-and-circleci-20n8»