GitHub Actions工作流:从Issue提取包名和版本并写入package.json
解决GitHub Actions从Issue主体提取包名和版本并执行npm安装的问题
需求:实现GitHub Actions工作流,当Issue评论出现
/approve时触发,从Issue主体提取包名和版本,存入独立变量,写入package.json并执行npm install。Issue主体格式如下:Issue to pull husky package #1 Package Name husky Package Version 4.3.8 Purpose test-purpose Maintainer Team abc现有代码能打印完整Issue主体,但无法正确提取包名和版本到变量,无法执行
npm i <包名>@<版本>这类命令。
原代码核心问题
while循环语法错误:echo语句位置错误,导致循环逻辑混乱- 错误将Issue主体字符串当作文件路径读取,bash无法直接从字符串按行处理
- 条件判断语法不符合bash规范,未实现捕获关键字下一行内容的逻辑
修正后的完整工作流代码
name: check_issue_approval on: issue_comment: types: [opened, edited] jobs: check_issue_approval: runs-on: ubuntu-latest if: contains(github.event.comment.body, '/approve') steps: # 1. 将Issue主体写入临时文件,方便逐行处理 - name: Write Issue body to temp file run: | echo "${{ github.event.issue.body }}" > issue_body.txt # 2. 提取包名和版本到步骤输出变量 - name: Extract package name and version id: extract_pkg run: | # 提取"Package Name"下一行的包名,去除首尾空格 PKG_NAME=$(grep -A1 "Package Name" issue_body.txt | tail -n1 | xargs) # 提取"Package Version"下一行的版本号,去除首尾空格 PKG_VERSION=$(grep -A1 "Package Version" issue_body.txt | tail -n1 | xargs) # 将变量传递给后续步骤(GitHub Actions官方推荐方式) echo "pkg_name=$PKG_NAME" >> $GITHUB_OUTPUT echo "pkg_version=$PKG_VERSION" >> $GITHUB_OUTPUT # 打印验证提取结果 echo "Extracted package: $PKG_NAME@$PKG_VERSION" # 3. 生成标准格式的package.json文件 - name: Create/Update package.json run: | # 使用jq生成JSON,避免手动拼接语法错误 jq -n \ --arg name "${{ steps.extract_pkg.outputs.pkg_name }}" \ --arg version "${{ steps.extract_pkg.outputs.pkg_version }}" \ '{name: $name, version: $version, dependencies: {($name): $version}}' > package.json # 打印验证package.json内容 cat package.json # 4. 执行NPM包安装(替换为你的私有仓库地址) - name: Install NPM package run: | npm install --registry https://registry.npmjs.org ${{ steps.extract_pkg.outputs.pkg_name }}@${{ steps.extract_pkg.outputs.pkg_version }}
关键细节说明
- 变量提取逻辑:用
grep -A1获取关键字及其下一行内容,tail -n1取出目标行,xargs清除首尾空格,确保变量值干净 - JSON生成:使用
jq工具处理JSON(GitHub Actions默认环境已预装),避免手动拼接字符串导致的语法错误 - 变量传递:采用
$GITHUB_OUTPUT传递步骤间变量,替代已废弃的set-output命令 - 触发控制:通过
if: contains(github.event.comment.body, '/approve')确保只有指定评论触发工作流
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

