GitHub Action中如何传递Shell脚本计算的哈希值至JS并导出环境变量?
从Bash脚本向GitHub Action的JS代码传递Git哈希的简洁方案
以下是几种无需解析脚本输出的可靠方案:
方案1:临时文件传递(适合JS需后续处理哈希的场景)
利用GitHub Action提供的RUNNER_TEMP临时目录,在Bash脚本中将哈希写入文件,再由JS读取。
Bash脚本片段
# 计算当前Git仓库的HEAD哈希 GIT_HASH=$(git rev-parse HEAD) # 将哈希写入临时文件 echo "$GIT_HASH" > "$RUNNER_TEMP/installed_git_hash.txt"
JS代码片段
const fs = require('fs'); const path = require('path'); const core = require('@actions/core'); const exec = require('@actions/exec'); async function run() { // 执行安装脚本 await exec.exec('./your-install-script.sh'); // 读取临时文件中的哈希值 const hashFilePath = path.join(process.env.RUNNER_TEMP, 'installed_git_hash.txt'); const gitHash = fs.readFileSync(hashFilePath, 'utf8').trim(); // 导出为工作流环境变量 core.exportVariable('INSTALLED_GIT_HASH', gitHash); } run();
方案2:直接在Bash中导出到工作流环境(最简洁,无需JS中转)
GitHub Action允许通过写入GITHUB_ENV文件直接设置工作流环境变量,JS代码可直接读取该变量,无需额外传递步骤。
Bash脚本片段
# 计算Git哈希 GIT_HASH=$(git rev-parse HEAD) # 将哈希写入GITHUB_ENV,自动成为全局环境变量 echo "INSTALLED_GIT_HASH=${GIT_HASH}" >> "$GITHUB_ENV"
JS代码片段
const core = require('@actions/core'); const exec = require('@actions/exec'); async function run() { await exec.exec('./your-install-script.sh'); // 直接从环境变量读取哈希 const gitHash = process.env.INSTALLED_GIT_HASH; // 若需二次导出(可选,实际写入GITHUB_ENV后已全局可用) core.exportVariable('INSTALLED_GIT_HASH', gitHash); } run();
方案3:带标记的输出捕获(无文件依赖,可靠性高于纯输出解析)
如果不想用文件,可在Bash中用唯一标记包裹哈希输出,JS捕获后通过正则提取,避免和脚本其他输出混淆。
Bash脚本片段
GIT_HASH=$(git rev-parse HEAD) # 用唯一标记包裹哈希,方便JS识别 echo "---GIT_HASH_BEGIN---${GIT_HASH}---GIT_HASH_END---"
JS代码片段
const core = require('@actions/core'); const exec = require('@actions/exec'); async function run() { let scriptOutput = ''; // 捕获脚本的标准输出 const options = { listeners: { stdout: (data) => { scriptOutput += data.toString(); } } }; await exec.exec('./your-install-script.sh', [], options); // 用正则提取标记间的哈希值 const hashMatch = scriptOutput.match(/---GIT_HASH_BEGIN---(.*)---GIT_HASH_END---/); if (hashMatch) { const gitHash = hashMatch[1].trim(); core.exportVariable('INSTALLED_GIT_HASH', gitHash); } else { core.setFailed('Failed to extract Git hash from script output'); } } run();
方案选择建议
- 若需要在JS中对哈希做额外处理(如验证、格式转换),优先选临时文件方案,完全隔离数据,无解析风险
- 若仅需将哈希导出给工作流使用,直接写入GITHUB_ENV是最简洁的方案,无需额外传递逻辑
- 若无法使用文件且需无依赖传递,带标记的输出捕获比纯输出解析可靠得多
内容的提问来源于stack exchange,提问作者Paulo Moura
相关产品推荐
相关产品推荐

