name: midnight-tooling:midnight-ci description: 用于为Midnight项目设置CI/CD,配置GitHub Actions进行Compact合约编译,在CI中运行TypeScript测试,验证版本一致性,或自动化合约构建。
Midnight CI/CD 设置
使用GitHub Actions为Midnight智能合约项目配置持续集成。
概述
Midnight项目的CI应:
- 验证合约编译
- 运行TypeScript/JavaScript测试
- 验证版本一致性
- 可选地使用证明服务器运行集成测试
快速开始
将适当的工作流模板复制到您的项目:
mkdir -p .github/workflows
# 用于合约编译
cp ${CLAUDE_PLUGIN_ROOT}/skills/midnight-ci/templates/github-workflows/compile-contracts.yml .github/workflows/
# 用于完整的dApp测试
cp ${CLAUDE_PLUGIN_ROOT}/skills/midnight-ci/templates/github-workflows/test-dapp.yml .github/workflows/
可用模板
| 模板 | 用途 |
|---|---|
compile-contracts.yml |
基本的合约编译检查 |
test-dapp.yml |
使用证明服务器的完整dApp测试 |
release.yml |
带版本控制的发布工作流 |
工作流配置
环境设置
所有工作流都需要以下工具:
- Node.js 18+
- Compact开发者工具和编译器
- Docker(用于证明服务器测试)
CI中的Compact安装
- name: 安装Compact开发者工具
run: |
curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/midnightntwrk/compact/releases/latest/download/compact-installer.sh | sh
echo "$HOME/.compact/bin" >> $GITHUB_PATH
- name: 安装Compact编译器
run: compact update
缓存
缓存Compact编译器以加快构建速度:
- name: 缓存Compact编译器
uses: actions/cache@v4
with:
path: ~/.compact
key: compact-${{ runner.os }}-${{ hashFiles('.compact-version') }}
restore-keys: |
compact-${{ runner.os }}-
创建.compact-version文件:
0.26.0
版本锁定
为了可重现的CI,锁定编译器版本:
- name: 安装特定编译器版本
run: |
compact update 0.26.0
compact compile --version # 验证
模板详情
compile-contracts.yml
用于合约编译的最小工作流:
name: 编译合约
on: [push, pull_request]
jobs:
compile:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 设置Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: 安装Compact
run: |
curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/midnightntwrk/compact/releases/latest/download/compact-installer.sh | sh
echo "$HOME/.compact/bin" >> $GITHUB_PATH
compact update
- name: 编译合约
run: compact compile contracts/*.compact build/
test-dapp.yml
使用证明服务器的完整测试:
name: 测试dApp
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
proof-server:
image: midnightnetwork/proof-server:latest
ports:
- 6300:6300
options: >-
--health-cmd "curl -f http://localhost:6300/health || exit 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
# ... 设置步骤 ...
- name: 运行测试
run: npm test
env:
PROOF_SERVER_URL: http://localhost:6300
最佳实践
1. 锁定所有版本
env:
NODE_VERSION: '20'
COMPACT_VERSION: '0.26.0'
PROOF_SERVER_TAG: '4.0.0'
2. 使用 npm ci
- name: 安装依赖
run: npm ci
3. 缓存依赖
- name: 缓存node模块
uses: actions/cache@v4
with:
path: node_modules
key: npm-${{ hashFiles('package-lock.json') }}
4. 版本不匹配时快速失败
添加版本检查步骤:
- name: 验证版本一致性
run: |
COMPILER_VERSION=$(compact compile --version)
EXPECTED="0.26.0"
if [[ "$COMPILER_VERSION" != *"$EXPECTED"* ]]; then
echo "版本不匹配:预期 $EXPECTED,得到 $COMPILER_VERSION"
exit 1
fi
5. 工件上传
保存编译后的合约:
- name: 上传编译后的合约
uses: actions/upload-artifact@v4
with:
name: contracts
path: build/
retention-days: 7
CI故障排除
Compact未找到
确保PATH已更新:
echo "$HOME/.compact/bin" >> $GITHUB_PATH
证明服务器不健康
增加启动时间:
options: >-
--health-retries 10
--health-start-period 30s
Node版本问题
指定确切版本:
node-version: '20.10.0'
缓存失效
在缓存键中包含版本:
key: compact-${{ env.COMPACT_VERSION }}-${{ runner.os }}
其他资源
templates/github-workflows/- 即用型工作流文件references/ci-best-practices.md- 详细的CI指南
有关本地环境设置,请参阅midnight-setup技能。