[玩具]我把issue打印出来然后揉掉....

起因是以前在做 issues-helper 推广的时候一直没仔细钻研过具体原理,就想着把这个链路跑通顺便自己做一个玩具。

玩具目标是:指定项目的有新的 issue 时打印出一张标签来提醒我有新的任务了。

流程

项目 -> 注册本地 runner

创建issue -> 触发 github action -> 本地 runner 触发 -> 打印一张贴纸

实践

(一)注册 runner

  1. 项目点击 Action 注册一个 Self hosted runners
  1. 按照流程在本地注册 runner
  1. 检查是否在线

(二)触发 issue 指定动作

  1. 设计,我想在 issue 创建的时候进行提醒,并且在分配给某位同事的时候打印出一张贴纸,然后把任务贴在同事电脑上
  2. 编写 action 在issues 有指定动作时触发,由于本地已经有 node 环境了,脚本不用编写安装 Node环境
yaml 复制代码
name: CI

on:
  issues:
    types: [opened, edited, closed, reopened, assigned, unassigned]

jobs:
  issue-create:
    runs-on: self-hosted
    steps:
      - name: Check Out
        uses: actions/checkout@v2

      - name: Issue Create
        uses: ./
        with:
          action: ${{ github.event.action }}
          issue: ${{ toJson(github.event.issue) }}
          repo: ${{ toJson(github.event.repository) }}
  1. 在根路径(uses: ./)下创建 action.yml 作为运行配置
vbnet 复制代码
name: 'Issue to Print'
description: 'test action'
author: 'ajuner'

runs:
  using: 'node16'
  main: 'index.js'

inputs:
  action:
    description: 'Action name'
  issue:
    description: 'Issue number'
  repo:
    description: 'Repository name'
  1. 在 index.js 中接收 action 参数
ini 复制代码
const action = core.getInput("action");
const issue = JSON.parse(core.getInput("issue"));

console.log("action", action);
console.log("issue", issue);

(三)编写打印相关代码

使用条码热敏打印机 TSPL 指令

ini 复制代码
const core = require("@actions/core");
const iconv = require("iconv-lite");
const escpos = require("node-escpos-win");
const usb = escpos.GetDeviceList("USB");
const list = usb.list.filter(
  (item) => item.service === "usbprint" || item.name === "USB 打印支持"
);
const printer = list[0];

if (!printer) {
  console.warn("没有连接usb打印机");
  return;
}

const action = core.getInput("action");
const issue = JSON.parse(core.getInput("issue"));

console.log("action", action);
console.log("issue", issue);

const cmds = [
  "SIZE 45 mm,60 mm",
  "GAP 2 mm,0 mm",
  "DENSITY 15",
  "SPEED 4",
  "DIRECTION 1",
  "CLS",
];

const actionText = {
  opened: `有新的issue #${issue.number}`,
  closed: `issue #${issue.number} 已关闭`,
  reopened: `issue #${issue.number} 已重新打开`,
  edited: `issue #${issue.number} 有更新`,
  assigned: `issue #${issue.number} 已分配`,
  unassigned: `issue #${issue.number} 已取消分配`,
};

cmds.push(`TEXT 0,20,"TSS24.BF2",0,1,1,"${actionText[action]}"`);
cmds.push(`TEXT 0,60,"TSS24.BF2",0,1,1,"标题:${issue.title}"`);
cmds.push(`TEXT 0,100,"TSS24.BF2",0,1,1,"用户:${issue.user.login}"`);
if (!!issue?.assignees?.length) {
  const logins = issue.assignees.map((item) => item.login).join("、");
  cmds.push(`TEXT 0,180,"TSS24.BF2",0,1,1,"任务分配者:${logins}"`);
}
cmds.push("PRINT 1", "");

const content = iconv.encode(cmds.join("\r\n"), "gbk");

const res = escpos.Print(printer.path, content);

console.log(res);

(四)测试issue

查看打印效果

(五)揉掉这个需求然后丢到垃圾桶里

资源

源代码:github.com/ajuner/issu... (node_modules比较小,不想在action里加install流程,别喷)

相关资料:

github.com/actions/too...

github.com/actions-coo...

相关推荐
大怪v1 小时前
AI抢饭?前端佬:我要验牌!
前端·人工智能·程序员
新酱爱学习1 小时前
字节外包一年,我的技术成长之路
前端·程序员·年终总结
小兵张健1 小时前
开源 playwright-pool 会话池来了
前端·javascript·github
goodspeed2 小时前
Git Worktree:多分支并行开发的利器
git·github
IT_陈寒4 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
codingWhat5 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
代码老中医5 小时前
2026年CSS彻底疯了:这6个新特性让我删掉了三分之一JS代码
前端
不会敲代码15 小时前
Zustand:轻量级状态管理,从入门到实践
前端·typescript
踩着两条虫5 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能
扉川川5 小时前
OpenClaw 架构解析:一个生产级 AI Agent 是如何设计的
前端·人工智能