CI/GitHub Actions Debugging Skill
Expert guidance for debugging GitHub Actions workflows, CI build failures, and deployment issues specific to this Flutter Android project.
When to Use This Skill
- •GitHub Actions workflow failures
- •CI build errors that don't occur locally
- •Test failures only in CI environment
- •Artifact upload/download issues
- •Secret/credential problems
- •Cache-related failures
- •Timeout issues
- •Deployment failures
Project Workflows
This project has several workflows:
1. build.yml (Main CI)
- •Runs on push to main/develop and PRs
- •Auto-formats code with
dart format - •Applies fixes with
dart fix --apply - •Builds APK and App Bundle
- •Runs tests with coverage
- •Uses CI-optimized Gradle properties
2. release.yml
- •Triggered by version tags (v*)
- •Builds signed release artifacts
- •Creates GitHub Release
- •Requires signing secrets
3. pre-release.yml
- •Manual workflow for beta/alpha releases
- •Customizable version naming
- •Creates pre-release on GitHub
Debugging Workflow
1. Access Workflow Logs
Via GitHub UI:
- •Go to repository → Actions tab
- •Click on failed workflow run
- •Click on failed job
- •Expand failed step to see logs
Via GitHub CLI (if available):
# List recent workflow runs gh run list --limit 10 # View specific run gh run view <run-id> # Download logs gh run download <run-id>
2. Common CI Failure Patterns
Flutter/Dart Setup Issues
Error: Flutter not found or wrong version
# Check flutter version in workflow
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.38.3' # Verify this matches requirements
channel: 'stable'
cache: true
Solution:
- •Update Flutter version in
.github/workflows/build.yml - •Ensure version exists on stable channel
- •Check for typos in version number
Gradle Build Failures
Error: Gradle daemon issues or out of memory
# Workflow uses CI-optimized properties - name: Setup Gradle for CI run: cp android/gradle-ci.properties android/gradle.properties
Solution:
- •Check
android/gradle-ci.propertiessettings - •Verify heap size (3GB for CI)
- •Ensure parallel builds limited (2 workers for CI)
- •Disable daemon in CI:
org.gradle.daemon=false
Error: Java version mismatch
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17' # Must be 17 for this project
Solution:
- •Verify Java version is 17
- •Check all gradle files use Java 17
- •Ensure JVM target is set correctly
Dependency Issues
Error: Package resolution failures
- name: Get dependencies run: flutter pub get
Solution:
- •Check
pubspec.yamlfor invalid dependencies - •Verify dependency versions exist on pub.dev
- •Clear cache if stale (remove cache step temporarily)
- •Check for network issues in CI environment
Test Failures
Error: Tests pass locally but fail in CI
- name: Run tests with coverage run: flutter test --coverage --concurrency=$(nproc)
Solution:
- •Check for timing issues (use
awaitproperly) - •Verify file paths are relative, not absolute
- •Look for environment-specific dependencies
- •Check test runs with same concurrency locally
- •Review timezone/locale differences
- •Ensure no tests depend on external services
Cache Issues
Error: Build slower or cache not working
- name: Cache Flutter packages
uses: actions/cache@v4
with:
path: |
~/.pub-cache
${{ github.workspace }}/.dart_tool
key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
Solution:
- •Verify cache key is correct
- •Check cache paths exist
- •Clear cache by changing cache key
- •Review cache size limits (10GB per repo)
Artifact Upload Issues
Error: Artifacts not found or upload fails
- name: Upload APK
uses: actions/upload-artifact@v5
with:
name: android-apk
path: build/app/outputs/flutter-apk/app-release.apk
retention-days: 7
Solution:
- •Verify build actually succeeded
- •Check file path is correct
- •Ensure build step completed
- •Look for build output location changes
3. Debugging Specific Workflow Steps
Auto-format and Commit Step
Error: Permission denied or merge conflicts
- name: Commit formatting changes
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .
if git diff --staged --quiet; then
echo "No formatting changes to commit"
else
git commit -m "style: auto-format code [skip ci]"
git push
fi
Solution:
- •Check
GITHUB_TOKENhas write permissions - •Verify checkout uses correct ref
- •Ensure condition matches PR from same repo
- •Review branch protection rules
Coverage Upload
Error: Codecov upload fails
- name: Upload Coverage
uses: codecov/codecov-action@v5
if: always()
with:
files: coverage/lcov.info
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
Solution:
- •Check
coverage/lcov.infoexists - •Verify
CODECOV_TOKENsecret is set - •Use
fail_ci_if_error: falseto not block CI - •Check Codecov service status
4. Release Workflow Issues
Missing Secrets
Error: Build signing fails
# Required secrets for release.yml: # - ANDROID_KEYSTORE_BASE64 # - ANDROID_KEYSTORE_PASSWORD # - ANDROID_KEY_ALIAS # - ANDROID_KEY_PASSWORD
Solution:
- •Generate keystore (see
SIGNING.md) - •Base64 encode:
base64 -i keystore.jks -o keystore.txt - •Add secrets in Settings → Secrets → Actions
- •Verify secret names match workflow
Tag Trigger Issues
Error: Release workflow doesn't trigger
on:
push:
tags:
- 'v*' # Must start with 'v'
Solution:
- •Ensure tag starts with 'v' (e.g., v1.0.0)
- •Push tag:
git tag v1.0.0 && git push origin v1.0.0 - •Check workflow is enabled
- •Verify branch has tag
5. Timeout Issues
Error: Workflow times out
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 30 # build.yml timeout
Solution:
- •Increase timeout if builds legitimately take longer
- •Check for hanging processes
- •Review Gradle performance settings
- •Ensure no infinite loops in tests
- •Check for network timeouts
6. Concurrency Issues
Error: Multiple runs conflict
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
Solution:
- •This cancels duplicate runs automatically
- •If issues persist, check for race conditions
- •Review if multiple workflows modify same files
Quick CI Debug Checklist
- • Check workflow logs in GitHub Actions tab
- • Verify Flutter version matches project requirements
- • Confirm Java version is 17
- • Review gradle-ci.properties settings
- • Check all required secrets are set
- • Verify dependency versions in pubspec.yaml
- • Test same commands locally
- • Review cache configuration
- • Check artifact paths
- • Verify branch protection rules allow bot commits
- • Ensure workflows are enabled
- • Check runner OS matches expectations (ubuntu-latest)
Local CI Simulation
To reproduce CI environment locally:
# Use CI Gradle properties cp android/gradle-ci.properties android/gradle.properties # Clean build flutter clean flutter pub get # Format and fix dart format . dart fix --apply # Analyze flutter analyze # Test with coverage flutter test --coverage --concurrency=$(nproc) # Build flutter build apk --release flutter build appbundle --release # Restore local properties git checkout android/gradle.properties
Common Error Messages and Solutions
| Error Message | Likely Cause | Solution |
|---|---|---|
| "Flutter SDK not found" | Setup issue | Check flutter-action version and config |
| "Gradle build failed" | Memory/config | Review gradle-ci.properties |
| "Test failed" | Environment diff | Check for timing issues, paths |
| "Permission denied" | Token permissions | Add write permission to workflow |
| "Artifact not found" | Build didn't complete | Check build step succeeded |
| "Secret not found" | Missing secret | Add in repository settings |
| "Timeout" | Takes too long | Increase timeout or optimize build |
| "Cache restore failed" | Key mismatch | Update cache key |
Best Practices
- •Always test locally first: Run same commands as CI
- •Use verbose logging: Add
--verboseto debug commands - •Check all secrets: Verify secrets exist and are correct
- •Monitor cache usage: Clear cache if builds become inconsistent
- •Keep workflows simple: Complex workflows are harder to debug
- •Use conditional steps:
if: always()for critical diagnostics - •Set appropriate timeouts: Balance between too short and too long
- •Document workflow changes: Add comments explaining why
- •Test on clean branch: Ensure no local state affects CI
- •Review workflow on successful runs: Understand what works
Additional Resources
- •GitHub Actions Documentation
- •Flutter CI/CD Guide
- •Gradle Build Performance
- •Project-specific:
BUILD_OPTIMIZATION.md,SIGNING.md