feat(ci): add comprehensive CI/CD pipeline for all SDKs#257
feat(ci): add comprehensive CI/CD pipeline for all SDKs#257Ethax22 wants to merge 2 commits intoRunanywhereAI:mainfrom
Conversation
- Add Android SDK CI workflow with linting, tests, and coverage - Add React Native SDK CI workflow with ESLint and type checking - Add Flutter SDK CI workflow with Dart analysis - Add integration tests workflow for all example apps - Add release artifacts generation workflow - Fix Android workflow paths and JDK version - Enable Android linting in pre-commit - Add Dependabot for security scanning - Add Android release automation script - Standardize Xcode versions across workflows - Add JaCoCo code coverage for Android SDK
📝 WalkthroughWalkthroughThis PR establishes comprehensive CI/CD infrastructure by adding GitHub Actions workflows for SDK and app testing across Android (Kotlin), Flutter, React Native, and iOS platforms; introduces Dependabot configuration for automated dependency updates; implements release automation scripts for Android and iOS SDKs; updates the Kotlin SDK build with JaCoCo code coverage and Maven publishing; and revises pre-commit hooks and build paths from legacy Android to Kotlin SDK structure. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related issues
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Important
Looks good to me! 👍
Reviewed everything up to 532bc6a in 59 seconds. Click for details.
- Reviewed
49lines of code in14files - Skipped
0files when reviewing. - Skipped posting
14draft comments. View those below. - Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.
1. .github/dependabot.yml:1
- Draft comment:
Verify Dependabot config covers all intended ecosystems and is valid YAML. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
2. .github/workflows/android-app.yml:1
- Draft comment:
Ensure the updated Android app workflow’s formatting and encoding are correct and steps align with project needs. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
3. .github/workflows/android-sdk.yml:1
- Draft comment:
Confirm the Android SDK workflow uses JDK 17 and the updated path 'runanywhere-kotlin' correctly. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
4. .github/workflows/flutter-sdk.yml:1
- Draft comment:
Check that the Flutter SDK workflow’s analyzer, formatter, and build steps target the correct Flutter version. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
5. .github/workflows/integration-tests.yml:1
- Draft comment:
Review integration tests workflow to ensure optimal trigger configurations and comprehensive cross-SDK testing. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
6. .github/workflows/ios-app.yml:1
- Draft comment:
Ensure the iOS app workflow changes are consistent with the iOS SDK workflow, especially around artifact handling. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
7. .github/workflows/ios-sdk.yml:1
- Draft comment:
Verify that the iOS SDK workflow properly uses Xcode 15.2 and SwiftLint as configured. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
8. .github/workflows/react-native-sdk.yml:1
- Draft comment:
Confirm the React Native workflow includes ESLint, TypeScript checks, and native module builds for both platforms. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
9. .github/workflows/release-artifacts.yml:1
- Draft comment:
Check that the release-artifacts workflow automates artifact generation and handles tag creation correctly. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
10. .pre-commit-config.yaml:1
- Draft comment:
Ensure pre-commit hooks, particularly the Android lint hook, correctly reference the updated 'runanywhere-kotlin' path. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
11. scripts/lint-android.sh:1
- Draft comment:
Review the lint-android script changes to ensure lint commands and paths are accurate and the script remains executable. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
12. scripts/release_android_sdk.sh:1
- Draft comment:
Validate the Android release script handles versioning and error cases robustly for automated releases. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
13. scripts/release_ios_sdk.sh:1
- Draft comment:
Double-check that updates to the iOS release script do not impact existing signing or artifact generation flows. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
14. sdk/runanywhere-kotlin/build.gradle.kts:1
- Draft comment:
Confirm the JaCoCo integration in the Gradle build file is correctly configured for coverage reporting. - Reason this comment was not posted:
Confidence changes required:33%<= threshold50%None
Workflow ID: wflow_cIJEjHYh2bqrfK8B
You can customize by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.
There was a problem hiding this comment.
Additional Comments (1)
-
.github/dependabot.yml, line 1 (link)syntax: Critical: File is UTF-16 encoded instead of UTF-8
All files in this PR are encoded in UTF-16LE with BOM, which will cause GitHub Actions, bash, and Gradle to fail parsing. The files contain null bytes between every character visible as spaces in the output.
To fix, re-save all files using UTF-8 encoding:
# Convert all affected files from UTF-16 to UTF-8 for f in .github/dependabot.yml \ .github/workflows/*.yml \ .pre-commit-config.yaml \ scripts/*.sh \ sdk/runanywhere-kotlin/build.gradle.kts; do iconv -f UTF-16LE -t UTF-8 "$f" > "${f}.tmp" && mv "${f}.tmp" "$f" done
This encoding issue likely occurred due to the editor/IDE settings used when creating these files.
14 files reviewed, 1 comment
…tation to 4 spaces - Convert all workflow files from UTF-16 LE to UTF-8 encoding - Convert all script files from UTF-16 LE to UTF-8 encoding - Normalize indentation from 2 spaces to 4 spaces per level - Ensures GitHub Actions workflows parse correctly - Ensures shell scripts execute properly
There was a problem hiding this comment.
Actionable comments posted: 17
Note
Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.pre-commit-config.yaml (1)
1-75: Critical: Tab indentation will cause YAML parsing errors.The pre-commit configuration uses tab characters for indentation. YAML requires consistent space-based indentation for proper parsing. The static analysis error at line 7 confirms this.
Convert all tabs to 2-space indentation throughout the file.
🔎 Example fix for the repos section
repos: - # General hooks - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 - hooks: - - id: trailing-whitespace + # General hooks + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace
♻️ Duplicate comments (1)
.github/workflows/ios-app.yml (1)
27-27: Verify Xcode 15.2 and iPhone 16 simulator availability.Same as
ios-sdk.yml, verify that Xcode 15.2 and the iPhone 16 simulator with OS=18.1 are available on GitHub-hostedmacos-latestrunners.Also applies to: 53-53, 63-63
🟡 Minor comments (8)
sdk/runanywhere-kotlin/build.gradle.kts-21-22 (1)
21-22: Garbled characters in comments indicate encoding issues.Lines 21-22 contain corrupted Unicode characters (
ΓåÆinstead of arrows). This appears to be residual from the UTF-16 to UTF-8 conversion mentioned in the PR.-// - When SDK is root project: path = ":" ΓåÆ module path = ":modules:$moduleName" -// - When SDK is at ":sdk:runanywhere-kotlin": path ΓåÆ ":sdk:runanywhere-kotlin:modules:$moduleName" +// - When SDK is root project: path = ":" → module path = ":modules:$moduleName" +// - When SDK is at ":sdk:runanywhere-kotlin": path → ":sdk:runanywhere-kotlin:modules:$moduleName"scripts/lint-android.sh-20-26 (1)
20-26: Inconsistentprint_statusimplementation compared to other lint scripts.The
print_statusfunction uses corrupted characters. Per the relevant code snippets,lint-all.shandlint-ios.shuse proper Unicode:print_status() { - if [ $1 -eq 0 ]; then - echo -e "${GREEN}Γ£ô $2${NC}" - else - echo -e "${RED}Γ£ù $2${NC}" - fi + if [ $1 -eq 0 ]; then + echo -e "${GREEN}✓ $2${NC}" + else + echo -e "${RED}✗ $2${NC}" + fi }Also note the unusual tab-based indentation which differs from the other scripts.
scripts/release_android_sdk.sh-16-19 (1)
16-19: Garbled Unicode characters in print helper functions.Same encoding issue as the iOS script - emoji characters are corrupted.
-print_success() { echo -e "${GREEN}Γ£ô $*${NC}"; } -print_error() { echo -e "${RED}Γ£ù $*${NC}"; } -print_warning() { echo -e "${YELLOW}ΓÜá $*${NC}"; } -print_info() { echo -e "${BLUE}Γä╣ $*${NC}"; } +print_success() { echo -e "${GREEN}✔ $*${NC}"; } +print_error() { echo -e "${RED}✗ $*${NC}"; } +print_warning() { echo -e "${YELLOW}⚠ $*${NC}"; } +print_info() { echo -e "${BLUE}ℹ $*${NC}"; }scripts/release_ios_sdk.sh-19-22 (1)
19-22: Garbled Unicode characters in print helper functions.The emoji characters are corrupted (e.g.,
Γ£ôinstead of✔). This affects all status output functions.-print_success() { echo -e "${GREEN}Γ£ô $*${NC}"; } -print_error() { echo -e "${RED}Γ£ù $*${NC}"; } -print_warning() { echo -e "${YELLOW}ΓÜá $*${NC}"; } -print_info() { echo -e "${BLUE}Γä╣ $*${NC}"; } +print_success() { echo -e "${GREEN}✔ $*${NC}"; } +print_error() { echo -e "${RED}✗ $*${NC}"; } +print_warning() { echo -e "${YELLOW}⚠ $*${NC}"; } +print_info() { echo -e "${BLUE}ℹ $*${NC}"; }scripts/release_android_sdk.sh-212-212 (1)
212-212: Directory change without error handling.If
cd "$SDK_DIR"fails, the script continues execution in the wrong directory. Add error handling.- cd "$SDK_DIR" + cd "$SDK_DIR" || { print_error "Failed to change to $SDK_DIR"; exit 1; }scripts/lint-android.sh-10-10 (1)
10-10: Garbled Unicode characters throughout the script.Multiple lines contain corrupted Unicode characters (e.g.,
≡ƒñûinstead of🤖,Γ£ôinstead of✓). The related scriptslint-all.shandlint-ios.shuse proper Unicode characters - this script should be consistent.🔎 Key lines to fix
-echo "≡ƒñû Running Android lint checks..." +echo "🤖 Running Android lint checks..." -echo "≡ƒôª Linting Android SDK..." +echo "📦 Linting Android SDK..." -echo "≡ƒô▒ Linting Android Example App..." +echo "📱 Linting Android Example App..." -echo "ΓöüΓöüΓöü..." +echo "═══════════════════════════════════════"Committable suggestion skipped: line range outside the PR's diff.
scripts/release_android_sdk.sh-50-53 (1)
50-53: Missing argument validation for--bumpflag.If
--bumpis passed without a value,$2will be empty or the next flag, andshift 2will fail or consume the wrong argument. Compare with the iOS script (line 56) which uses${2:-}with proper handling.--bump) - BUMP_TYPE="$2" + BUMP_TYPE="${2:-}" + if [[ -z "$BUMP_TYPE" ]]; then + print_error "--bump requires a value (major, minor, or patch)" + exit 1 + fi shift 2 ;;.github/workflows/integration-tests.yml-143-147 (1)
143-147: Update Flutter version from 3.10.0 to a recent stable release.Flutter 3.10.0 (May 2023) is over 2 years old and is vulnerable to CVE-2022-3095 (affecting versions prior to 3.30). Current stable is 3.38.5 (December 2025). For CI/CD, pin an exact version number (e.g.,
'3.38.5') rather than usingchannel: 'stable'alone, as the channel pointer shifts over time and compromises reproducibility.
🧹 Nitpick comments (3)
.github/workflows/react-native-sdk.yml (1)
27-27: Consider upgrading to Node.js 20 LTS.Node.js 18 is entering maintenance mode. Unless there's a specific compatibility requirement, consider using Node.js 20, which is the current LTS version.
What is the current Node.js LTS version and maintenance schedule as of January 2026?Also applies to: 67-67, 104-104
.github/workflows/release-artifacts.yml (1)
114-122: Consider updatingsoftprops/action-gh-releaseto v2 for improved functionality.Version 2.5.0 is available with several benefits: draft release mode (prevents premature publication), support for respecting
working_directoryin file globs (v2.4.0), and asset overwrite control via theoverwrite_filesoption (v2.3.3)..github/workflows/integration-tests.yml (1)
55-58: Excessivecontinue-on-error: truereduces CI signal.Multiple test and build steps use
continue-on-error: true(lines 58, 91, 101, 133, 163). While the PR notes explain this is for known issues, it means the workflow will always appear green even with failures.Consider tracking these as follow-up tasks and removing
continue-on-erroronce the underlying issues are fixed, to restore meaningful CI feedback.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
.github/dependabot.yml.github/workflows/android-app.yml.github/workflows/android-sdk.yml.github/workflows/flutter-sdk.yml.github/workflows/integration-tests.yml.github/workflows/ios-app.yml.github/workflows/ios-sdk.yml.github/workflows/react-native-sdk.yml.github/workflows/release-artifacts.yml.pre-commit-config.yamlscripts/lint-android.shscripts/release_android_sdk.shscripts/release_ios_sdk.shsdk/runanywhere-kotlin/build.gradle.kts
🧰 Additional context used
📓 Path-based instructions (1)
sdk/runanywhere-kotlin/**/*.gradle.kts
📄 CodeRabbit inference engine (CLAUDE.md)
sdk/runanywhere-kotlin/**/*.gradle.kts: Kotlin version must be 2.1.21 or later for the Kotlin Multiplatform SDK.
JVM target must be 17 or later for Kotlin Multiplatform SDK.
Android minSdk must be 24 or later for Kotlin Multiplatform SDK.
Files:
sdk/runanywhere-kotlin/build.gradle.kts
🧠 Learnings (16)
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/androidMain/**/*.kt : Use platform-specific optimizations in their respective source directories: `androidMain/` for Android optimizations, `jvmMain/` for JVM optimizations.
Applied to files:
.github/workflows/android-sdk.yml.github/workflows/android-app.ymlsdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/jvmMain/**/*.kt : Use platform-specific optimizations in their respective source directories: `androidMain/` for Android optimizations, `jvmMain/` for JVM optimizations.
Applied to files:
.github/workflows/android-sdk.yml.github/workflows/android-app.ymlsdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Run pre-commit hooks for code quality enforcement before committing code.
Applied to files:
.pre-commit-config.yaml
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Use `./scripts/sdk.sh` for all Kotlin SDK operations instead of calling Gradle directly. It handles configuration and build complexity.
Applied to files:
scripts/release_android_sdk.shsdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-swift/**/Package.swift : Swift minimum version must be 5.9 or later for iOS SDK.
Applied to files:
.github/workflows/ios-sdk.yml
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : Use the `ModuleRegistry` provider pattern for extensibility and plugin architecture instead of hard-coded dependencies.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/*.gradle.kts : Kotlin version must be 2.1.21 or later for the Kotlin Multiplatform SDK.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : Use coroutines and suspend functions instead of async/await patterns for asynchronous operations.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/*.gradle.kts : JVM target must be 17 or later for Kotlin Multiplatform SDK.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/*.gradle.kts : Android minSdk must be 24 or later for Kotlin Multiplatform SDK.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : Use lazy initialization for service dependencies to avoid memory pressure and allow garbage collection.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : Use Flow instead of AsyncSequence for reactive streams in Kotlin Multiplatform code.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/components/**/*.kt : Implement proper component lifecycle management with initialization, state tracking, and cleanup in BaseComponent.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : NEVER make assumptions when implementing KMP code. ALWAYS refer to the iOS implementation as the definitive source of truth. Check the iOS implementation, copy the logic exactly, and adapt only for Kotlin syntax.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : All business logic, protocols, interfaces, and structures MUST be defined in `commonMain/` for Kotlin Multiplatform projects. Platform-specific implementations must use clear prefixes like `AndroidTTSService.kt`, `JvmTTSService.kt`, etc.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
📚 Learning: 2025-11-26T22:49:40.358Z
Learnt from: CR
Repo: RunanywhereAI/runanywhere-sdks PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-26T22:49:40.358Z
Learning: Applies to sdk/runanywhere-kotlin/**/src/**/*.kt : Use Service Container pattern for centralized dependency injection with lazy initialization.
Applied to files:
sdk/runanywhere-kotlin/build.gradle.kts
🧬 Code graph analysis (2)
scripts/lint-android.sh (2)
scripts/lint-all.sh (1)
print_status(21-27)scripts/lint-ios.sh (1)
print_status(20-26)
scripts/release_android_sdk.sh (1)
scripts/release_ios_sdk.sh (5)
validate_preconditions(85-148)get_current_version(151-157)calculate_new_version(160-186)update_version_references(239-271)create_github_release(328-354)
🪛 actionlint (1.7.9)
.github/workflows/android-sdk.yml
22-22: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/flutter-sdk.yml
22-22: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/react-native-sdk.yml
22-22: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/release-artifacts.yml
17-17: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/ios-app.yml
24-24: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/integration-tests.yml
24-24: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/android-app.yml
24-24: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
.github/workflows/ios-sdk.yml
22-22: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
🪛 YAMLlint (1.37.1)
.github/workflows/android-sdk.yml
[error] 22-22: syntax error: mapping values are not allowed here
(syntax)
.github/workflows/flutter-sdk.yml
[error] 22-22: syntax error: mapping values are not allowed here
(syntax)
.github/dependabot.yml
[error] 5-5: syntax error: expected , but found ''
(syntax)
.github/workflows/react-native-sdk.yml
[error] 22-22: syntax error: mapping values are not allowed here
(syntax)
.github/workflows/release-artifacts.yml
[error] 17-17: syntax error: mapping values are not allowed here
(syntax)
.github/workflows/ios-app.yml
[error] 24-24: syntax error: mapping values are not allowed here
(syntax)
.pre-commit-config.yaml
[error] 7-7: syntax error: mapping values are not allowed here
(syntax)
.github/workflows/integration-tests.yml
[error] 24-24: syntax error: mapping values are not allowed here
(syntax)
.github/workflows/android-app.yml
[error] 24-24: syntax error: mapping values are not allowed here
(syntax)
.github/workflows/ios-sdk.yml
[error] 22-22: syntax error: mapping values are not allowed here
(syntax)
🔇 Additional comments (16)
.github/dependabot.yml (1)
1-52: Configuration structure is well-designed.Once the indentation is fixed, the Dependabot configuration is well-structured with appropriate schedules, PR limits, and labeling for each package ecosystem.
.github/workflows/react-native-sdk.yml (1)
46-46: Acceptable use ofcontinue-on-errorfor optional tooling.Using
continue-on-error: truefor Nitrogen binding generation is reasonable if this is optional tooling or known to be unstable.sdk/runanywhere-kotlin/build.gradle.kts (5)
47-72: JVM toolchain and Android target configuration meet requirements.The configuration correctly sets:
jvmToolchain(17)for JVM 17 toolchainJvmTarget.JVM_17for Android compilationsThis satisfies the coding guideline requiring JVM target 17 or later.
160-168: Android SDK configuration meets minimum requirements.
minSdk = 24satisfies the coding guideline requiring Android minSdk 24 or later. Based on learnings, this is the required minimum for Kotlin Multiplatform SDK.
192-237: JaCoCo configuration is well-structured.The JaCoCo setup correctly:
- Configures tool version 0.8.11
- Depends on both JVM and Android unit tests
- Collects execution data from both test types
- Sets appropriate source and class directories with proper exclusions
Note: The comment on line 193 appropriately mentions Kover as an alternative for full KMP coverage.
277-287: GitHub Packages publishing configuration looks correct.The credentials resolution properly falls back from project properties to environment variables, which supports both local development and CI environments.
3-8: Kotlin version requirement is satisfied.The gradle version catalog specifies
kotlin = "2.1.21", which meets the minimum requirement of 2.1.21 or later for the Kotlin Multiplatform SDK.scripts/release_ios_sdk.sh (1)
84-148: Precondition validation is thorough and well-structured.The function properly checks:
- Repository root location
- Clean git state
- Branch verification with user confirmation
- Required tools availability
- GitHub CLI authentication
- Optional psql availability
- .gitignore configuration
Good defensive programming practices.
scripts/release_android_sdk.sh (2)
76-129: Precondition validation is comprehensive.Good checks for git repository, clean working directory, branch, GitHub CLI installation and authentication, and build file existence. Well-structured validation logic.
211-228: The recommended script path does not exist at the repository root.The review references
./scripts/sdk.sh, but this file is not located at the root level. While a Kotlin SDK build wrapper does exist atsdk/runanywhere-kotlin/scripts/sdk.sh, the current approach of using./gradlew buildand./gradlew testdirectly (after changing to$SDK_DIR) is the established pattern throughout the repository for SDK operations, as seen inlint-all.sh,lint-android.sh, and other release scripts.Likely an incorrect or invalid review comment.
.github/workflows/android-sdk.yml (2)
67-70:continue-on-error: trueon coverage generation is acceptable.Unlike the release workflow, allowing coverage generation to fail without blocking CI is reasonable since it's supplementary reporting.
43-66: Comprehensive lint, build, and test pipeline.The workflow properly sequences:
- Detekt static analysis
- Android Lint
- JVM and Android target builds
- JVM and Android unit tests
Good coverage of the Kotlin Multiplatform project.
.pre-commit-config.yaml (2)
26-34: Android SDK lint path correctly updated to Kotlin module.The path change from
sdk/runanywhere-androidtosdk/runanywhere-kotlinaligns with the repo-wide migration to the Kotlin-based SDK structure.
70-75: CI skip configuration is appropriate.Skipping platform-specific lint hooks in CI makes sense since these require local tooling (Android SDK, SwiftLint) that may not be available or configured in the CI environment. The dedicated CI workflows handle these checks.
scripts/lint-android.sh (1)
32-32: Path correctly updated to Kotlin SDK.The path change to
sdk/runanywhere-kotlinaligns with the repo-wide migration and is consistent with the pre-commit hooks and CI workflows..github/workflows/android-app.yml (1)
47-74: Workflow logic and structure look correct (once YAML is fixed).The build order (SDK → lint → app → tests → artifacts) is appropriate. JDK 17, Gradle caching, and artifact paths are properly configured for the Kotlin SDK structure.
Once the YAML indentation is corrected, this workflow should function as intended.
| version: 2 | ||
| updates: | ||
| # Enable version updates for npm (React Native SDK) | ||
| - package-ecosystem: "npm" | ||
| directory: "/sdk/runanywhere-react-native" | ||
| schedule: | ||
| interval: "weekly" | ||
| open-pull-requests-limit: 5 | ||
| labels: | ||
| - "dependencies" | ||
| - "javascript" | ||
| commit-message: | ||
| prefix: "chore" | ||
| include: "scope" | ||
|
|
||
| # Enable version updates for pub (Flutter SDK) | ||
| - package-ecosystem: "pub" | ||
| directory: "/sdk/runanywhere-flutter" | ||
| schedule: | ||
| interval: "weekly" | ||
| open-pull-requests-limit: 5 | ||
| labels: | ||
| - "dependencies" | ||
| - "dart" | ||
| commit-message: | ||
| prefix: "chore" | ||
| include: "scope" | ||
|
|
||
| # Enable version updates for Gradle (Android SDK) | ||
| - package-ecosystem: "gradle" | ||
| directory: "/sdk/runanywhere-kotlin" | ||
| schedule: | ||
| interval: "weekly" | ||
| open-pull-requests-limit: 5 | ||
| labels: | ||
| - "dependencies" | ||
| - "android" | ||
| commit-message: | ||
| prefix: "chore" | ||
| include: "scope" | ||
|
|
||
| # Enable version updates for GitHub Actions | ||
| - package-ecosystem: "github-actions" | ||
| directory: "/" | ||
| schedule: | ||
| interval: "weekly" | ||
| open-pull-requests-limit: 3 | ||
| labels: | ||
| - "dependencies" | ||
| - "ci" | ||
| commit-message: | ||
| prefix: "ci" |
There was a problem hiding this comment.
CRITICAL: YAML uses tabs instead of spaces - Dependabot config will not parse.
This Dependabot configuration file uses tab indentation, which violates YAML specification. GitHub will not be able to parse this file, and Dependabot will not function.
🔎 Fix: Convert to 2-space indentation
Replace all tabs with 2 spaces per level:
version: 2
updates:
- # Enable version updates for npm (React Native SDK)
- - package-ecosystem: "npm"
- directory: "/sdk/runanywhere-react-native"
- schedule:
- interval: "weekly"
+ # Enable version updates for npm (React Native SDK)
+ - package-ecosystem: "npm"
+ directory: "/sdk/runanywhere-react-native"
+ schedule:
+ interval: "weekly"Apply throughout the file.
Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 YAMLlint (1.37.1)
[error] 5-5: syntax error: expected , but found ''
(syntax)
🤖 Prompt for AI Agents
.github/dependabot.yml lines 1-52: the file uses tab characters for indentation
which makes the YAML invalid; replace all tabs with 2-space indentation for each
level throughout the file so the dependabot entries are valid YAML (preserve
existing key order and nesting, convert every tab to two spaces, and validate
the file with a YAML linter or GitHub preview before committing).
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 |
There was a problem hiding this comment.
Critical: Same YAML indentation error as integration-tests.yml.
The uses: property and all subsequent step properties are indented deeper than - name:, which is invalid YAML syntax. This will prevent the workflow from running.
All properties within a list item must be at the same indentation level.
🔎 Correct indentation pattern
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v4Apply this fix consistently to all steps in the file.
🧰 Tools
🪛 actionlint (1.7.9)
24-24: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
🪛 YAMLlint (1.37.1)
[error] 24-24: syntax error: mapping values are not allowed here
(syntax)
🤖 Prompt for AI Agents
In .github/workflows/android-app.yml around lines 22 to 24, the `uses:` property
and subsequent step properties are indented deeper than the `- name:` line which
is invalid YAML; fix each step so that all properties of the list item (`name:`,
`uses:`, `with:`, `env:`, etc.) share the same indentation level as the `-
name:` entry, and apply this consistent indentation correction to every step in
the file (matching the correct pattern used in integration-tests.yml).
| name: Android SDK CI | ||
|
|
||
| on: | ||
| push: | ||
| branches: [ main ] | ||
| paths: | ||
| - 'sdk/runanywhere-kotlin/**' | ||
| - '.github/workflows/android-sdk.yml' | ||
| pull_request: | ||
| branches: [ main ] | ||
| paths: | ||
| - 'sdk/runanywhere-kotlin/**' | ||
| - '.github/workflows/android-sdk.yml' | ||
|
|
||
| jobs: | ||
| lint-and-build: | ||
| name: Lint, Test and Build Android SDK | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up JDK 17 | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| java-version: '17' | ||
| distribution: 'temurin' | ||
|
|
||
| - name: Cache Gradle packages | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: | | ||
| ~/.gradle/caches | ||
| ~/.gradle/wrapper | ||
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | ||
| restore-keys: | | ||
| ${{ runner.os }}-gradle- | ||
|
|
||
| - name: Grant execute permission for gradlew | ||
| run: chmod +x ./sdk/runanywhere-kotlin/gradlew | ||
|
|
||
| - name: Run Detekt | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew detekt --no-daemon | ||
|
|
||
| - name: Run Android Lint | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew lint --no-daemon | ||
|
|
||
| - name: Build JVM target | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew jvmJar --no-daemon | ||
|
|
||
| - name: Build Android target | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew assemble --no-daemon | ||
|
|
||
| - name: Run JVM tests | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew jvmTest --no-daemon | ||
|
|
||
| - name: Run Android unit tests | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew testDebugUnitTest --no-daemon | ||
|
|
||
| - name: Generate code coverage (JaCoCo) | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew jacocoTestReport --no-daemon | ||
| continue-on-error: true | ||
|
|
||
| - name: Upload coverage to Codecov | ||
| uses: codecov/codecov-action@v4 | ||
| if: always() | ||
| with: | ||
| file: ./sdk/runanywhere-kotlin/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml | ||
| flags: android-sdk | ||
| name: android-sdk-coverage | ||
| fail_ci_if_error: false | ||
|
|
||
| - name: Upload lint results | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: android-sdk-lint-results | ||
| path: sdk/runanywhere-kotlin/build/reports/lint-results-*.html | ||
|
|
||
| - name: Upload Detekt results | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: android-sdk-detekt-results | ||
| path: sdk/runanywhere-kotlin/build/reports/detekt/ | ||
|
|
||
| - name: Upload test results | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: android-sdk-test-results | ||
| path: sdk/runanywhere-kotlin/build/test-results/ | ||
|
|
||
| - name: Upload code coverage reports | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: android-sdk-coverage-reports | ||
| path: sdk/runanywhere-kotlin/build/reports/jacoco/ |
There was a problem hiding this comment.
Critical: Tab indentation will cause YAML parsing errors.
Similar to the release-artifacts workflow, this file uses tab characters for indentation instead of spaces. GitHub Actions requires space-based indentation. The static analysis error at line 22 confirms this parsing failure.
Convert all tabs to 2-space indentation throughout the file.
🔎 Example fix for the trigger section
on:
- push:
- branches: [ main ]
- paths:
- - 'sdk/runanywhere-kotlin/**'
- - '.github/workflows/android-sdk.yml'
+ push:
+ branches: [ main ]
+ paths:
+ - 'sdk/runanywhere-kotlin/**'
+ - '.github/workflows/android-sdk.yml'Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 actionlint (1.7.9)
22-22: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
🪛 YAMLlint (1.37.1)
[error] 22-22: syntax error: mapping values are not allowed here
(syntax)
🤖 Prompt for AI Agents
.github/workflows/android-sdk.yml lines 1-107: the file currently uses tab
characters for indentation (causing the YAML parse error reported at line 22);
replace every leading tab with two space characters across the entire file so
all nested blocks align with 2-space indentation, ensure all block items (on,
jobs, steps, with, etc.) maintain consistent 2-space levels, save and re-run the
workflow (or validate with a YAML linter) to confirm the parsing error is
resolved.
| name: Flutter SDK CI | ||
|
|
||
| on: | ||
| push: | ||
| branches: [ main ] | ||
| paths: | ||
| - 'sdk/runanywhere-flutter/**' | ||
| - '.github/workflows/flutter-sdk.yml' | ||
| pull_request: | ||
| branches: [ main ] | ||
| paths: | ||
| - 'sdk/runanywhere-flutter/**' | ||
| - '.github/workflows/flutter-sdk.yml' | ||
|
|
||
| jobs: | ||
| analyze-and-format: | ||
| name: Analyze and Format Flutter SDK | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up Flutter | ||
| uses: subosito/flutter-action@v2 | ||
| with: | ||
| flutter-version: '3.10.0' | ||
| channel: 'stable' | ||
|
|
||
| - name: Get dependencies | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: flutter pub get | ||
|
|
||
| - name: Run Dart analyzer | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: flutter analyze | ||
|
|
||
| - name: Check code formatting | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: dart format --set-exit-if-changed . | ||
|
|
||
| build-ios: | ||
| name: Build iOS Native Module | ||
| runs-on: macos-latest | ||
| needs: analyze-and-format | ||
|
|
||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Select Xcode version | ||
| run: sudo xcode-select -s /Applications/Xcode_15.2.app | ||
|
|
||
| - name: Set up Flutter | ||
| uses: subosito/flutter-action@v2 | ||
| with: | ||
| flutter-version: '3.10.0' | ||
| channel: 'stable' | ||
|
|
||
| - name: Get dependencies | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: flutter pub get | ||
|
|
||
| - name: Build iOS | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: flutter build ios --no-codesign | ||
| continue-on-error: true | ||
|
|
||
| build-android: | ||
| name: Build Android Native Module | ||
| runs-on: ubuntu-latest | ||
| needs: analyze-and-format | ||
|
|
||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up JDK 17 | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| java-version: '17' | ||
| distribution: 'temurin' | ||
|
|
||
| - name: Set up Flutter | ||
| uses: subosito/flutter-action@v2 | ||
| with: | ||
| flutter-version: '3.10.0' | ||
| channel: 'stable' | ||
|
|
||
| - name: Get dependencies | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: flutter pub get | ||
|
|
||
| - name: Build Android | ||
| working-directory: ./sdk/runanywhere-flutter | ||
| run: flutter build apk --debug | ||
| continue-on-error: true |
There was a problem hiding this comment.
CRITICAL: YAML uses tabs instead of spaces - workflow will not execute.
This new workflow file uses tab indentation throughout, making it invalid YAML that GitHub Actions cannot parse.
🔎 Fix: Convert to 2-space indentation
Replace all tabs with spaces (2 spaces per indentation level):
name: Flutter SDK CI
on:
- push:
- branches: [ main ]
- paths:
- - 'sdk/runanywhere-flutter/**'
- - '.github/workflows/flutter-sdk.yml'
+ push:
+ branches: [ main ]
+ paths:
+ - 'sdk/runanywhere-flutter/**'
+ - '.github/workflows/flutter-sdk.yml'Apply throughout the entire file.
Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 actionlint (1.7.9)
22-22: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
🪛 YAMLlint (1.37.1)
[error] 22-22: syntax error: mapping values are not allowed here
(syntax)
🤖 Prompt for AI Agents
.github/workflows/flutter-sdk.yml lines 1-97: the workflow file is invalid
because it uses tab characters for indentation; replace all tabs with spaces
(use 2 spaces per indentation level as suggested) throughout the entire file so
YAML parses correctly, ensuring each nested block (on:, jobs:, job steps:,
with:, etc.) is indented consistently with spaces and no tabs remain.
| flutter-version: '3.10.0' | ||
| channel: 'stable' |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat .github/workflows/flutter-sdk.ymlRepository: RunanywhereAI/runanywhere-sdks
Length of output: 3537
🌐 Web query:
latest stable Flutter version January 2026
💡 Result:
The latest stable Flutter release (as of January 2, 2026) is Flutter 3.38.1. [1][2]
Sources:
- Flutter release notes / docs site. [1]
- Flutter announce (stable 3.38.1 announcement). [2]
Update Flutter version to 3.38.1 or latest stable.
Flutter 3.10.0 (June 2023) is 2.5 years old and 28 minor versions behind the current stable release (3.38.1). Update to the latest stable version to include security patches and improvements.
This affects the Flutter setup steps in all three jobs: analyze-and-format, build-ios, and build-android (lines 27, 57, and 87).
🤖 Prompt for AI Agents
.github/workflows/flutter-sdk.yml around lines 27-28 (and similarly update the
occurrences at ~57 and ~87): the workflow currently pins flutter-version:
'3.10.0' which is outdated; update each flutter-version entry used in
analyze-and-format, build-ios, and build-android jobs to flutter-version:
'3.38.1' (or the desired latest stable) and keep channel: 'stable' so the
workflow installs the current stable Flutter release.
| -scheme RunAnywhereReactNative \ | ||
| -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.1' \ | ||
| -derivedDataPath build | ||
| continue-on-error: true |
There was a problem hiding this comment.
Remove continue-on-error from native builds once issues are resolved.
The continue-on-error: true flags on iOS and Android native builds prevent CI from catching build failures. While the PR notes explain existing code errors, these flags should be temporary and removed once the issues are fixed.
These flags defeat the purpose of CI by allowing broken builds to pass.
Also applies to: 115-115
🤖 Prompt for AI Agents
.github/workflows/react-native-sdk.yml around lines 84 and 115: the workflow
currently sets continue-on-error: true for native iOS/Android build steps which
masks CI failures; remove the continue-on-error: true entries at those lines so
the workflow fails on build errors, and if you need a temporary marker add a
TODO comment referencing the issue/PR that tracks the underlying bug instead of
silencing failures.
| name: Release Artifacts | ||
|
|
||
| on: | ||
| push: | ||
| tags: | ||
| - 'ios/v*' | ||
| - 'android/v*' | ||
|
|
||
| jobs: | ||
| ios-artifacts: | ||
| name: Build iOS Release Artifacts | ||
| if: startsWith(github.ref, 'refs/tags/ios/') | ||
| runs-on: macos-latest | ||
|
|
||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Select Xcode version | ||
| run: sudo xcode-select -s /Applications/Xcode_15.2.app | ||
|
|
||
| - name: Extract version from tag | ||
| id: version | ||
| run: | | ||
| VERSION=${GITHUB_REF#refs/tags/ios/v} | ||
| echo "version=$VERSION" >> $GITHUB_OUTPUT | ||
| echo "Version: $VERSION" | ||
|
|
||
| - name: Build XCFramework | ||
| working-directory: ./sdk/runanywhere-swift | ||
| run: | | ||
| # Build for iOS | ||
| xcodebuild archive \ | ||
| -scheme RunAnywhere \ | ||
| -destination "generic/platform=iOS" \ | ||
| -archivePath build/ios.xcarchive \ | ||
| SKIP_INSTALL=NO \ | ||
| BUILD_LIBRARY_FOR_DISTRIBUTION=YES | ||
|
|
||
| # Build for iOS Simulator | ||
| xcodebuild archive \ | ||
| -scheme RunAnywhere \ | ||
| -destination "generic/platform=iOS Simulator" \ | ||
| -archivePath build/ios-simulator.xcarchive \ | ||
| SKIP_INSTALL=NO \ | ||
| BUILD_LIBRARY_FOR_DISTRIBUTION=YES | ||
|
|
||
| # Create XCFramework | ||
| xcodebuild -create-xcframework \ | ||
| -archive build/ios.xcarchive \ | ||
| -framework build/ios.xcarchive/Products/Library/Frameworks/RunAnywhere.framework \ | ||
| -archive build/ios-simulator.xcarchive \ | ||
| -framework build/ios-simulator.xcarchive/Products/Library/Frameworks/RunAnywhere.framework \ | ||
| -output build/RunAnywhere.xcframework | ||
| continue-on-error: true | ||
|
|
||
| - name: Upload XCFramework | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: ios-xcframework-${{ steps.version.outputs.version }} | ||
| path: sdk/runanywhere-swift/build/RunAnywhere.xcframework | ||
| retention-days: 90 | ||
|
|
||
| android-artifacts: | ||
| name: Build Android Release Artifacts | ||
| if: startsWith(github.ref, 'refs/tags/android/') | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up JDK 17 | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| java-version: '17' | ||
| distribution: 'temurin' | ||
|
|
||
| - name: Extract version from tag | ||
| id: version | ||
| run: | | ||
| VERSION=${GITHUB_REF#refs/tags/android/v} | ||
| echo "version=$VERSION" >> $GITHUB_OUTPUT | ||
| echo "Version: $VERSION" | ||
|
|
||
| - name: Grant execute permission for gradlew | ||
| run: chmod +x ./sdk/runanywhere-kotlin/gradlew | ||
|
|
||
| - name: Build JVM JAR | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew jvmJar --no-daemon | ||
|
|
||
| - name: Build Android AAR | ||
| working-directory: ./sdk/runanywhere-kotlin | ||
| run: ./gradlew assembleRelease --no-daemon | ||
|
|
||
| - name: Upload JAR artifact | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: android-jar-${{ steps.version.outputs.version }} | ||
| path: sdk/runanywhere-kotlin/build/libs/*.jar | ||
| retention-days: 90 | ||
|
|
||
| - name: Upload AAR artifact | ||
| uses: actions/upload-artifact@v4 | ||
| if: always() | ||
| with: | ||
| name: android-aar-${{ steps.version.outputs.version }} | ||
| path: sdk/runanywhere-kotlin/build/outputs/aar/*.aar | ||
| retention-days: 90 | ||
|
|
||
| - name: Attach artifacts to GitHub Release | ||
| uses: softprops/action-gh-release@v1 | ||
| if: always() | ||
| with: | ||
| files: | | ||
| sdk/runanywhere-kotlin/build/libs/*.jar | ||
| sdk/runanywhere-kotlin/build/outputs/aar/*.aar | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
There was a problem hiding this comment.
Critical: Tab indentation will cause YAML parsing errors.
The workflow file uses tab characters for indentation instead of spaces. GitHub Actions YAML requires space-based indentation. This explains the static analysis errors flagging "mapping values are not allowed here" at line 17.
Convert all tabs to 2-space indentation throughout the file for valid YAML.
🔎 Example fix for the trigger section
on:
- push:
- tags:
- - 'ios/v*'
- - 'android/v*'
+ push:
+ tags:
+ - 'ios/v*'
+ - 'android/v*'Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 actionlint (1.7.9)
17-17: could not parse as YAML: mapping values are not allowed in this context
(syntax-check)
🪛 YAMLlint (1.37.1)
[error] 17-17: syntax error: mapping values are not allowed here
(syntax)
🤖 Prompt for AI Agents
.github/workflows/release-artifacts.yml lines 1-122: the file currently uses tab
characters for indentation which breaks YAML parsing; replace all tab characters
with 2-space indentation consistently across the entire file (ensure list items,
mappings, and nested steps use two spaces per level), save the file, and
validate by running a YAML linter or by committing to a branch and observing
that GitHub Actions no longer reports "mapping values are not allowed here"
errors.
| -archive build/ios-simulator.xcarchive \ | ||
| -framework build/ios-simulator.xcarchive/Products/Library/Frameworks/RunAnywhere.framework \ | ||
| -output build/RunAnywhere.xcframework | ||
| continue-on-error: true |
There was a problem hiding this comment.
continue-on-error: true may silently produce incomplete release artifacts.
If the XCFramework build fails, the workflow continues and uploads potentially missing or incomplete artifacts. For release workflows, consider removing this flag so failures are explicit.
🔎 Proposed fix
- continue-on-error: true📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| continue-on-error: true |
🤖 Prompt for AI Agents
In .github/workflows/release-artifacts.yml around line 55, the job step sets
continue-on-error: true which allows XCFramework build failures to be ignored
and may upload incomplete release artifacts; remove this flag (or set it to
false) so the workflow fails on build errors, and if you need leniency for
non-release runs, gate the step behind a conditional or a separate non-release
job instead.
| git commit -m "Add BuildToken.swift for release v$new_version | ||
|
|
||
| SECURITY: BuildToken.swift is in .gitignore and NOT in main branch. | ||
| This file is ONLY included in release tags for SPM distribution. | ||
|
|
||
| Token: $build_token | ||
| Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")" |
There was a problem hiding this comment.
Security: Build token embedded in git commit message.
The build token is included in the commit message on line 461. While this commit is only in the release tag (not main branch), the token becomes part of the public git history if tags are pushed to a public repository.
Consider removing the token from the commit message or using a placeholder.
git commit -m "Add BuildToken.swift for release v$new_version
SECURITY: BuildToken.swift is in .gitignore and NOT in main branch.
This file is ONLY included in release tags for SPM distribution.
-Token: $build_token
Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| git commit -m "Add BuildToken.swift for release v$new_version | |
| SECURITY: BuildToken.swift is in .gitignore and NOT in main branch. | |
| This file is ONLY included in release tags for SPM distribution. | |
| Token: $build_token | |
| Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")" | |
| git commit -m "Add BuildToken.swift for release v$new_version | |
| SECURITY: BuildToken.swift is in .gitignore and NOT in main branch. | |
| This file is ONLY included in release tags for SPM distribution. | |
| Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")" |
🤖 Prompt for AI Agents
In scripts/release_ios_sdk.sh around lines 456-462, the commit message currently
interpolates and embeds the sensitive build token ($build_token) into the git
commit body; remove the token from the commit message to avoid leaking secrets
into git history. Replace the token interpolation with a non-sensitive
placeholder (e.g. [REDACTED_BUILD_TOKEN]) or omit that line entirely, ensure the
actual BuildToken.swift file is still created/handled as intended but do not
include the token in any commit message or pushed tag, and update any downstream
scripts or docs that relied on reading the token from the commit message to
instead read it from a secure source (env var, CI secrets, or a temporary local
file not committed).
| print_success "Released v$new_version successfully" | ||
| print_success "Build token: $build_token" |
There was a problem hiding this comment.
Build token printed to stdout may appear in CI logs.
Lines 492-493 print the build token to the console. If this script runs in CI, the token could be captured in publicly visible logs. Consider masking or omitting this output in non-interactive mode.
- print_success "Build token: $build_token"
+ if [[ $AUTO_YES -ne 1 ]]; then
+ print_success "Build token: $build_token"
+ else
+ print_success "Build token generated (masked in CI)"
+ fi📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| print_success "Released v$new_version successfully" | |
| print_success "Build token: $build_token" | |
| print_success "Released v$new_version successfully" | |
| if [[ $AUTO_YES -ne 1 ]]; then | |
| print_success "Build token: $build_token" | |
| else | |
| print_success "Build token generated (masked in CI)" | |
| fi |
🤖 Prompt for AI Agents
In scripts/release_ios_sdk.sh around lines 492-493, the script prints the build
token to stdout which may expose secrets in CI logs; update the script to avoid
printing the raw $build_token in non-interactive/CI runs by only echoing it when
the script is running interactively (e.g., test -t 1) or when an explicit flag
(like --show-token) is provided, otherwise omit it or print a masked version
(e.g., first/last chars with asterisks) and rely on the CI provider's secret
masking for any necessary display.
Description
This PR adds comprehensive CI/CD pipeline improvements for the RunAnywhere SDKs project, addressing critical issues identified in the existing workflow setup. All workflows follow best practices and are configured to run on push and pull requests to the main branch.
Type of Change
Changes Made
GitHub Actions Workflows
iOS SDK CI (
.github/workflows/ios-sdk.yml)Android SDK CI (
.github/workflows/android-sdk.yml)runanywhere-androidtorunanywhere-kotlinReact Native SDK CI (
.github/workflows/react-native-sdk.yml)Flutter SDK CI (
.github/workflows/flutter-sdk.yml)Integration Tests (
.github/workflows/integration-tests.yml)Release Artifacts (
.github/workflows/release-artifacts.yml)Infrastructure Improvements
Dependabot (
.github/dependabot.yml)Pre-commit Hooks (
.pre-commit-config.yaml)Release Scripts
scripts/release_android_sdk.sh- Automated Android releasesscripts/release_ios_sdk.sh- Existing iOS release scriptBuild Configuration
sdk/runanywhere-kotlin/build.gradle.kts- Added JaCoCo for code coverageTesting
scripts/test-cicd-local.ps1)feature/cicd-pipeline-improvements)Note: Some code errors exist in the codebase (React Native SDK TypeScript errors, Android build issues) - these are expected and will be addressed in follow-up PRs. The CI/CD pipeline correctly detects these issues, proving the pipeline is working as intended.
Labels
Please add the appropriate label(s):
CI/CD- CI/CD improvementsAndroid SDK- Android workflow fixes and improvementsiOS SDK- iOS workflow improvementsReact Native SDK- React Native workflowFlutter SDK- Flutter workflowChecklist
Following Contributing Guidelines:
Related Issues
Addresses CI/CD pipeline issues identified in the project analysis:
Screenshots
N/A - Infrastructure changes only (GitHub Actions workflows, configuration files)
Additional Notes
mainbranchSummary by CodeRabbit
Release Notes
✏️ Tip: You can customize this high-level summary in your review settings.