如何在公共GitLab存储库中保持文件的私有性?
我正在开发一个使用多个API的Java应用程序,并希望将API标记保留在公共GitLab存储库之外。该应用程序已打包并部署到远程服务器,我不知道如何在不将令牌包含在GitLab存储库中的情况下使其可用如何在公共GitLab存储库中保持文件的私有性?,gitlab,token,privacy,Gitlab,Token,Privacy,我正在开发一个使用多个API的Java应用程序,并希望将API标记保留在公共GitLab存储库之外。该应用程序已打包并部署到远程服务器,我不知道如何在不将令牌包含在GitLab存储库中的情况下使其可用 有没有一种方法可以限制对文件(或其中一部分)的查看,以对这些标记进行某种“修订”?或者我应该换一种方式吗?不要将API密钥放在您的repo中。通过部署系统维护的环境变量将它们注入到repo的使用中。如果您的部署系统不具备这种能力,您可能需要对其进行更改。它不需要太复杂——例如,将其更改为从git部
有没有一种方法可以限制对文件(或其中一部分)的查看,以对这些标记进行某种“修订”?或者我应该换一种方式吗?不要将API密钥放在您的repo中。通过部署系统维护的环境变量将它们注入到repo的使用中。如果您的部署系统不具备这种能力,您可能需要对其进行更改。它不需要太复杂——例如,将其更改为从git部署代码,然后将
.env
文件单独复制到位。如果您的部署机制只允许您使用git repo,那么您可以将您的环境变量放入一个单独的保持私有的repo中。不要在repo中放入API密钥。通过部署系统维护的环境变量将它们注入到repo的使用中。如果您的部署系统不具备这种能力,您可能需要对其进行更改。它不需要太复杂——例如,将其更改为从git部署代码,然后将.env
文件单独复制到位。如果您的部署机制只允许您使用git repos,那么您可以将您的env Var放入一个单独的保持私有的repo中。将google services.json
文件注入Android应用程序时,我也遇到了类似的情况。长话短说,我们有多个应用程序目标环境,生产环境文件必须以某种方式驻留在构建管道中(提交或其他)
正如前面的回复所指出的,在主回购协议中提交该信息并不理想。例如,开发人员在测试时可能会意外地使用生产环境
我们是如何解决这个问题的
第一,文件。所有这些文件(googleservices.json
和类似的其他文件)在git中都会被忽略,开发者文档声明您必须添加自己的文件
其次,CI构建管道。我们也在使用GitLab,我们将这些文件作为base64编码字符串存储在CI变量中,然后通过GitLab提供的受保护的标记/分支机制控制对这些变量的访问
序列化文件
这里涉及两个步骤。首先序列化base64中的实际文件。其次,将文件从base64反序列化到适当的位置
base64--wrapps=0 google services.json
(如果直接在控制台中完成,wrapps选项将阻止换行)。然后将输出存储在GitLab CI变量中
在.gitlab ci.yml
文件中,执行相反的操作以注入文件
echo$VAR_NAME | base64-d>where/you/need/the/file
然后通过$VAR\u NAME
变量控制要使用的适当环境
这方面的一个例子可以在中找到。本例适用于带有Google Maps API键的
xml
文件,但过程是相同的。我在将Google services.json
文件注入Android应用程序时遇到了类似的情况。长话短说,我们有多个应用程序目标环境,生产环境文件必须以某种方式驻留在构建管道中(提交或其他)
正如前面的回复所指出的,在主回购协议中提交该信息并不理想。例如,开发人员在测试时可能会意外地使用生产环境
我们是如何解决这个问题的
第一,文件。所有这些文件(googleservices.json
和类似的其他文件)在git中都会被忽略,开发者文档声明您必须添加自己的文件
其次,CI构建管道。我们也在使用GitLab,我们将这些文件作为base64编码字符串存储在CI变量中,然后通过GitLab提供的受保护的标记/分支机制控制对这些变量的访问
序列化文件
这里涉及两个步骤。首先序列化base64中的实际文件。其次,将文件从base64反序列化到适当的位置
base64--wrapps=0 google services.json
(如果直接在控制台中完成,wrapps选项将阻止换行)。然后将输出存储在GitLab CI变量中
在.gitlab ci.yml
文件中,执行相反的操作以注入文件
echo$VAR_NAME | base64-d>where/you/need/the/file
然后通过$VAR\u NAME
变量控制要使用的适当环境
这方面的一个例子可以在中找到。本例适用于具有Google Maps API键的
xml
文件,但过程相同。您可以在GitLab项目设置中创建变量。该变量可以在.gitlab ci.yml
文件中使用
比如说,
GOOGLE\u SERVICE\u JSON
的变量,并将该值设置为文件内容的base64格式。您可以通过命令base64 google services.json
.gitlab ci.yml
文件,将GOOGLE\u SERVICE\u JSON
值解码为GOOGLE services.JSON
文件,如下所示
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.3"
ANDROID_SDK_TOOLS: "6609375_latest"
before_script:
- echo ANDROID_COMPILE_SDK ${ANDROID_COMPILE_SDK}
- echo ANDROID_BUILD_TOOLS ${ANDROID_BUILD_TOOLS}
- echo ANDROID_SDK_TOOLS ${ANDROID_SDK_TOOLS}
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- export ANDROID_SDK_ROOT=$PWD/android-sdk-linux
- export SDK_MANAGER="${ANDROID_SDK_ROOT}/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT}"
- echo y | ${SDK_MANAGER} "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | ${SDK_MANAGER} "platform-tools" >/dev/null
- echo y | ${SDK_MANAGER} "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools/
- chmod +x ./gradlew
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- echo y | ${SDK_MANAGER} --licenses
- set -o pipefail
stages:
- build
assembleDebug:
stage: build
script:
- echo ${GOOGLE_SERVICE_JSON} | base64 -d > app/google-services.json
- echo ${KEY_STORE_PROP} | base64 -d > app/keystore.properties
- echo ${STORE_FILE} | base64 -d > app/keystore.jks
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/
assembleRelease:
stage: build
script:
- echo ${GOOGLE_SERVICE_JSON} | base64 -d > app/google-services.json
- echo ${KEY_STORE_PROP} | base64 -d > app/keystore.properties
- echo ${STORE_FILE} | base64 -d > app/keystore.jks
- ./gradlew assembleRelease
artifacts:
paths:
- app/build/outputs/
可以在GitLab项目设置中创建变量。该变量可以在
.gitlab ci.yml
文件中使用
比如说,
GOOGLE\u SERVICE\u JSON
的变量,并将该值设置为文件内容的base64格式。您可以通过命令base64 google services.json
.gitlab ci.yml
文件,解码谷歌
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.3"
ANDROID_SDK_TOOLS: "6609375_latest"
before_script:
- echo ANDROID_COMPILE_SDK ${ANDROID_COMPILE_SDK}
- echo ANDROID_BUILD_TOOLS ${ANDROID_BUILD_TOOLS}
- echo ANDROID_SDK_TOOLS ${ANDROID_SDK_TOOLS}
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- export ANDROID_SDK_ROOT=$PWD/android-sdk-linux
- export SDK_MANAGER="${ANDROID_SDK_ROOT}/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT}"
- echo y | ${SDK_MANAGER} "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | ${SDK_MANAGER} "platform-tools" >/dev/null
- echo y | ${SDK_MANAGER} "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools/
- chmod +x ./gradlew
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- echo y | ${SDK_MANAGER} --licenses
- set -o pipefail
stages:
- build
assembleDebug:
stage: build
script:
- echo ${GOOGLE_SERVICE_JSON} | base64 -d > app/google-services.json
- echo ${KEY_STORE_PROP} | base64 -d > app/keystore.properties
- echo ${STORE_FILE} | base64 -d > app/keystore.jks
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/
assembleRelease:
stage: build
script:
- echo ${GOOGLE_SERVICE_JSON} | base64 -d > app/google-services.json
- echo ${KEY_STORE_PROP} | base64 -d > app/keystore.properties
- echo ${STORE_FILE} | base64 -d > app/keystore.jks
- ./gradlew assembleRelease
artifacts:
paths:
- app/build/outputs/