如何在公共GitLab存储库中保持文件的私有性?

如何在公共GitLab存储库中保持文件的私有性?,gitlab,token,privacy,Gitlab,Token,Privacy,我正在开发一个使用多个API的Java应用程序,并希望将API标记保留在公共GitLab存储库之外。该应用程序已打包并部署到远程服务器,我不知道如何在不将令牌包含在GitLab存储库中的情况下使其可用 有没有一种方法可以限制对文件(或其中一部分)的查看,以对这些标记进行某种“修订”?或者我应该换一种方式吗?不要将API密钥放在您的repo中。通过部署系统维护的环境变量将它们注入到repo的使用中。如果您的部署系统不具备这种能力,您可能需要对其进行更改。它不需要太复杂——例如,将其更改为从git部

我正在开发一个使用多个API的Java应用程序,并希望将API标记保留在公共GitLab存储库之外。该应用程序已打包并部署到远程服务器,我不知道如何在不将令牌包含在GitLab存储库中的情况下使其可用


有没有一种方法可以限制对文件(或其中一部分)的查看,以对这些标记进行某种“修订”?或者我应该换一种方式吗?

不要将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/