Как получить доступ к секретам при использовании flutter web с помощью действий github

#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 файл, игнорируя его в системе управления версиями.

Вот шаги

  1. На вашем локальном компьютере закодируйте содержимое secrets.dart с помощью команды base64:
       base64 lib/path/to/secrets.dart
     
  2. Скопируйте и вставьте выходные данные в свои секреты GitHub, назовите их $SECRETS_FILE_CONTENT или как хотите.
  3. Добавьте этот шаг 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, выполните следующие действия:

Перейдите на вкладку quot;Настройки репозиторияquot;, нажмите quot;Секретыquot;, нажмите quot;Новый секрет репозиторияquot;, НЕ ИСПОЛЬЗУЙТЕ quot;секреты средыquot;, потому что это не работает

Заполните имя переменной, например, SECRETS_FILE_CONTENT, и ее значение, например, содержимое файла в кодировке base-64

Ваш секрет должен отображаться в нижней части пользовательского интерфейса «секреты хранилища», он не должен отображаться в разделе «Секреты среды», так как они не работают с простым ${{ secrets.name_of_variable }} .

Имя переменной SECRETS_FILE_CONTENT теперь должно появиться во втором поле внизу

Чтобы предоставить больше контекста, вот как должен выглядеть файл «действия», например .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