Conversation
Clones sibling local packages (reticulum-swift, LXMF-swift, LXST-swift) and runs ColumbaAppTests on iOS Simulator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Greptile SummaryThis PR adds a GitHub Actions CI workflow that builds Confidence Score: 5/5Safe to merge — the workflow is functionally correct and all findings are non-blocking P2 suggestions. No P0 or P1 issues were found. The three observations (unpinned sibling clones, missing artifact upload, no SPM cache) are quality-of-life improvements that do not affect correctness or security. No files require special attention. Important Files Changed
Sequence DiagramsequenceDiagram
participant GH as GitHub Actions
participant Runner as macOS-15 Runner
participant Sibling as Sibling Repos (GitHub)
participant SPM as Swift Package Registry
participant Sim as iPhone 16 Simulator
GH->>Runner: Trigger (PR / push to main)
Runner->>Runner: actions/checkout@v4
Runner->>Sibling: git clone reticulum-swift (HEAD)
Runner->>Sibling: git clone LXMF-swift (HEAD)
Runner->>Sibling: git clone LXST-swift (HEAD)
Runner->>Runner: xcode-select Xcode 16.2
Runner->>SPM: xcodebuild -resolvePackageDependencies
SPM-->>Runner: Fetch pinned packages (GRDB, CryptoSwift, MapLibre…)
Runner->>Sim: xcodebuild test -only-testing:ColumbaAppTests
Sim-->>Runner: Test results → TestResults.xcresult
Runner->>Runner: Job ends, .xcresult discarded
Reviews (1): Last reviewed commit: "ci: add GitHub Actions workflow to run u..." | Re-trigger Greptile |
| run: | | ||
| git clone https://github.com/torlando-tech/reticulum-swift.git ../reticulum-swift | ||
| git clone https://github.com/torlando-tech/LXMF-swift.git ../LXMF-swift | ||
| git clone https://github.com/torlando-tech/LXST-swift.git ../LXST-swift |
There was a problem hiding this comment.
Sibling packages cloned at HEAD without pinning
The three sibling repos are cloned without specifying a branch, tag, or commit SHA, so every CI run always uses the latest HEAD of each package's default branch. If someone pushes a breaking change to reticulum-swift, LXMF-swift, or LXST-swift, this workflow will start failing even though nothing in columba-ios changed, making it hard to tell whether the failure is local or upstream.
Consider pinning to a specific branch or ref so the build is reproducible and failures are attributable:
git clone --branch main --single-branch https://github.com/torlando-tech/reticulum-swift.git ../reticulum-swift
git clone --branch main --single-branch https://github.com/torlando-tech/LXMF-swift.git ../LXMF-swift
git clone --branch main --single-branch https://github.com/torlando-tech/LXST-swift.git ../LXST-swiftOr, if full reproducibility is needed, add a step that resolves and records the HEAD SHAs of each sibling so failed runs can be replicated exactly.
.github/workflows/tests.yml
Outdated
| - name: Run tests | ||
| run: | | ||
| xcodebuild test \ | ||
| -project ColumbaApp.xcodeproj \ | ||
| -scheme ColumbaApp \ | ||
| -sdk iphonesimulator \ | ||
| -destination 'platform=iOS Simulator,name=iPhone 16' \ | ||
| -only-testing:ColumbaAppTests \ | ||
| -resultBundlePath TestResults.xcresult |
There was a problem hiding this comment.
Test result bundle generated but never uploaded
-resultBundlePath TestResults.xcresult writes the result bundle to disk, but there is no actions/upload-artifact step afterward. When a test run fails in CI, the .xcresult bundle is discarded along with the runner and there is no way to inspect the failure from the GitHub Actions UI.
Consider adding an upload step so the bundle is available for debugging:
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: TestResults
path: TestResults.xcresultUsing if: always() ensures the artifact is uploaded even when tests fail, which is when it's most useful.
.github/workflows/tests.yml
Outdated
| - name: Resolve packages | ||
| run: xcodebuild -resolvePackageDependencies -project ColumbaApp.xcodeproj -scheme ColumbaApp |
There was a problem hiding this comment.
SPM dependency cache not configured
Every run fetches all remote Swift Package dependencies from scratch (GRDB, CryptoSwift, MapLibre, etc.). Caching the resolved packages significantly reduces run time. A common pattern:
- name: Cache Swift packages
uses: actions/cache@v4
with:
path: |
~/Library/Developer/Xcode/DerivedData
.build
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
restore-keys: |
${{ runner.os }}-spm-The Package.resolved hash ensures the cache is invalidated whenever a dependency version changes.
The app module failed to build on CI due to missing provisioning profiles. Skip signing since we only need to run unit tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The runner may not have Xcode 16.2 or iPhone 16 simulator installed. Dynamically find the latest Xcode 16.x and an available iOS Simulator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use xcrun simctl to find the first available iPhone simulator by UUID instead of hardcoding a device name that may not exist on the runner. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use CODE_SIGN_IDENTITY=- (ad-hoc) instead of disabling signing entirely, so the app and network extension targets can still be built and linked. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Separate the build and test phases so we can see exactly where the failure occurs. The app module wasn't being compiled before the test target tried to import it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Build the ColumbaApp target first to ensure the Swift module exists before the test target tries to import it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use scheme-based build (which resolves SPM deps correctly) as a separate step before running tests, ensuring the ColumbaApp module is fully compiled before the test target imports it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
Test plan
🤖 Generated with Claude Code