关于 mobile-cicd
面向构建 iOS 和 Android 发布流水线的团队,提供实用技能与示例。内容涵盖构建、测试、代码签名、Beta 分发和应用商店发布检查。
主要功能
- 01Fastlane lane 示例
- 02iOS 和 Android 代码签名
- 03GitHub Actions 工作流示例
- 04Expo EAS 构建与提交命令
- 05Beta 分发选项
- 06发布清单与 ASO 指引
适用场景
- 01搭建移动应用 CI 工作流
- 02管理发布所需的签名凭据
- 03准备供 QA 测试的 Beta 版本
- 04检查应用商店发布准备情况
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ travisjneuman/ .claude --skill mobile-cicd安装后在 Claude Code 中输入/mobile-cicd确认已加载。
详细介绍
移动 CI/CD 技能
用于 iOS 和 Android 应用的自动化构建、测试、签名和部署流水线。
Fastlane
iOS Fastfile
# ios/fastlane/Fastfile
default_platform(:ios)
platform :ios do
desc "Run tests"
lane :test do
run_tests(scheme: "MyApp")
end
desc "Build and upload to TestFlight"
lane :beta do
increment_build_number(xcodeproj: "MyApp.xcodeproj")
match(type: "appstore", readonly: true)
build_app(scheme: "MyApp", export_method: "app-store")
upload_to_testflight(skip_waiting_for_build_processing: true)
slack(message: "New iOS beta uploaded to TestFlight")
end
desc "Deploy to App Store"
lane :release do
match(type: "appstore", readonly: true)
build_app(scheme: "MyApp", export_method: "app-store")
upload_to_app_store(
submit_for_review: true,
automatic_release: false,
force: true
)
end
end
Android Fastfile
# android/fastlane/Fastfile
default_platform(:android)
platform :android do
desc "Run tests"
lane :test do
gradle(task: "test")
end
desc "Build and upload to Play Store internal track"
lane :beta do
gradle(task: "bundleRelease")
upload_to_play_store(
track: "internal",
aab: "app/build/outputs/bundle/release/app-release.aab"
)
end
desc "Promote to production"
lane :release do
upload_to_play_store(
track: "internal",
track_promote_to: "production",
rollout: "0.1" # 10% rollout
)
end
end
代码签名
iOS(match)
# Matchfile
git_url("https://github.com/org/certificates.git")
storage_mode("git")
type("appstore")
app_identifier("com.example.myapp")
# Usage
match(type: "development") # Dev certificates
match(type: "appstore") # Distribution certificates
Android(Keystore)
# Generate keystore (once)
keytool -genkey -v -keystore release.keystore \
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
# Store securely - NEVER commit to git
# Use CI secrets or encrypted storage
// android/app/build.gradle
android {
signingConfigs {
release {
storeFile file(System.getenv("KEYSTORE_PATH") ?: "release.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
}
GitHub Actions
React Native / Expo
# .github/workflows/mobile-ci.yml
name: Mobile CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npm test
- run: npx tsc --noEmit
build-ios:
needs: test
runs-on: macos-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- uses: ruby/setup-ruby@v1
with: { ruby-version: '3.2' }
- run: npm ci
- run: cd ios && bundle install && bundle exec fastlane beta
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
build-android:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with: { java-version: '17', distribution: 'temurin' }
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: cd android && bundle install && bundle exec fastlane beta
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
EAS Build(Expo)
// eas.json
{
"cli": { "version": ">= 12.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal",
"ios": { "simulator": false },
"channel": "preview"
},
"production": {
"channel": "production",
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": { "appleId": "[email protected]", "ascAppId": "1234567890" },
"android": { "serviceAccountKeyPath": "./google-sa-key.json" }
}
}
}
# Build for preview
eas build --profile preview --platform all
# Build for production
eas build --profile production --platform all
# Submit to stores
eas submit --platform ios --latest
eas submit --platform android --latest
# OTA update (no store review)
eas update --branch production --message "Bug fix"
Beta 分发
| 平台 | iOS | Android |
|---|---|---|
| 第一方 | TestFlight | Play Store 内部测试轨道 |
| Firebase | App Distribution | App Distribution |
| Expo | EAS 内部分发 | EAS 内部分发 |
应用商店优化(ASO)
- 标题:主要关键词 + 品牌(iOS 为 30 个字符,Android 为 50 个字符)
- 副标题/简短说明:次要关键词
- 屏幕截图:展示关键功能,使用设备边框
- 关键词字段(仅限 iOS):以逗号分隔,不留空格
- 每次发布新版本时更新发布说明
- 回复评价(有助于提升排名)
发布检查清单
- 现有 CI 检查通过(仅在用户要求时运行新测试)
- 已更新版本号
- 已递增构建号
- 已撰写发布说明
- 已更新屏幕截图(如果 UI 有变化)
- 已由 QA 团队完成 Beta 测试
- 代码签名有效,且近期不会过期
- 隐私政策 URL 为最新版本
- 已检查是否符合应用审核指南
相关资源
~/.claude/skills/react-native/SKILL.md- React Native 开发~/.claude/skills/flutter-development/SKILL.md- Flutter 开发agent-mobile-release-manager技能 - 发布管理专家~/.claude/docs/reference/workflows/deployment-cicd.md- 通用 CI/CD 模式
自动化一切。安全签名。放心发布。
评论
支持 Markdown