隐藏相机 隐身相机 忍者相机 黑盒相机
© 2025 Shelled Nuts Blog. All rights reserved.
Capture your moments quietly and securely
深入探讨CI/CD环境下的安全性与合规性自动化,重点介绍敏感信息检测工具的选择与集成,助力开发团队保障代码和文档安全,避免合规风险。
Shelled AI (中国)
掌握GitHub Actions,实现文档自动化生成和发布,提升开发效率,避免文档滞后,适合开源项目和团队协作的实用指南。
Shelled AI (中国)
哎,咱们又见面啦!上次那篇《掌握使用GitHub Actions实现文档自动化生成和发布》大家看得还顺利吗?评论区好多朋友都在问:“能不能多讲讲自定义 GitHub Actions(JavaScript/Composite Actions)开发?”好,这次我们就把这个话题掰开揉碎,聊个透!
你是不是也有过这种感觉:GitHub Marketplace 里的现成 Actions 总是差点意思,想要的功能总有点“差一口气”?我自己刚用 Actions 的时候,觉得官方的东西已经很强了,结果项目一复杂,才发现——自定义 Action 才是打开自动化新世界大门的钥匙。说真的,踩过不少坑,走了不少弯路,甚至有一次为了搞定一个自定义 Action,愣是折腾了三小时,最后才发现是 action.yml 写错了名字……是不是很真实?
为什么要聊这个?因为自定义 Actions 不只是让 CI/CD 更灵活,还能让团队协作和代码复用率直接起飞。项目越大、自动化需求越多,自己动手开发 JavaScript Action、Composite Action,甚至 Docker Action,绝对是让你的工作流“如虎添翼”的秘密武器!
今天我们会一起拆解这些内容:
无论你是想为团队打造专属 Workflow 工具,还是想让自动化脚本更优雅可控,这篇文章都能帮你迈出关键一步。别担心,不需要完美起步,哪怕出点小 bug 也没关系,重要的是一起成长。准备好了吗?那我们就正式开启自定义 Actions 的探索之旅吧!
开头先问大家一句:你第一次用 GitHub Actions,是不是也有点懵?我记得自己第一次接触的时候,Workflow、Job、Step 一堆新词,脑子里全是问号。别急,咱们先把这些基础知识理顺,后面开发自定义 Action 才不会“踩雷”。
GitHub Actions 到底是什么?一句话总结——它是 GitHub 官方内置的自动化平台,帮你自动完成代码构建、测试、部署等任务。以前很多人用 Jenkins、Travis CI,现在直接在代码库里搞定 CI/CD,效率飞起。比如我维护的一个开源项目,每次 push 到 main 分支,Actions 自动帮我跑测试、打包、部署到阿里云,省心到飞起。
自动化流程怎么组织?最外层是 Workflow(.github/workflows/
目录下的 YAML 文件),里面可以有多个 Job,每个 Job 又由多个 Step 组成。Job 通常在独立的 Runner 上执行,比如 Ubuntu、Windows、macOS,甚至可以用自托管 Runner。用过腾讯云、阿里云 CI/CD 的朋友,应该对 Runner 这个概念不陌生。
Workflow 什么时候触发?很灵活。最常用的触发事件有 push、pull_request、schedule(定时任务)等。比如我有个 Node.js 项目,每次提交代码或者有 PR 时,Actions 都会自动跑测试,省心又省力。
很多朋友只知道 JavaScript 和 Composite Action,其实还有一个很重要的 Docker Action。我们先来快速过一遍三种类型的区别和适用场景:
有一次我需要用 Python 跑数据分析、再用 Node.js 构建前端,直接用 Composite Action 串起来,省事不少。但如果要用某些只有 Linux 下才有的系统工具,或者需要 Python 3.11 + Node.js 20 的组合环境,Docker Action 就是救命稻草。
说到 JavaScript Actions,刚上手的时候我也一脸懵。Node.js 环境、输入输出、依赖怎么管、action.yml 怎么写?别急,下面我用一个完整的开发流程和代码示例,带你一步步搞定。
建议新建一个专门的目录,比如 .github/actions/string-uppercase/
,结构如下:
.github/
actions/
string-uppercase/
action.yml
index.js
package.json
package-lock.json
const core = require('@actions/core');
try {
// 获取输入参数
const inputStr = core.getInput('input');
// 处理逻辑
const outputStr = inputStr.toUpperCase();
// 设置输出
core.setOutput('output', outputStr);
} catch (error) {
core.setFailed(error.message);
}
name: "String Uppercase"
description: "将输入字符串转成大写"
inputs:
input:
description: "需要转换的字符串"
required: true
outputs:
output:
description: "转换后的大写字符串"
runs:
using: "node20"
main: "dist/index.js"
注意:main
指向的是打包后的文件(推荐用 ncc 打包,见下文)。
小坑提醒:GitHub Actions 不会自动帮你装依赖!有两种做法:
npx @vercel/ncc build index.js -o dist
然后把 dist/index.js
配到 action.yml 里。
可以用 act 工具在本地跑 workflow,调试效率高很多。第一次用的时候我还以为只能在线调试,结果 act 一下子省了我一堆时间。
git tag v1.0.0 && git push origin v1.0.0
经验教训:第一次发布别追求完美,能跑通就行,后续慢慢完善说明和文档。
- name: 字符串大写转换
uses: your-org/string-uppercase-action@v1
with:
input: "hello world"
Composite Actions 是什么?说白了,就是用 YAML 把一堆 shell 命令和其他 Action 拼成一个整体,像搭积木一样。刚开始我也觉得“这玩意有啥用”,结果项目一大,发现它真是省心神器。
name: 'Lint & Format'
description: 'Run ESLint and Prettier, return formatted result'
inputs:
node-version:
description: 'Node.js 版本'
required: false
default: '16'
outputs:
lint-result:
description: 'Lint 执行结果'
runs:
using: 'composite'
steps:
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ inputs['node-version'] }}
- name: Run ESLint
run: |
npx eslint . > lint.log
echo "result=$(cat lint.log)" >> $GITHUB_OUTPUT
- name: Run Prettier
run: npx prettier --check .
- name: Set output
run: echo "lint-result=$(cat lint.log)" >> $GITHUB_OUTPUT
小坑提醒:输出变量要用 $GITHUB_OUTPUT
,直接 echo 没用!
jobs:
lint-job:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: your-org/lint-format-action@v1
id: lint
with:
node-version: '18'
- run: echo "结果:${{ steps.lint.outputs.lint-result }}"
经验分享:别贪多,一次封装一个小流程,后面维护才不会炸锅。输入输出参数写清楚,团队协作更顺畅。
Docker Actions 其实是 GitHub Actions 的“终极形态”。它允许你用 Dockerfile 自定义运行环境,支持任意语言和工具,环境一致性拉满。
runs.using: docker
和 image: Dockerfile
name: "My Docker Action"
description: "在容器中运行的自定义 Action"
runs:
using: "docker"
image: "Dockerfile"
args:
- ${{ inputs.input }}
inputs:
input:
description: "输入参数"
required: true
注意事项:
我的翻车经历:有一次用 Docker Action,结果忘了加 chmod +x entrypoint.sh
,导致 Action 死活跑不起来,调试了半天才发现是权限问题。大家一定要注意!
说到实战,刚开始我也只会用 Marketplace 上的现成 Action。后来项目一复杂,发现自己写 Action 真的能省下不少时间。下面给大家分享几个真实案例:
// .github/actions/run-tests/index.js
const { execSync } = require('child_process');
try {
execSync('npm install', { stdio: 'inherit' });
execSync('npm test', { stdio: 'inherit' });
console.log('✅ 测试通过');
} catch (e) {
console.error('❌ 测试失败');
process.exit(1);
}
workflow 里这样用:
- name: 运行单元测试
uses: ./.github/actions/run-tests
# .github/actions/deploy/action.yml
name: '部署流程'
runs:
using: "composite"
steps:
- name: 安装依赖
run: npm install
- name: 部署到服务器
run: npm run deploy
- name: 通知钉钉
run: curl -X POST ${{ secrets.DINGTALK_WEBHOOK }} -d '{"msgtype": "text", "text": {"content": "部署完成"}}'
- name: 代码规范检查
run: npm run lint
- name: 安全扫描
run: npx sonarqube-scanner
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
安全提醒:敏感信息一定要放在 Secrets 里,别写在代码里!我有次直接写明文 token,结果被安全机器人警告,差点社死……
strategy:
matrix:
node: [14, 16, 18]
db: [mysql, postgres]
steps:
- name: 设置 Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node }}
- name: 测试数据库 ${{ matrix.db }}
run: npm test -- --db=${{ matrix.db }}
经验总结:用 matrix + secrets + 环境变量,可以灵活配置不同环境的部署密钥、通知 webhook,自动化能力直接拉满!
开发自定义 Actions,难免会遇到各种“翻车现场”。下面我把自己踩过的坑和解决办法都列出来,大家别再重复我的错误!
本地用 Node.js 18,Actions Runner 却是 16 或 20,结果一堆语法报错。解决办法:
- uses: actions/setup-node@v4
with:
node-version: '18'
action.yml 里也要写对 runs.using: node20
。
Composite Action 调试不如 JS Action 方便,日志还模糊。我的做法是每一步都加 echo "到这儿了"
,或者用 core.debug 打印变量,逐步排查。
缩进、冒号、变量引用错了,Action 直接挂掉。建议用 yamllint 检查,出错时点开日志看具体哪一行。
敏感信息一定要放在 Secrets,workflow 里用 ${{ secrets.MY_TOKEN }}
调用。调试敏感变量时,只显示前几位,别全量输出:
echo "Token prefix: ${MY_TOKEN:0:4}***"
JS Action 别忘了用 ncc 打包,或者提交 node_modules。否则别人 clone 下来啥都跑不起来。
entrypoint.sh 别忘了加执行权限,不然 Action 会直接报错。
自动化虽好,安全和可维护性也不能忽视。下面这些经验,都是我“用血换来的”:
回头看看,我们已经把自定义 GitHub Actions 的基础原理、三种主流类型、开发流程、实用案例、常见坑点和安全维护全都聊了一遍。是不是感觉自动化其实也没那么神秘?只要动手实践,踩踩坑,很快就能玩转。
下一步,建议你选一个实际项目,试着开发并集成自己的 GitHub Action,比如自动构建发布文档、定制代码检查,或者团队专属的自动化流程。别怕出错,出错了就改,慢慢你也能成为团队里的“自动化大神”!
如果你有更多疑问或者想交流经验,欢迎留言,我们一起进步。毕竟,自动化的路上,大家都是“摸着石头过河”,多分享多成长!
GitHub Actions 高级用法与调试技巧
深入理解事件、上下文、Secrets、环境变量等高级配置,提升 Action 的稳定性与可维护性。
JavaScript/Node.js 在自动化脚本中的应用
掌握如何用 JavaScript/Node.js 编写高效、可复用的自动化脚本,是开发 JavaScript Action 的基础。
YAML 配置最佳实践
学习 YAML 语法、结构化表达和常见陷阱,提升 workflow 配置的可读性与可维护性。
写到这里,感觉自己又复盘了一遍“踩坑史”。自动化的路上,难免会遇到各种奇葩问题,但只要你愿意多试、多问、多总结,迟早能把这些“黑科技”玩得溜溜的。你有没有什么有趣的自动化故事?欢迎留言,我们一起吐槽,一起成长!