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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:40:24