You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub Actions中配置Spring Boot环境变量解决Maven构建失败

GitHub Actions中Maven构建Firebase配置Bean失败问题排查

问题背景

在GitHub Actions执行mvn clean install构建项目时,Firebase配置Bean无法实例化,核心是googleJsonCredentials环境变量传递异常。

Firebase配置Bean代码

@Configuration
@PropertySource(value = "file:${secrets.properties}", ignoreResourceNotFound=true)
public class FirebaseConfig {

    @Value("${google.credentials:invalid}")
    String googleJsonCredentials;

    @Bean("FirebaseApp")
    FirebaseApp getFirebaseApp() throws IOException {
        InputStream serviceAccount = new ByteArrayInputStream(googleJsonCredentials.getBytes());

        FirebaseOptions options = FirebaseOptions.builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("https://hatley-intranet.firebaseio.com").build();
        FirebaseApp app = FirebaseApp.initializeApp(options);
        return app;
    }
}

已尝试的环境变量配置方式

仓库已配置名为GOOGLE_CREDENTIALS的密钥,尝试三种方式传递环境变量:

  • 配置文件顶部全局设置:
env:
  google.credentials: ${{ secrets.GOOGLE_CREDENTIALS }}
  • 单独步骤设置环境变量:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      ...
      - name: Set Google credentials in the environment variables
        run: |
          echo "google.credentials=${{ secrets.GOOGLE_CREDENTIALS }}" >> "$GITHUB_ENV"
  • Maven步骤内直接设置:
- name: Build with Maven
  env:
    google.credentials: ${{ secrets.GOOGLE_CREDENTIALS }}
  run: mvn clean install

报错信息

org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.google.firebase.FirebaseApp]: Factory method 'getFirebaseApp' threw exception with message: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

问题原因与解决方案

核心原因

GitHub Secrets中的JSON内容包含换行符,直接通过环境变量传递时,换行符会被自动转义或丢失,导致googleJsonCredentials拿到的是不完整、格式错误的JSON字符串,无法被Google Credentials解析。

解决方法

方法1:通过Maven命令行参数直接传递(推荐)

绕过环境变量的转义问题,直接在Maven命令中传入参数,Spring会优先读取命令行属性:

- name: Build with Maven
  run: mvn clean install -Dgoogle.credentials="${{ secrets.GOOGLE_CREDENTIALS }}"

方法2:使用HEREDOC保留JSON格式(环境变量方式)

如果必须用环境变量传递,使用HEREDOC语法完整保留JSON中的换行和特殊字符:

- name: Set Google credentials in environment variables
  run: |
    echo 'google.credentials<<EOF' >> "$GITHUB_ENV"
    echo "${{ secrets.GOOGLE_CREDENTIALS }}" >> "$GITHUB_ENV"
    echo 'EOF' >> "$GITHUB_ENV"

方法3:验证Bean属性读取逻辑

确保@Value("${google.credentials:invalid}")能正确读取到外部传入的属性。Spring的属性优先级中,命令行参数 > 环境变量 > 配置文件,因此方法1的可靠性最高。

内容的提问来源于stack exchange,提问作者Danilo P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:52:43