在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.
相关产品推荐
相关产品推荐

