Разверните загрузочное приложение с открытым исходным кодом в облаке Google с помощью действий GitHub - PullRequest
0 голосов
/ 28 января 2020

У меня есть приложение с пружинной загрузкой с открытым исходным кодом, и я хочу развернуть его на движке облачных приложений Google с помощью GitHub CI.

Моя проблема в том, как сделать все это без жесткого кодирования / раскрытия свойств для производственной среды, таких как:

spring.cloud.gcp.sql.database-name
spring.cloud.gcp.sql.instance-connection-name
spring.datasource.password
spring.datasource.username
google-project-id
google cloud project service account key

Моя идея - поместить все эти значения в секреты github, извлечь их в CI, сделайте пакет CI моим приложением с заданными свойствами и разверните его.

Моя проблема в том, могу ли я упаковать свое приложение таким образом, чтобы я мог заменить данные свойства внутри application-prod.properties?

Моя другая идея состояла в том, чтобы просто определить переменные среды для заданных свойств и заставить приложение извлекать их во время выполнения, но я не уверен, поддерживает ли движок приложения установку переменных среды.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Я бы рекомендовал использовать Документация Secret Manager для безопасного хранения переменных среды в GAE:

Секрет - это глобальный объект проекта, который содержит коллекцию метаданных и секрета версии. Метаданные могут включать местоположения репликации, метки и разрешения. Секретные версии хранят фактические секретные данные, такие как ключ API или учетные данные.

Концептуальный обзор Secret Manager

Здесь вы можете найти java реализация:


import com.google.cloud.secretmanager.v1beta1.AccessSecretVersionRequest;
import com.google.cloud.secretmanager.v1beta1.AccessSecretVersionResponse;
import com.google.cloud.secretmanager.v1beta1.AddSecretVersionRequest;
import com.google.cloud.secretmanager.v1beta1.CreateSecretRequest;
import com.google.cloud.secretmanager.v1beta1.ProjectName;
import com.google.cloud.secretmanager.v1beta1.Replication;
import com.google.cloud.secretmanager.v1beta1.Secret;
import com.google.cloud.secretmanager.v1beta1.SecretManagerServiceClient;
import com.google.cloud.secretmanager.v1beta1.SecretPayload;
import com.google.cloud.secretmanager.v1beta1.SecretVersion;
import com.google.protobuf.ByteString;

public class Quickstart {

  public void quickstart() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String secretId = "your-secret-id";
    quickstart(projectId, secretId);
  }

  public void quickstart(String projectId, String secretId) throws Exception {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecretManagerServiceClient client = SecretManagerServiceClient.create()) {

      // Build the parent name from the project.
      ProjectName parent = ProjectName.of(projectId);

      // Create the parent secret.
      CreateSecretRequest createRequest =
          CreateSecretRequest.newBuilder()
              .setParent(parent.toString())
              .setSecretId(secretId)
              .setSecret(
                  Secret.newBuilder()
                      .setReplication(
                          Replication.newBuilder()
                              .setAutomatic(Replication.Automatic.newBuilder().build())
                              .build())
                      .build())
              .build();

      Secret secret = client.createSecret(createRequest);

      // Add a secret version.
      AddSecretVersionRequest addRequest =
          AddSecretVersionRequest.newBuilder()
              .setParent(secret.getName())
              .setPayload(
                  SecretPayload.newBuilder()
                      .setData(ByteString.copyFromUtf8("hello world!"))
                      .build())
              .build();
      SecretVersion version = client.addSecretVersion(addRequest);

      // Access the secret version.
      AccessSecretVersionRequest accessRequest =
          AccessSecretVersionRequest.newBuilder().setName(version.getName()).build();
      AccessSecretVersionResponse response = client.accessSecretVersion(accessRequest);

      // Print the secret payload.
      //
      // WARNING: Do not print the secret in a production environment - this
      // snippet is showing how to access the secret material.
      String payload = response.getPayload().getData().toStringUtf8();
      System.out.printf("Plaintext: %s\n", payload);
    }
  }
}
0 голосов
/ 31 января 2020

Я получил следующее решение:

Я не передам чувствительные свойства git. В CI перед развертыванием и упаковкой приложения я записываю эти чувствительные свойства с помощью этого действия https://github.com/christian-draeger/write-properties, получая заданные значения из GithubSecrets.

ie: шаг для написания пароля базы данных свойство:

  - name: set database password
    uses: christian-draeger/write-properties@1.0.0
    with:
      path: './src/main/resources/application-prod.properties'
      property: 'spring.datasource.password'
      value: ${{secrets.database_password}}

Мне нравится эта настройка, потому что я настраиваю эти свойства перед упаковкой - она ​​не жестко задана в целевой среде.

Однако с этим действием возникает одно неудобство: кажется, что вы можете написать только одно свойство за раз, поэтому приходится повторять определенные шаги несколько раз для каждого свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...