如何在GitHub Actions中用Secrets配置Google翻译API密钥文件
解决GitHub Action中Google翻译API密钥文件路径问题
问题原因
Google Cloud SDK的GOOGLE_APPLICATION_CREDENTIALS环境变量要求传入密钥文件的路径,但直接将密钥文件内容赋值给该变量时,SDK会把内容当作文件路径去查找,因此触发文件不存在的错误。
解决方案
方法1:在GitHub Action中创建临时密钥文件
修改YAML配置,将Secrets中的密钥内容写入临时文件,再让环境变量指向该文件路径:
name: Lime on: pull_request: types: [opened] jobs: translate: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2.4.1 with: node-version: '14' - name: Install dependencies run: npm install - name: Translate README.md env: GOOGLE_CREDENTIALS_CONTENT: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} GOOGLE_PROJECT_ID: ${{ secrets.GOOGLE_PROJECT_ID }} run: | # 将密钥内容写入临时文件 echo "$GOOGLE_CREDENTIALS_CONTENT" > ./google-secrets.json # 设置环境变量指向临时文件路径 export GOOGLE_APPLICATION_CREDENTIALS="./google-secrets.json" node index.js - name: Commit and push changes uses: EndBug/add-and-commit@v7 with: author_name: ${{ github.actor }} author_email: ${{ secrets.EMAIL }} message: 'Translated README.md to Swahili' add: 'README.md' push: 'true'
- 重命名环境变量避免与SDK默认变量冲突,通过
echo将密钥内容写入临时文件 - 临时文件会在Job结束后自动清理,无需担心敏感信息残留
方法2:修改JavaScript代码直接使用密钥内容
无需创建文件,直接从环境变量读取密钥内容初始化Translate客户端:
const { Translate } = require('@google-cloud/translate').v2; const fs = require('fs'); const dotenv = require('dotenv'); dotenv.config(); // 直接用环境变量中的密钥内容初始化客户端 const translate = new Translate({ credentials: JSON.parse(process.env.GOOGLE_APPLICATION_CREDENTIALS), projectId: process.env.GOOGLE_PROJECT_ID }); async function translateText(text, target) { try { const [translation] = await translate.translate(text, target); return translation; } catch (error) { console.error(`Error translating text: ${error}`); return null; } } const readmePath = 'README.md'; const readmeContent = fs.readFileSync(readmePath, 'utf8'); translateText(readmeContent,'sw' ) .then((translation) => { console.log(`Translation: ${translation}`); const translatedReadmeContent = `${readmeContent}\n\nTranslated Text:\n\n${translation}`; fs.writeFileSync(readmePath, translatedReadmeContent); }) .catch((error) => console.error(`Error: ${error}`));
对应的YAML配置无需修改,保持原有环境变量设置即可:
# 其他步骤不变 - name: Translate README.md env: GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} GOOGLE_PROJECT_ID: ${{ secrets.GOOGLE_PROJECT_ID }} run: | node index.js # 其他步骤不变
- 此方法更简洁,直接解析环境变量中的JSON内容作为认证信息,无需处理文件操作
注意事项
两种方案均不会暴露密钥内容,GitHub Actions会自动对Secrets中的敏感信息进行掩码处理。
内容的提问来源于stack exchange,提问作者Clinton Njiru
相关产品推荐
相关产品推荐

