mcpField
M
mobile-cicd

mobile-cicd

github.com/travisjneuman云与 DevOps106147 次安装1 天前更新
代码仓库

关于 mobile-cicd

面向构建 iOS 和 Android 发布流水线的团队,提供实用技能与示例。内容涵盖构建、测试、代码签名、Beta 分发和应用商店发布检查。

主要功能

  1. 01Fastlane lane 示例
  2. 02iOS 和 Android 代码签名
  3. 03GitHub Actions 工作流示例
  4. 04Expo EAS 构建与提交命令
  5. 05Beta 分发选项
  6. 06发布清单与 ASO 指引

适用场景

  1. 01搭建移动应用 CI 工作流
  2. 02管理发布所需的签名凭据
  3. 03准备供 QA 测试的 Beta 版本
  4. 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 分发

平台iOSAndroid
第一方TestFlightPlay Store 内部测试轨道
FirebaseApp DistributionApp Distribution
ExpoEAS 内部分发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