我有一个 flutter web 应用程序,为了访问数据库,我在
secrets.dart
文件中硬编码了一个 APIKey,这工作得很好。我已将此文件添加到 .gitignore
,以防止它将其推送到版本控制。但是,当使用 GitHub actions 部署应用程序时,脚本会失败,因为它没有检测到机密文件。
我确实查看了 Github 上的 Encrypted Secrets 上的文档,它基本上允许存储秘密。但似乎这些秘密只能在 yml 文件中访问。
我想知道如何在我的应用程序中使用这个秘密,以便我的脚本成功运行并部署应用程序。 这是我的文件夹结构
lib/
services/
database.dart /// this file uses the APIkey from secrets.dart
secrets.dart /// contains the APIkey
我能想到的解决这个问题的一种方法是使用
.env
文件,但我不太熟悉如何通过 CI 脚本在 .env 文件中添加密钥。我相信这也能解决我的问题。
这是我的 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
您可以使用您的
secrets.dart
文件,同时在源代码管理中被忽略。
base64命令对
secrets.dart
的内容进行编码:
base64 lib/path/to/secrets.dart
$SECRETS_FILE_CONTENT
或您想要的任何名称。flutter pub get
步骤之前的 yaml脚本中。
# 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 }}
。
为了提供更多上下文,以下是“actions”文件的内容,例如您的存储库中的 .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
run: flutter pub get
当人们使用 firebase 时隐藏
google-services.json
时,这也是相同的过程。或者使用签名密钥(key.jks
或 key.keystore
)。
如果您使用环境秘密而不是存储库秘密,您应该定义您将使用什么环境,请检查一下
jobs:
build:
environment: **ENVIRONMENT NAME HERE**
steps:
- name: blah blah
run: echo blah blah
jobs:
build:
...
environment: Foo
steps:
- uses : actions/checkout@v3
- name : Run some customized action
env :
a : ${{ secrets.Bar }}
b : $ Mona
c : ${{ secrets.Lisa }}
run : |
echo $a
echo $b
echo $c
自从我回答以来,有很多更新, 总结一下, GitHub 上现在有 3 个秘密
Dependabot 超出此范围。
环境的秘密是:
Settings -> Environments -> New Environments -> Environment Secrets
行动的秘密是:
Settings -> Secrets -> Actions -> Repository Secrets
所以如果我们想从逻辑上访问环境的秘密值,我们需要知道2个任意变量:环境名称和环境秘密名称,例如:
EnvironmentName.EnviromentSecretName.EnvironmentSecretValue
正如我所写,
Foo
是EnvironmentName
和
Bar
是 EnvironmentSecretName
和
Mona
是常数
和
Lisa
是操作(存储库)秘密名称
因此,如果我们将环境秘密设置为
Mark
并将存储库秘密设置为 Twain
控制台输出将是:
Mark
Mona
Twain
此外,GitHub 还会对秘密值进行编辑,如“***” 考虑https://zellwk.com/blog/debug-github-actions-secret/ 用于调试它的 URI。