#flutter #web #github-actions #secret-key
Вопрос:
У меня есть веб-приложение flutter, и для доступа к базе данных я жестко закодировал APIKey в secrets.dart
файле, и это отлично работает. Я добавил этот файл .gitignore
, чтобы предотвратить его передачу в систему управления версиями. Но когда дело доходит до развертывания приложения с помощью действий на GitHub, сценарий завершается неудачей, поскольку он не обнаруживает файл секретов.
Я просмотрел документы о зашифрованных секретах с Github, которые в основном позволяют хранить секреты.Но похоже, что эти секреты доступны только в файле yml.
Я хотел бы знать, как я могу использовать этот секрет в своем приложении, чтобы мой скрипт успешно работал и развертывал приложение. Вот моя структура папок
lib/
services/
database.dart /// this file uses the APIkey from secrets.dart
secrets.dart /// contains the APIkey
Один из способов решения этой проблемы, который я могу придумать, — это использовать .env
файл, но я не очень хорошо знаком с тем, как добавить секретные ключи в файл .env с помощью сценария CI. Я считаю, что это также решило бы мою проблему.
Вот мой сценарий CI
# This file was auto-generated by the Firebase CLI
# https://github.com/firebase/firebase-tools
name: Deploy to Firebase Hosting on merge
"on":
push:
branches:
- master
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
channel: "master"
- run: flutter pub get
- run: flutter pub run build_runner build --delete-conflicting-outputs
- run: flutter build web --release
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
repoToken: "${{ secrets.GITHUB_TOKEN }}"
firebaseServiceAccount: "${{ secrets.FIREBASE_SERVICE_ACCOUNT_VOCABHUB_34C7F }}"
channelId: live
projectId: vocabhub-34c7f
env:
FIREBASE_CLI_PREVIEWS: hostingchannels
Ответ №1:
Вы можете использовать свой secrets.dart
файл, игнорируя его в системе управления версиями.
Вот шаги
- На вашем локальном компьютере закодируйте содержимое
secrets.dart
с помощью команды base64:base64 lib/path/to/secrets.dart
- Скопируйте и вставьте выходные данные в свои секреты GitHub, назовите их
$SECRETS_FILE_CONTENT
или как хотите. - Добавьте этот шаг CI в свой сценарий yaml непосредственно перед этим
flutter pub get
шагом.# other stuff ... - run: echo $SECRETS_FILE_CONTENT | base64 -d > lib/path/to/secrets.dart env: SECRETS_FILE_CONTENT: ${{ secrets.SECRETS_FILE_CONTENT }} - run: flutter pub get - run: flutter pub run build_runner build --delete-conflicting-outputs - run: flutter build web --release # other stuff ...
Чтобы добавить секрет в пользовательский интерфейс GitHub, выполните следующие действия:
Ваш секрет должен отображаться в нижней части пользовательского интерфейса «секреты хранилища», он не должен отображаться в разделе «Секреты среды», так как они не работают с простым ${{ secrets.name_of_variable }}
.
Чтобы предоставить больше контекста, вот как должен выглядеть файл «действия», например .github/workflows/ci.yml в вашем репозитории:
name: CI
on:
push:
branches: [ main, dev ]
pull_request:
branches: [ main ]
# Allows to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Decode base64 secrets
run: echo $SECRETS_FILE_CONTENTS | base64 -d > lib/path/to/secrets.dart
env:
SECRETS_FILE_CONTENTS: ${{ secrets.SECRETS_FILE_CONTENTS }}
# … put your steps here
- name: Do stuff
run: flutter pub get
Редактировать
Это также один и тот же процесс при скрытии google-services.json
, когда люди работают с firebase. Или с помощью ключей подписи ( key.jks
или key.keystore
).
Комментарии:
1. Черт возьми! похоже, это работает. Не могли бы вы объяснить, пожалуйста, что делает этот шаг
run: echo $SECRETS_FILE_CONTENT | base64 -d > lib/utils/secrets.dart
, это создание файла с содержимым?2. ДА. Эта строка будет декодировать и записывать выходные данные в указанный путь к файлу.
3. Большое вам спасибо, это одно из самых простых и безопасных решений (AFAIK). Я когда-либо видел, я не уверен, почему никто не упомянул об этом. В любом случае, я хотел бы предложить вам награду за этот отличный ответ, я буду ждать еще два дня.
4. поздравляю с наградой
Ответ №2:
если вы используете Секреты среды, а не Секреты хранилища, вам следует определить, какую среду вы будете использовать, ознакомьтесь с этим
jobs:
build:
environment: **ENVIRONMENT NAME HERE**
steps:
- name: blah blah
run: echo blah blah