
liu
本指南介绍如何使用 懒猫微服 CI 模板快速搭建 LPK 应用包的构建和发布流程。面向希望快速上手的开发者,以及需要维护大量应用包的开发者,帮助你通过统一的模板和自动化工作流,高效地构建、发布和维护 LPK 应用包。
项目地址: https://github.com/lazycatapps/hack
参考 使用 Github Actions 实现 Docker 应用的自动更新和发布
lzc-cli appstore login 验证账号可用性需要具备以下基础知识:
在开始之前,确保你的开发环境已安装以下工具:
# 必需工具
- bash
- curl
- make
- git
- Node.js & npm
# 懒猫 CLI 工具
npm install -g @lazycatcloud/lzc-cli
# Docker 相关(仅 docker-lpk 项目需要)
- docker
npm install -g docker2lzc
验证工具安装:
# 在项目初始化后可以运行
make check-tools
使用本模板,你将获得以下能力:
make lpk 和 make deploy 快速构建并测试make config-sync 即可获得最新改进本模板之所以能做到快速开发、批量维护和一键升级,核心在于以下设计:
我们做了什么:
base.mk 中为什么能做到复用:
include base.mk 引入通用能力我们没做什么:
GitHub Actions 工作流
├── 触发层 (Trigger Layer)
│ ├── 定义何时触发构建 (push/tag/PR)
│ ├── 准备构建上下文参数
│ └── 项目可自由修改,同步时不覆盖
│
└── 复用层 (Reusable Layer)
├── 包含实际的构建步骤
├── 统一的 LPK 打包逻辑
└── 模板更新时自动同步
为什么这样设计:
base.mk 中所有目标都以 -default 结尾:
# base.mk 中定义
lpk-default:
lzc-cli project build
# 通过通配规则路由
%: %-default
@ true
项目中覆写:
# 项目的 Makefile
include base.mk
# 覆写 lpk 目标,添加测试
lpk: test-default
@echo "Running tests before build"
lzc-cli project build
为什么能做到复用:
base.mk 中统一定义base.mk 不会影响已覆写的目标如何实现:
为什么能这样做:
lzc-manifest.yml)同样会触发构建如何实现:
make config-sync
为什么能这样做:
升级时会发生什么:
base.mk 总是更新到最新版本(不要修改此文件)reusable-*.yml)总是更新(不要修改这些文件).gitignore、.editorconfig)在缺失时恢复lpk-package.yml、docker-image.yml)默认保留,除非你使用 --sync-include-initMakefile 不会被覆盖lzc-manifest.yml、icon.png 等)不受影响1. 初始化项目 (一次性)
├── 远程执行脚本或交互式初始化
├── 自动下载模板文件到项目目录
├── 生成 Makefile、工作流等基础结构
└── 可选初始化 Git 仓库
2. 本地开发
├── 编写业务逻辑代码
├── 配置 lzc-manifest.yml
├── make lpk # 本地构建测试
└── make deploy # 安装到本地验证
3. 推送到 GitHub
├── git add & commit
├── git push origin main # 构建 LPK,上传为 Artifact
└── git tag v1.0.0 # 创建标签
git push origin v1.0.0 # 构建并发布到应用商店
4. 模板升级(按需)
└── make config-sync # 同步最新模板,获得新功能和修复
模板支持两种项目类型:
| 项目类型 | 适用场景 | 包含内容 |
|---|---|---|
| lpk-only | 不需要在 CI 中构建镜像的应用(如迁移他人应用、仅同步镜像到懒猫微服) | LPK 打包工作流 |
| docker-lpk | 需要在 CI 中自动构建 Docker 镜像的应用 | Docker 镜像构建 + LPK 打包工作流 |
选择建议:
docker-lpklpk-only注意:
- 本指南主要聚焦
lpk-only类型,因为这是最容易上手的方式。关于docker-lpk项目的详细介绍,如果大家有强烈的诉求,我们会再单独提供文档。- docker-lpk 限制:目前 docker 类型的模板只支持构建单个 Docker 镜像,暂不支持构建多个镜像的场景。
适合第一次使用模板的开发者,提供逐步引导:
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh)
脚本会引导你:
执行后会在当前目录创建项目文件夹。

如果你已经知道要创建什么类型的项目,可以直接指定参数:
# 创建 LPK 项目
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--type lpk-only --name my-cli-tool
# 创建 Docker + LPK 项目
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--type docker-lpk --name my-web-service

默认应用 ID 前缀为 cloud.lazycat.app.,如果你需要自定义:
# 设置自定义应用 ID 前缀
APP_ID_PREFIX="com.mycompany.app." \
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--type lpk-only --name my-tool
生成的应用 ID 将会是:com.mycompany.app.my-tool

my-project/
├── .github/
│ └── workflows/ # GitHub Actions 工作流
│ ├── cleanup-artifacts.yml # 定期清理旧构建产物 [⚠️ 同步时覆盖]
│ ├── reusable-lpk-package.yml # LPK 打包复用层 [⚠️ 同步时覆盖]
│ └── lpk-package.yml # LPK 打包触发层 [✅ 可自定义]
│ # docker-lpk 项目还包括:
│ ├── docker-image.yml # Docker 镜像构建触发层 [✅ 可自定义]
│ ├── reusable-docker-image.yml # Docker 镜像构建复用层 [⚠️ 同步时覆盖]
│ └── cleanup-docker-tags.yml # 清理旧 Docker 标签 [⚠️ 同步时覆盖]
├── base.mk # 核心 Makefile [⚠️ 不要修改,同步时覆盖]
├── Makefile # 项目 Makefile [✅ 可自定义,不会被覆盖]
├── lzc-build.yml # 懒猫构建配置 [✅ 可自定义]
├── lzc-manifest.yml # 应用清单 [✅ 项目文件,需手动创建]
├── icon.png # 应用图标 [✅ 项目文件,替换为你的图标]
├── .gitignore # Git 忽略配置 [⚠️ 缺失时恢复]
├── .editorconfig # 编辑器配置 [⚠️ 缺失时恢复]
└── README.md # 项目说明 [✅ 项目文件]
文件说明:
make config-sync 时会自动更新,不要手动修改进入项目目录:
cd my-project
创建应用清单:
创建 lzc-manifest.yml 文件,定义应用的元数据、权限等信息。
提示:如果你需要将 Docker Compose 应用转换为懒猫应用,可以使用
docker2lzc工具辅助生成清单文件:
编写业务代码:根据项目类型编写代码
本地测试:
# 查看可用命令
make help
# 查看项目信息
make info
# 构建 LPK
make lpk
# 构建并安装到本地验证
make deploy
# 卸载应用(保留数据)
make uninstall

推送到 GitHub:
git remote add origin https://github.com/yourusername/my-project.git
git push -u origin main
配置 GitHub Secrets(见下文"GitHub Actions 自动化构建")
如果你已经有一个现成的项目,想要使用本模板的构建系统和工作流,可以通过同步功能实现。
在同步之前,建议备份可能被覆盖的文件:
# 备份重要文件
cp Makefile Makefile.backup
cp -r .github/workflows .github/workflows.backup
进入项目目录,执行同步脚本:
cd your-existing-project
# 同步所有文件
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) --sync
同步时会提示你选择要同步的内容:
重要提示:
lpk-package.yml),以保留你的自定义配置reusable-lpk-package.yml)会被更新--sync-include-init 或选择上面的 全部文件:bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--sync --sync-include-init

如果你在 CI 或脚本中执行同步,可以使用非交互模式:
# 仅同步工作流,指定项目类型
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--sync --sync-target workflows --sync-workflow-type docker-lpk
# 仅同步 Makefile
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--sync --sync-target makefile
# 仅同步通用配置文件(.gitignore、.editorconfig 等)
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--sync --sync-target configs
短参数版本:
# 使用短参数(推荐脚本使用)
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
-s -T workflows -W docker-lpk
同步完成后,检查并恢复你需要保留的自定义部分:
# 对比备份文件
diff Makefile.backup Makefile
diff -r .github/workflows.backup .github/workflows
# 有选择地恢复必要的自定义
# 查看可用目标
make help
# 检查项目信息
make info
# 测试构建
make lpk
# 1. 编写代码或修改配置
vim lzc-manifest.yml
# 2. 本地构建测试
make lpk
# 3. 安装到本地验证功能
make deploy
# 4. 卸载测试(保留数据)
make uninstall
# 5. 完全卸载(清除数据)
make uninstall-clean
如果你没有测试用的 lzc-manifest.yml 可以从这里获取一份:https://github.com/lazycatapps/loki/blob/main/lzc-manifest.yml

查看项目支持的所有命令:
make help
模板还为 Docker 项目和 Go 项目提供了额外的便捷命令,详见 make help 输出。
项目版本会自动从 Git 标签推断:
# 查看当前版本
make version
# 创建新版本
git tag v1.0.0
git push origin v1.0.0
# 版本号会自动更新到构建产物
make lpk
版本推断规则:
v1.0.0)a3c8f47)-dirty 后缀在 GitHub 仓库设置中配置以下 Secrets(用于发布到应用商店):
路径:Settings -> Secrets and variables -> Actions -> New repository secret
必需的 Secrets:
LAZYCAT_USERNAME:懒猫开发者账号用户名LAZYCAT_PASSWORD:懒猫开发者账号密码
组织级别配置(推荐):
如果你在一个组织下维护多个项目,建议在组织级别配置 Secrets,避免逐仓库重复设置。
路径:https://github.com/organizations/YOUR_ORG/settings/secrets/actions
模板提供的默认触发规则:
LPK 打包工作流(lpk-package.yml):
main 分支 → 构建 LPK,上传为 Artifactworkflow_dispatch)自定义触发规则:
触发层工作流可以根据需要修改,同步时不会被覆盖:
# .github/workflows/lpk-package.yml
on:
push:
branches:
- main
- develop # 添加 develop 分支也触发构建
pull_request:
branches:
- main # 添加 PR 时也构建(但不发布)
git add .
git commit -m "feat: add new feature"
git push origin main

# 创建版本标签
git tag v1.0.0
git push origin v1.0.0
重要提示:只有推送 Tag 时才会触发发布流程,日常 push 到分支只会构建但不发布。

在 GitHub 仓库的 Actions 标签页查看工作流执行状态:
https://github.com/YOUR_USERNAME/YOUR_PROJECT/actions
非发布版本的构建产物会保存在 Artifacts 中:
hack 仓库 的模板会持续改进,可能包括:
通过同步,你的项目可以低成本地获得这些改进。
关注仓库更新:建议 Watch 或 Star https://github.com/lazycatapps/hack 以获得最新改进通知。
# 在项目根目录执行
make config-sync
默认会同步所有文件,触发层工作流保持不变。

bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) --sync

# 仅同步 Makefile
make config-sync SYNC_TARGET=makefile
# 仅同步工作流
make config-sync SYNC_TARGET=workflows
# 仅同步通用配置
make config-sync SYNC_TARGET=configs

bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--sync --sync-include-init
警告:这会覆盖你对触发层工作流的自定义,请谨慎使用。
模板采用分层同步策略:
| 文件类型 | 是否可修改 | 默认同步行为 | 包含 --sync-include-init |
|---|---|---|---|
base.mk | ❌ 不要修改 | 总是更新 | 总是更新 |
复用层工作流(reusable-*.yml) | ❌ 不要修改 | 总是更新 | 总是更新 |
触发层工作流(lpk-package.yml 等) | ✅ 可自定义 | 保留不覆盖 | 覆盖为模板版本 |
通用配置文件(.gitignore 等) | ⚠️ 通常不改 | 仅在缺失时创建 | 总是更新 |
项目 Makefile | ✅ 可自定义 | 仅在缺失时创建 | 覆盖为模板版本 |
项目文件(lzc-manifest.yml 等) | ✅ 项目文件 | 不受影响 | 不受影响 |
⚠️ 重要提醒:
base.mk:此文件会在每次同步时被覆盖,你的修改会丢失。如需自定义构建行为,请在项目的 Makefile 中覆写目标。reusable- 开头的工作流文件会在同步时被覆盖。如需自定义 CI 行为,请修改触发层工作流。lpk-package.yml、docker-image.yml 等触发层文件可以自由修改,默认同步不会覆盖。这种设计允许你:
# 查看当前 base.mk 版本
make base-mk-version
输出示例:
[INFO] base.mk version: 2025-11-01 11:00:00
场景:你只需要修改应用的配置文件或清单,不想在本地克隆整个仓库。
步骤:
lzc-manifest.yml)main 分支注意:这种方式适合小的配置修改,如果涉及代码逻辑修改,建议在本地完整测试后再推送。
lzc-cli box default 无法检测到 Box 名称怎么办?原因:未安装 lzc-cli 或未配置默认 Box。
解决方案:
方法 1:手动设置环境变量
export LAZYCAT_BOX_NAME=your-box-name
export REGISTRY=registry.your-box-name.heiyu.space
make info
方法 2:在 Makefile 中设置
LAZYCAT_BOX_NAME := your-box-name
REGISTRY := registry.your-box-name.heiyu.space
方法 3:安装并配置 lzc-cli
npm install -g @lazycatcloud/lzc-cli
lzc-cli box set-default your-box-name
场景:你想自定义某个 Make 目标的行为,比如在 lpk 之前先运行测试。
⚠️ 重要:不要直接修改 base.mk 文件,它会在同步时被覆盖!
正确做法:在项目的 Makefile 中定义同名目标(不带 -default 后缀):
PROJECT_NAME := my-app
PROJECT_TYPE := lpk-only
include base.mk
# 覆盖默认的 lpk 目标
lpk: test-default
@echo "Running custom lpk build with tests"
lzc-cli project build
工作原理:
base.mk 中所有默认目标都以 -default 结尾%: %-default 规则负责路由lpk 目标时,会优先使用你的定义base.mk 不会影响你在 Makefile 中的覆写步骤:
查看 CI 日志:
本地复现:
# 清理旧产物
make clean
# 重新构建
make lpk
# 查看详细错误信息
检查工具版本:
make check-tools
lzc-cli --version
docker --version
检查清单文件:
# 验证 lzc-manifest.yml 格式
cat lzc-manifest.yml
建议的目录结构:
workspace/
├── hack/ # 克隆模板仓库(可选)
├── app1-cli-tool/
├── app2-web-service/
├── app3-backend-api/
└── scripts/
└── sync-all.sh # 批量同步脚本
批量同步脚本示例(scripts/sync-all.sh):
#!/bin/bash
PROJECTS=(
"app1-cli-tool"
"app2-web-service"
"app3-backend-api"
)
for project in "${PROJECTS[@]}"; do
echo "Syncing $project..."
cd "$project"
make config-sync
cd ..
done
场景:你想使用私有 Docker 仓库或阿里云容器镜像服务。
解决方案:
在仓库变量中设置 REGISTRY:
Settings -> Secrets and variables -> Actions -> Variables
REGISTRY = registry.cn-hangzhou.aliyuncs.com/my-namespace
或者在 Makefile 中直接设置:
REGISTRY := registry.cn-hangzhou.aliyuncs.com/my-namespace
配置对应的 Docker Hub Secrets:
DOCKERHUB_USERNAME:你的阿里云账号DOCKERHUB_TOKEN:你的阿里云访问令牌场景:你的项目生成了一些额外的临时文件,想在 make clean 时一并清理。
解决方案:在 Makefile 中设置 CLEAN_EXTRA_PATHS:
PROJECT_NAME := my-app
PROJECT_TYPE := lpk-only
# 添加额外的清理路径
CLEAN_EXTRA_PATHS := temp/ logs/ *.log
include base.mk
base.mk 中的 deploy 目标会自动选择可用的安装工具:
使用 lpk-manager(推荐):
# 列出已安装的应用
lpk-manager list
# 应用数据目录
~/lpk/apps/<app-id>/
使用 lzc-cli:
# 安装和卸载命令已在 make deploy / make uninstall 中集成
# lzc-cli 会根据你的 Box 配置确定数据目录
原因:使用了 --sync-include-init 选项。
解决方案:
方法 1:从备份恢复
cp .github/workflows.backup/docker-image.yml .github/workflows/
方法 2:从模板重新下载
curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/workflows/docker-lpk/docker-image.yml \
-o .github/workflows/docker-image.yml
方法 3:重新初始化(仅复制缺失的触发层)
bash <(curl -fsSL https://raw.githubusercontent.com/lazycatapps/hack/main/scripts/lazycli.sh) \
--sync --sync-target workflows --sync-workflow-type docker-lpk
建议的做法:
使用环境变量:
# 本地开发
export ENV=dev
make docker-run
# 生产环境
export ENV=prod
make docker-run
在 Makefile 中根据环境变量调整参数:
ENV ?= dev
ifeq ($(ENV),prod)
DOCKER_RUN_ARGS := -p 80:80 --restart always
else
DOCKER_RUN_ARGS := -p 8080:80
endif
include base.mk
在 CI 中使用不同的工作流文件:
.github/workflows/deploy-dev.yml.github/workflows/deploy-prod.yml可以! 高级用户可以 fork hack 仓库并自定义:
步骤:
base.mk、工作流模板等以满足你的需求HACK_REPO_MODE=local 或自定义 LAZYCLI_SYNC_SCRIPT_URL 使用你的模板详细方法:见"总结"部分的"进阶选项"
贡献建议:
如果你的改进具有通用性,欢迎提交 PR 到上游仓库!我们欢迎在不破坏已有兼容性的前提下,满足更多场景的贡献。
通过本指南,你应该已经掌握:
构建你自己的 hack 仓库
如果官方模板不能完全满足你的需求,高级用户可以 fork 本仓库并自定义:
Fork 仓库:
# Fork https://github.com/lazycatapps/hack 到你的账号
git clone https://github.com/YOUR_USERNAME/hack.git
自定义模板:
base.mk 添加你的通用目标使用自定义模板:
# 方法 1: 使用本地 hack 仓库
cd ../your-project
HACK_REPO_MODE=local ../hack/scripts/lazycli.sh --sync
# 方法 2: 修改同步 URL
LAZYCLI_SYNC_SCRIPT_URL=https://raw.githubusercontent.com/YOUR_USERNAME/hack/main/scripts/lazycli.sh \
make config-sync
保持与上游同步:
cd hack
git remote add upstream https://github.com/lazycatapps/hack.git
git fetch upstream
git merge upstream/main
贡献回上游
如果你的改进具有通用性,我们非常欢迎你提交 Pull Request 到 https://github.com/lazycatapps/hack:
这样整个社区都能受益于你的贡献!
npm info @lazycatcloud/lzc-cli祝开发愉快! 🚀
如有问题或建议,请在 hack 仓库 提交 Issue。
评论
1牛b