我有多个环境(开发,测试,生产)并且我正在使用 .env 文件来存储机密信息等...现在我要切换到 GitHub Actions,并且我想使用我的 .env 文件并将它们声明到 github actions yml 的 env
部分中。
但是根据我迄今所见,似乎无法设置文件路径,必须手动重新声明所有变量。
作为最佳实践,我该怎么做?
我有多个环境(开发,测试,生产)并且我正在使用 .env 文件来存储机密信息等...现在我要切换到 GitHub Actions,并且我想使用我的 .env 文件并将它们声明到 github actions yml 的 env
部分中。
但是根据我迄今所见,似乎无法设置文件路径,必须手动重新声明所有变量。
作为最佳实践,我该怎么做?
一个快速的解决方案是在需要用到.env
文件之前手动创建它。
- name: 'Create env file'
run: |
touch .env
echo API_ENDPOINT="https://xxx.execute-api.us-west-2.amazonaws.com" >> .env
echo API_KEY=${{ secrets.API_KEY }} >> .env
cat .env
如果您有许多环境变量,只需将整个文件粘贴到名为ENV_FILE
的 GitHub 私密信息中,然后只需回显整个文件即可。
- name: 'Create env file'
run: |
echo "${{ secrets.ENV_FILE }}" > .env
ENV_FILE
的密钥中,然后只需执行 echo "${{ secrets.ENV_FILE }}" > .env
。我更新了答案,提供了稍微更好的方法。 - DollarAkshay你将.env
文件保存在代码库中:
.env
变量(例如Dotenv Action,Simple Dotenv)。(简单、手动,更新.env
变量时有点麻烦) 你将文件保存在代码库之外(保留并维护更新.env.example
):
你手动将相应的.env
文件(比如.env.stage
、.env.production
)的内容复制到相应的GitHub Actions secret variables(比如WEBSITE_ENV_STAGE
、WEBSITE_ENV_PRODUCTION
)中。
然后在GitHub Actions的工作流脚本中,使用所需的变量创建.env
文件,例如:echo "${{secrets.WEBSITE_ENV_STAGE }}" > .env
,并在工作流中使用它。
(稍微复杂一些,但只需准备一次,然后在本地机器上更改.env
变量,然后一键同步到GitHub) 如第2项所述,文件不在代码库中。
dev
环境中,编写调用API端点并将.env
文件写入所需的GitHub Actions secret变量的NodeJS脚本(例如写入WEBSITE_ENV_STAGE
或同时写入stage和production变量);最简单的方法是将 .env 文件作为 GitHub 密钥创建,然后在您的操作中创建 .env 文件。
因此,第一步是将 .env 文件作为 base64 编码字符串创建为 GitHub 密钥:
openssl base64 -A -in qa.env -out qa.txt
或者
cat qa.env | base64 -w 0 > qa.txt
然后在您的操作中,您可以执行以下操作:
- name: Do Something with env files
env:
QA_ENV_FILE: ${{ secrets.QA_ENV_FILE }}
PROD_ENV_FILE: ${{ secrets.PROD_ENV_FILE }}
run: |
[ "$YOUR_ENVIRONMENT" = qa ] && echo $QA_ENV_FILE | base64 --decode > .env
[ "$YOUR_ENVIRONMENT" = prod ] && echo $PROD_ENV_FILE | base64 --decode > .env
确定 $YOUR_ENVIRONMENT
的方法有很多种,但通常可以从 GITHUB_REF
对象中提取。 您的应用程序应能根据需要读取 .env 文件。
确定$YOUR_ENVIRONMENT
的方式有很多种,但通常可以从GITHUB_REF
对象中提取。您的应用程序应该能够根据需要从.env文件中读取。
.env
文件可能包含很多密钥。将它们编码成字符串的目的是,你不需要在 GitHub secrets 中逐个声明它们。 - munsu编辑: 你使用了Circleci 的Contexts,因此你拥有每个环境的一组密钥。我知道他们正在努力将密钥带到机构级别,也许是团队级别……没有信息表明他们会创建类似CCI中我们拥有的Contexts。
我考虑在yml文件中添加${env}_GITHUB_KEY作为暂时的变通方法,将env作为密钥名称的前缀,例如STAGE_GITHUB_KEY或INTEGRATION_GITHUB_KEY…您觉得如何?
--- 原始回答: 如果我理解正确,您已经在某个地方存储了dotenv文件,并且想要将所有这些密钥注入步骤中,而无需手动将它们添加到github secrets并在每个迁移工作流程中进行映射… 对吗?
有个人制作了一个操作,可以读取dotenv文件并将其值放入输出中,因此您可以在后续的步骤中使用它们。以下是链接:https://github.com/marketplace/actions/dotenv-action
.env文件中存在的任何内容都将被转换为输出变量。 例如,具有以下内容的.env文件:
VERSION=1.0
AUTHOR=Mickey Mouse
你需要做的是:
id: dotenv
uses: ./.github/actions/dotenv-action
然后,稍后您可以像这样引用Alpine版本 ${{ steps.dotenv.outputs.version }}
github action
创建.env
文件。name: Create envfile
on: [push]
jobs:
create-envfile:
runs-on: ubuntu-18.04
steps:
- name: Make envfile
uses: SpicyPizza/create-envfile@v1
with:
envkey_DEBUG: false
envkey_SOME_API_KEY: "123456abcdef"
envkey_SECRET_KEY: ${{ secrets.SECRET_KEY }}
file_name: .env
.env
文件。DEBUG: false
SOME_API_KEY: "123456abcdef"
SECRET_KEY: password123
您可以将所有的密钥导出为环境变量,并从脚本中执行。
我专门创建了一个操作,用于获取所有的密钥并将它们导出为环境变量。
以下是一个示例:
- run: echo "Value of MY_SECRET1: $MY_SECRET1"
env:
MY_SECRET1: ${{ secrets.MY_SECRET1 }}
MY_SECRET2: ${{ secrets.MY_SECRET2 }}
MY_SECRET3: ${{ secrets.MY_SECRET3 }}
MY_SECRET4: ${{ secrets.MY_SECRET4 }}
MY_SECRET5: ${{ secrets.MY_SECRET5 }}
MY_SECRET6: ${{ secrets.MY_SECRET6 }}
...
- uses: oNaiPs/secrets-to-env-action@v1
with:
secrets: ${{ toJSON(secrets) }}
- run: echo "Value of MY_SECRET1: $MY_SECRET1"
链接到操作,其中包含有关配置的更多文档:https://github.com/oNaiPs/secrets-to-env-action
另一种选择是使用github的Environments功能。虽然在免费计划的私有存储库中不可用。 您可以在存储库、配置文件/组织级别和环境中设置作用域变量。离存储库更近的配置变量优先于其他变量。
我尝试使用被接受的解决方案,但GitHub操作对Shell命令发出了投诉。我一直收到这个错误:line 3: unexpected EOF while looking for matching ``'
与其直接在Shell脚本中引用密码,我不得不单独传递它们。
- name: Create env file
run: |
touch .env
echo POSTGRES_USER=${POSTGRES_USER} >> .env
echo POSTGRES_PASSWORD=${POSTGRES_PASSWORD} >> .env
cat .env
env:
POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
另一种方法是按照https://docs.github.com/en/actions/security-guides/encrypted-secrets#limits-for-secrets中所述的方式进行操作。
基本上将您的.env
文件视为“大秘密”。在这种情况下,加密的.env
文件被提交到您的存储库中,这应该没问题。然后,在您的操作中添加一个步骤来解密.env
文件。
这样做可以避免在Github Secrets中为每个单独的密钥创建开销。在这种情况下,唯一需要维护的Github Secret是加密密码。如果您有多个像 qa.env
、prod.env
等的.env
文件...我强烈建议为每个文件使用不同的加密密码,然后将每个加密密码作为"环境密钥"而不是"仓库密钥"存储在Github中(如果您使用Github环境,请参见 https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment)。
如果您不想将(加密的).env
文件提交到您的代码库中,那么我建议使用https://dev59.com/wlIH5IYBdhLWcg3wUMB6#64452700中描述的base64方法(类似于https://docs.github.com/en/actions/security-guides/encrypted-secrets#storing-base64-binary-blobs-as-secrets),然后创建一个新的Github秘密来存储编码内容。
对于像我这样厌恶手动重复任务的人,Github秘密的创建现在可以很容易地通过Github CLI工具进行脚本化。请参见https://cli.github.com/manual/gh_secret_set。它还支持从env文件批量创建秘密(请参见-f
,--env-file
标志)
gh secret set -f .env
。
.env.stage
,.env.production
)的内容到相应的GitHub Actions秘密变量(例如WEBSITE_ENV_STAGE
,WEBSITE_ENV_PRODUCTION
)。然后,在GitHub Actions工作流脚本中,从所需的变量创建.env文件,如下所示:echo "${{ secrets.WEBSITE_ENV_STAGE }}" > .env
,并在工作流程中使用它。 - Valentine Shi.env
文件。请查看我的回答。 - Valentine Shi