omgkit 2.13.0 → 2.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -10
- package/package.json +2 -2
- package/plugin/agents/api-designer.md +5 -0
- package/plugin/agents/architect.md +8 -0
- package/plugin/agents/brainstormer.md +4 -0
- package/plugin/agents/cicd-manager.md +6 -0
- package/plugin/agents/code-reviewer.md +6 -0
- package/plugin/agents/copywriter.md +2 -0
- package/plugin/agents/data-engineer.md +255 -0
- package/plugin/agents/database-admin.md +10 -0
- package/plugin/agents/debugger.md +10 -0
- package/plugin/agents/devsecops.md +314 -0
- package/plugin/agents/docs-manager.md +4 -0
- package/plugin/agents/domain-decomposer.md +181 -0
- package/plugin/agents/embedded-systems.md +397 -0
- package/plugin/agents/fullstack-developer.md +12 -0
- package/plugin/agents/game-systems-designer.md +375 -0
- package/plugin/agents/git-manager.md +10 -0
- package/plugin/agents/journal-writer.md +2 -0
- package/plugin/agents/ml-engineer.md +284 -0
- package/plugin/agents/observability-engineer.md +353 -0
- package/plugin/agents/oracle.md +9 -0
- package/plugin/agents/performance-engineer.md +290 -0
- package/plugin/agents/pipeline-architect.md +6 -0
- package/plugin/agents/planner.md +12 -0
- package/plugin/agents/platform-engineer.md +325 -0
- package/plugin/agents/project-manager.md +3 -0
- package/plugin/agents/researcher.md +5 -0
- package/plugin/agents/scientific-computing.md +426 -0
- package/plugin/agents/scout.md +3 -0
- package/plugin/agents/security-auditor.md +7 -0
- package/plugin/agents/sprint-master.md +17 -0
- package/plugin/agents/tester.md +10 -0
- package/plugin/agents/ui-ux-designer.md +12 -0
- package/plugin/agents/vulnerability-scanner.md +6 -0
- package/plugin/commands/data/pipeline.md +47 -0
- package/plugin/commands/data/quality.md +49 -0
- package/plugin/commands/domain/analyze.md +34 -0
- package/plugin/commands/domain/map.md +41 -0
- package/plugin/commands/game/balance.md +56 -0
- package/plugin/commands/game/optimize.md +62 -0
- package/plugin/commands/iot/provision.md +58 -0
- package/plugin/commands/ml/evaluate.md +47 -0
- package/plugin/commands/ml/train.md +48 -0
- package/plugin/commands/perf/benchmark.md +54 -0
- package/plugin/commands/perf/profile.md +49 -0
- package/plugin/commands/platform/blueprint.md +56 -0
- package/plugin/commands/security/audit.md +54 -0
- package/plugin/commands/security/scan.md +55 -0
- package/plugin/commands/sre/dashboard.md +53 -0
- package/plugin/registry.yaml +787 -0
- package/plugin/skills/ai-ml/experiment-tracking/SKILL.md +338 -0
- package/plugin/skills/ai-ml/feature-stores/SKILL.md +340 -0
- package/plugin/skills/ai-ml/llm-ops/SKILL.md +454 -0
- package/plugin/skills/ai-ml/ml-pipelines/SKILL.md +390 -0
- package/plugin/skills/ai-ml/model-monitoring/SKILL.md +398 -0
- package/plugin/skills/ai-ml/model-serving/SKILL.md +386 -0
- package/plugin/skills/event-driven/cqrs-patterns/SKILL.md +348 -0
- package/plugin/skills/event-driven/event-sourcing/SKILL.md +334 -0
- package/plugin/skills/event-driven/kafka-deep/SKILL.md +252 -0
- package/plugin/skills/event-driven/saga-orchestration/SKILL.md +335 -0
- package/plugin/skills/event-driven/schema-registry/SKILL.md +328 -0
- package/plugin/skills/event-driven/stream-processing/SKILL.md +313 -0
- package/plugin/skills/game/game-audio/SKILL.md +446 -0
- package/plugin/skills/game/game-networking/SKILL.md +490 -0
- package/plugin/skills/game/godot-patterns/SKILL.md +413 -0
- package/plugin/skills/game/shader-programming/SKILL.md +492 -0
- package/plugin/skills/game/unity-patterns/SKILL.md +488 -0
- package/plugin/skills/iot/device-provisioning/SKILL.md +405 -0
- package/plugin/skills/iot/edge-computing/SKILL.md +369 -0
- package/plugin/skills/iot/industrial-protocols/SKILL.md +438 -0
- package/plugin/skills/iot/mqtt-deep/SKILL.md +418 -0
- package/plugin/skills/iot/ota-updates/SKILL.md +426 -0
- package/plugin/skills/microservices/api-gateway-patterns/SKILL.md +201 -0
- package/plugin/skills/microservices/circuit-breaker-patterns/SKILL.md +246 -0
- package/plugin/skills/microservices/contract-testing/SKILL.md +284 -0
- package/plugin/skills/microservices/distributed-tracing/SKILL.md +246 -0
- package/plugin/skills/microservices/service-discovery/SKILL.md +304 -0
- package/plugin/skills/microservices/service-mesh/SKILL.md +181 -0
- package/plugin/skills/mobile-advanced/mobile-ci-cd/SKILL.md +407 -0
- package/plugin/skills/mobile-advanced/mobile-security/SKILL.md +403 -0
- package/plugin/skills/mobile-advanced/offline-first/SKILL.md +473 -0
- package/plugin/skills/mobile-advanced/push-notifications/SKILL.md +494 -0
- package/plugin/skills/mobile-advanced/react-native-deep/SKILL.md +374 -0
- package/plugin/skills/simulation/numerical-methods/SKILL.md +434 -0
- package/plugin/skills/simulation/parallel-computing/SKILL.md +382 -0
- package/plugin/skills/simulation/physics-engines/SKILL.md +377 -0
- package/plugin/skills/simulation/validation-verification/SKILL.md +479 -0
- package/plugin/skills/simulation/visualization-scientific/SKILL.md +365 -0
- package/plugin/stdrules/ALIGNMENT_PRINCIPLE.md +240 -0
- package/plugin/workflows/ai-engineering/agent-development.md +3 -3
- package/plugin/workflows/ai-engineering/fine-tuning.md +3 -3
- package/plugin/workflows/ai-engineering/model-evaluation.md +3 -3
- package/plugin/workflows/ai-engineering/prompt-engineering.md +2 -2
- package/plugin/workflows/ai-engineering/rag-development.md +4 -4
- package/plugin/workflows/ai-ml/data-pipeline.md +188 -0
- package/plugin/workflows/ai-ml/experiment-cycle.md +203 -0
- package/plugin/workflows/ai-ml/feature-engineering.md +208 -0
- package/plugin/workflows/ai-ml/model-deployment.md +199 -0
- package/plugin/workflows/ai-ml/monitoring-setup.md +227 -0
- package/plugin/workflows/api/api-design.md +1 -1
- package/plugin/workflows/api/api-testing.md +2 -2
- package/plugin/workflows/content/technical-docs.md +1 -1
- package/plugin/workflows/database/migration.md +1 -1
- package/plugin/workflows/database/optimization.md +1 -1
- package/plugin/workflows/database/schema-design.md +3 -3
- package/plugin/workflows/development/bug-fix.md +3 -3
- package/plugin/workflows/development/code-review.md +2 -1
- package/plugin/workflows/development/feature.md +3 -3
- package/plugin/workflows/development/refactor.md +2 -2
- package/plugin/workflows/event-driven/consumer-groups.md +190 -0
- package/plugin/workflows/event-driven/event-storming.md +172 -0
- package/plugin/workflows/event-driven/replay-testing.md +186 -0
- package/plugin/workflows/event-driven/saga-implementation.md +206 -0
- package/plugin/workflows/event-driven/schema-evolution.md +173 -0
- package/plugin/workflows/fullstack/authentication.md +4 -4
- package/plugin/workflows/fullstack/full-feature.md +4 -4
- package/plugin/workflows/game-dev/content-pipeline.md +218 -0
- package/plugin/workflows/game-dev/platform-submission.md +263 -0
- package/plugin/workflows/game-dev/playtesting.md +237 -0
- package/plugin/workflows/game-dev/prototype-to-production.md +205 -0
- package/plugin/workflows/microservices/contract-first.md +151 -0
- package/plugin/workflows/microservices/distributed-tracing.md +166 -0
- package/plugin/workflows/microservices/domain-decomposition.md +123 -0
- package/plugin/workflows/microservices/integration-testing.md +149 -0
- package/plugin/workflows/microservices/service-mesh-setup.md +153 -0
- package/plugin/workflows/microservices/service-scaffolding.md +151 -0
- package/plugin/workflows/omega/1000x-innovation.md +2 -2
- package/plugin/workflows/omega/100x-architecture.md +2 -2
- package/plugin/workflows/omega/10x-improvement.md +2 -2
- package/plugin/workflows/quality/performance-optimization.md +2 -2
- package/plugin/workflows/research/best-practices.md +1 -1
- package/plugin/workflows/research/technology-research.md +1 -1
- package/plugin/workflows/security/penetration-testing.md +3 -3
- package/plugin/workflows/security/security-audit.md +3 -3
- package/plugin/workflows/sprint/sprint-execution.md +2 -2
- package/plugin/workflows/sprint/sprint-retrospective.md +1 -1
- package/plugin/workflows/sprint/sprint-setup.md +1 -1
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
# Mobile CI/CD
|
|
2
|
+
|
|
3
|
+
Fastlane, App Store/Play Store deployment, code signing, beta distribution, and automated release pipelines.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Mobile CI/CD automates building, testing, signing, and deploying mobile applications to app stores and beta distribution channels.
|
|
8
|
+
|
|
9
|
+
## Core Concepts
|
|
10
|
+
|
|
11
|
+
### Pipeline Stages
|
|
12
|
+
- **Build**: Compile and bundle app
|
|
13
|
+
- **Test**: Unit, integration, UI tests
|
|
14
|
+
- **Sign**: Code signing and provisioning
|
|
15
|
+
- **Deploy**: Store submission or beta distribution
|
|
16
|
+
- **Monitor**: Crash reporting, analytics
|
|
17
|
+
|
|
18
|
+
### Key Challenges
|
|
19
|
+
- Code signing complexity
|
|
20
|
+
- Multiple environments
|
|
21
|
+
- Store review processes
|
|
22
|
+
- Version management
|
|
23
|
+
- Build time optimization
|
|
24
|
+
|
|
25
|
+
## Fastlane Setup
|
|
26
|
+
|
|
27
|
+
### iOS Configuration
|
|
28
|
+
```ruby
|
|
29
|
+
# ios/fastlane/Fastfile
|
|
30
|
+
default_platform(:ios)
|
|
31
|
+
|
|
32
|
+
platform :ios do
|
|
33
|
+
desc "Build and deploy to TestFlight"
|
|
34
|
+
lane :beta do
|
|
35
|
+
setup_ci if ENV['CI']
|
|
36
|
+
|
|
37
|
+
# Match for code signing
|
|
38
|
+
match(
|
|
39
|
+
type: "appstore",
|
|
40
|
+
readonly: is_ci,
|
|
41
|
+
app_identifier: "com.company.app"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Increment build number
|
|
45
|
+
increment_build_number(
|
|
46
|
+
build_number: ENV['BUILD_NUMBER'] || latest_testflight_build_number + 1
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Build
|
|
50
|
+
build_app(
|
|
51
|
+
workspace: "App.xcworkspace",
|
|
52
|
+
scheme: "App",
|
|
53
|
+
configuration: "Release",
|
|
54
|
+
export_method: "app-store",
|
|
55
|
+
output_directory: "./build",
|
|
56
|
+
output_name: "App.ipa"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Upload to TestFlight
|
|
60
|
+
upload_to_testflight(
|
|
61
|
+
skip_waiting_for_build_processing: true,
|
|
62
|
+
changelog: changelog_from_git_commits
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Notify
|
|
66
|
+
slack(
|
|
67
|
+
message: "iOS build #{lane_context[SharedValues::BUILD_NUMBER]} uploaded to TestFlight"
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
desc "Deploy to App Store"
|
|
72
|
+
lane :release do
|
|
73
|
+
# Build
|
|
74
|
+
beta
|
|
75
|
+
|
|
76
|
+
# Submit for review
|
|
77
|
+
deliver(
|
|
78
|
+
submit_for_review: true,
|
|
79
|
+
automatic_release: false,
|
|
80
|
+
force: true,
|
|
81
|
+
precheck_include_in_app_purchases: false,
|
|
82
|
+
submission_information: {
|
|
83
|
+
add_id_info_uses_idfa: false
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Android Configuration
|
|
91
|
+
```ruby
|
|
92
|
+
# android/fastlane/Fastfile
|
|
93
|
+
default_platform(:android)
|
|
94
|
+
|
|
95
|
+
platform :android do
|
|
96
|
+
desc "Build and deploy to Play Store internal track"
|
|
97
|
+
lane :beta do
|
|
98
|
+
# Increment version code
|
|
99
|
+
increment_version_code(
|
|
100
|
+
gradle_file_path: "app/build.gradle",
|
|
101
|
+
version_code: ENV['BUILD_NUMBER'].to_i
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Build release bundle
|
|
105
|
+
gradle(
|
|
106
|
+
task: "bundle",
|
|
107
|
+
build_type: "Release",
|
|
108
|
+
properties: {
|
|
109
|
+
"android.injected.signing.store.file" => ENV['KEYSTORE_PATH'],
|
|
110
|
+
"android.injected.signing.store.password" => ENV['KEYSTORE_PASSWORD'],
|
|
111
|
+
"android.injected.signing.key.alias" => ENV['KEY_ALIAS'],
|
|
112
|
+
"android.injected.signing.key.password" => ENV['KEY_PASSWORD']
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Upload to Play Store
|
|
117
|
+
upload_to_play_store(
|
|
118
|
+
track: "internal",
|
|
119
|
+
aab: "app/build/outputs/bundle/release/app-release.aab",
|
|
120
|
+
skip_upload_metadata: true,
|
|
121
|
+
skip_upload_images: true,
|
|
122
|
+
skip_upload_screenshots: true
|
|
123
|
+
)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
desc "Promote to production"
|
|
127
|
+
lane :release do
|
|
128
|
+
upload_to_play_store(
|
|
129
|
+
track: "internal",
|
|
130
|
+
track_promote_to: "production",
|
|
131
|
+
skip_upload_aab: true,
|
|
132
|
+
skip_upload_metadata: false
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Code Signing
|
|
139
|
+
|
|
140
|
+
### iOS Match Setup
|
|
141
|
+
```ruby
|
|
142
|
+
# Matchfile
|
|
143
|
+
git_url("git@github.com:company/certificates.git")
|
|
144
|
+
storage_mode("git")
|
|
145
|
+
|
|
146
|
+
type("appstore") # development, adhoc, appstore
|
|
147
|
+
app_identifier(["com.company.app", "com.company.app.widget"])
|
|
148
|
+
username("ci@company.com")
|
|
149
|
+
|
|
150
|
+
# For CI
|
|
151
|
+
readonly(true) if ENV['CI']
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Android Signing
|
|
155
|
+
```groovy
|
|
156
|
+
// android/app/build.gradle
|
|
157
|
+
android {
|
|
158
|
+
signingConfigs {
|
|
159
|
+
release {
|
|
160
|
+
if (System.getenv("KEYSTORE_PATH")) {
|
|
161
|
+
storeFile file(System.getenv("KEYSTORE_PATH"))
|
|
162
|
+
storePassword System.getenv("KEYSTORE_PASSWORD")
|
|
163
|
+
keyAlias System.getenv("KEY_ALIAS")
|
|
164
|
+
keyPassword System.getenv("KEY_PASSWORD")
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
buildTypes {
|
|
170
|
+
release {
|
|
171
|
+
signingConfig signingConfigs.release
|
|
172
|
+
minifyEnabled true
|
|
173
|
+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## GitHub Actions Pipeline
|
|
180
|
+
|
|
181
|
+
### Complete Workflow
|
|
182
|
+
```yaml
|
|
183
|
+
name: Mobile CI/CD
|
|
184
|
+
|
|
185
|
+
on:
|
|
186
|
+
push:
|
|
187
|
+
branches: [main, develop]
|
|
188
|
+
pull_request:
|
|
189
|
+
branches: [main]
|
|
190
|
+
workflow_dispatch:
|
|
191
|
+
inputs:
|
|
192
|
+
platform:
|
|
193
|
+
description: 'Platform to build'
|
|
194
|
+
required: true
|
|
195
|
+
default: 'both'
|
|
196
|
+
type: choice
|
|
197
|
+
options:
|
|
198
|
+
- ios
|
|
199
|
+
- android
|
|
200
|
+
- both
|
|
201
|
+
|
|
202
|
+
env:
|
|
203
|
+
JAVA_VERSION: '17'
|
|
204
|
+
NODE_VERSION: '18'
|
|
205
|
+
RUBY_VERSION: '3.1'
|
|
206
|
+
|
|
207
|
+
jobs:
|
|
208
|
+
test:
|
|
209
|
+
runs-on: ubuntu-latest
|
|
210
|
+
steps:
|
|
211
|
+
- uses: actions/checkout@v4
|
|
212
|
+
|
|
213
|
+
- name: Setup Node.js
|
|
214
|
+
uses: actions/setup-node@v4
|
|
215
|
+
with:
|
|
216
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
217
|
+
cache: 'yarn'
|
|
218
|
+
|
|
219
|
+
- name: Install dependencies
|
|
220
|
+
run: yarn install --frozen-lockfile
|
|
221
|
+
|
|
222
|
+
- name: Run linter
|
|
223
|
+
run: yarn lint
|
|
224
|
+
|
|
225
|
+
- name: Run tests
|
|
226
|
+
run: yarn test --coverage
|
|
227
|
+
|
|
228
|
+
- name: Upload coverage
|
|
229
|
+
uses: codecov/codecov-action@v3
|
|
230
|
+
|
|
231
|
+
build-ios:
|
|
232
|
+
needs: test
|
|
233
|
+
runs-on: macos-14
|
|
234
|
+
if: github.event.inputs.platform != 'android'
|
|
235
|
+
steps:
|
|
236
|
+
- uses: actions/checkout@v4
|
|
237
|
+
|
|
238
|
+
- name: Setup Ruby
|
|
239
|
+
uses: ruby/setup-ruby@v1
|
|
240
|
+
with:
|
|
241
|
+
ruby-version: ${{ env.RUBY_VERSION }}
|
|
242
|
+
bundler-cache: true
|
|
243
|
+
|
|
244
|
+
- name: Setup Node.js
|
|
245
|
+
uses: actions/setup-node@v4
|
|
246
|
+
with:
|
|
247
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
248
|
+
cache: 'yarn'
|
|
249
|
+
|
|
250
|
+
- name: Install dependencies
|
|
251
|
+
run: |
|
|
252
|
+
yarn install --frozen-lockfile
|
|
253
|
+
cd ios && pod install
|
|
254
|
+
|
|
255
|
+
- name: Setup certificates
|
|
256
|
+
env:
|
|
257
|
+
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
|
|
258
|
+
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_TOKEN }}
|
|
259
|
+
run: |
|
|
260
|
+
cd ios
|
|
261
|
+
bundle exec fastlane match appstore --readonly
|
|
262
|
+
|
|
263
|
+
- name: Build iOS
|
|
264
|
+
env:
|
|
265
|
+
BUILD_NUMBER: ${{ github.run_number }}
|
|
266
|
+
run: |
|
|
267
|
+
cd ios
|
|
268
|
+
bundle exec fastlane beta
|
|
269
|
+
|
|
270
|
+
- name: Upload artifact
|
|
271
|
+
uses: actions/upload-artifact@v4
|
|
272
|
+
with:
|
|
273
|
+
name: ios-build
|
|
274
|
+
path: ios/build/*.ipa
|
|
275
|
+
|
|
276
|
+
build-android:
|
|
277
|
+
needs: test
|
|
278
|
+
runs-on: ubuntu-latest
|
|
279
|
+
if: github.event.inputs.platform != 'ios'
|
|
280
|
+
steps:
|
|
281
|
+
- uses: actions/checkout@v4
|
|
282
|
+
|
|
283
|
+
- name: Setup Java
|
|
284
|
+
uses: actions/setup-java@v4
|
|
285
|
+
with:
|
|
286
|
+
distribution: 'temurin'
|
|
287
|
+
java-version: ${{ env.JAVA_VERSION }}
|
|
288
|
+
|
|
289
|
+
- name: Setup Ruby
|
|
290
|
+
uses: ruby/setup-ruby@v1
|
|
291
|
+
with:
|
|
292
|
+
ruby-version: ${{ env.RUBY_VERSION }}
|
|
293
|
+
bundler-cache: true
|
|
294
|
+
|
|
295
|
+
- name: Setup Node.js
|
|
296
|
+
uses: actions/setup-node@v4
|
|
297
|
+
with:
|
|
298
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
299
|
+
cache: 'yarn'
|
|
300
|
+
|
|
301
|
+
- name: Install dependencies
|
|
302
|
+
run: yarn install --frozen-lockfile
|
|
303
|
+
|
|
304
|
+
- name: Decode keystore
|
|
305
|
+
env:
|
|
306
|
+
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
|
|
307
|
+
run: echo $KEYSTORE_BASE64 | base64 -d > android/app/release.keystore
|
|
308
|
+
|
|
309
|
+
- name: Build Android
|
|
310
|
+
env:
|
|
311
|
+
BUILD_NUMBER: ${{ github.run_number }}
|
|
312
|
+
KEYSTORE_PATH: release.keystore
|
|
313
|
+
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
|
|
314
|
+
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
|
|
315
|
+
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
|
|
316
|
+
run: |
|
|
317
|
+
cd android
|
|
318
|
+
bundle exec fastlane beta
|
|
319
|
+
|
|
320
|
+
- name: Upload artifact
|
|
321
|
+
uses: actions/upload-artifact@v4
|
|
322
|
+
with:
|
|
323
|
+
name: android-build
|
|
324
|
+
path: android/app/build/outputs/bundle/release/*.aab
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## Version Management
|
|
328
|
+
|
|
329
|
+
### Automated Versioning
|
|
330
|
+
```ruby
|
|
331
|
+
# Fastlane action for semantic versioning
|
|
332
|
+
desc "Bump version"
|
|
333
|
+
lane :bump do |options|
|
|
334
|
+
type = options[:type] || "patch" # major, minor, patch
|
|
335
|
+
|
|
336
|
+
current = get_version_number
|
|
337
|
+
new_version = increment_version(current, type)
|
|
338
|
+
|
|
339
|
+
# Update iOS
|
|
340
|
+
increment_version_number(version_number: new_version)
|
|
341
|
+
|
|
342
|
+
# Update Android
|
|
343
|
+
android_set_version_name(version_name: new_version, gradle_file: "../android/app/build.gradle")
|
|
344
|
+
|
|
345
|
+
# Update package.json
|
|
346
|
+
package = JSON.parse(File.read("../package.json"))
|
|
347
|
+
package["version"] = new_version
|
|
348
|
+
File.write("../package.json", JSON.pretty_generate(package))
|
|
349
|
+
|
|
350
|
+
git_commit(
|
|
351
|
+
path: ["ios/", "android/app/build.gradle", "package.json"],
|
|
352
|
+
message: "chore: bump version to #{new_version}"
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
add_git_tag(tag: "v#{new_version}")
|
|
356
|
+
end
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## Best Practices
|
|
360
|
+
|
|
361
|
+
1. **Use Match**: Centralized code signing
|
|
362
|
+
2. **Separate Environments**: Dev, staging, production
|
|
363
|
+
3. **Automate Everything**: No manual steps
|
|
364
|
+
4. **Cache Dependencies**: Speed up builds
|
|
365
|
+
5. **Notify on Failures**: Slack/email alerts
|
|
366
|
+
|
|
367
|
+
## Build Optimization
|
|
368
|
+
|
|
369
|
+
```yaml
|
|
370
|
+
# Cache strategies
|
|
371
|
+
- name: Cache Pods
|
|
372
|
+
uses: actions/cache@v3
|
|
373
|
+
with:
|
|
374
|
+
path: ios/Pods
|
|
375
|
+
key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }}
|
|
376
|
+
|
|
377
|
+
- name: Cache Gradle
|
|
378
|
+
uses: actions/cache@v3
|
|
379
|
+
with:
|
|
380
|
+
path: |
|
|
381
|
+
~/.gradle/caches
|
|
382
|
+
~/.gradle/wrapper
|
|
383
|
+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Anti-Patterns
|
|
387
|
+
|
|
388
|
+
- Manual code signing
|
|
389
|
+
- Hardcoded secrets in code
|
|
390
|
+
- Skipping test stage
|
|
391
|
+
- No build number tracking
|
|
392
|
+
- Missing artifact storage
|
|
393
|
+
|
|
394
|
+
## When to Use
|
|
395
|
+
|
|
396
|
+
- Production mobile apps
|
|
397
|
+
- Team collaboration
|
|
398
|
+
- Frequent releases
|
|
399
|
+
- Multiple environments
|
|
400
|
+
- App Store distribution
|
|
401
|
+
|
|
402
|
+
## When NOT to Use
|
|
403
|
+
|
|
404
|
+
- Personal side projects
|
|
405
|
+
- Very early prototyping
|
|
406
|
+
- No app store deployment
|
|
407
|
+
- Single developer
|