Skip to content

Build

Build #613

Workflow file for this run

name: Build
on:
pull_request:
paths-ignore:
- "**.md"
- "**.mdx"
schedule:
# runs the CI everyday at 10AM
- cron: "0 10 * * *"
workflow_dispatch:
inputs:
dart_version:
description: 'Dart version to test (stable or beta)'
required: false
default: 'stable'
jobs:
lint:
name: Lint (Dart ${{ matrix.dart-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
dart-version: [stable, beta]
defaults:
run:
working-directory: packages/dart_firebase_admin
steps:
- uses: actions/[email protected]
- uses: subosito/[email protected]
with:
channel: ${{ matrix.dart-version }}
- name: Cache pub dependencies
uses: actions/cache@v3
with:
path: ~/.pub-cache
key: pub-${{ matrix.dart-version }}-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
pub-${{ matrix.dart-version }}-
pub-
- name: Install dependencies
run: dart pub get && cd example && dart pub get && cd -
- name: Check format
run: dart format --set-exit-if-changed .
- name: Analyze
run: dart analyze
test:
name: Test (Dart ${{ matrix.dart-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
dart-version: [stable, beta]
defaults:
run:
working-directory: packages/dart_firebase_admin
steps:
- uses: actions/[email protected]
with:
fetch-depth: 2
- uses: actions/setup-node@v4
- uses: subosito/[email protected]
with:
channel: ${{ matrix.dart-version }}
- name: Cache pub dependencies
uses: actions/cache@v3
with:
path: ~/.pub-cache
key: pub-${{ matrix.dart-version }}-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
pub-${{ matrix.dart-version }}-
pub-
- name: Cache Firebase CLI
uses: actions/cache@v3
with:
path: ~/.cache/firebase/emulators
key: firebase-emulators
restore-keys: |
firebase-
- name: Add pub cache bin to PATH
run: |
echo "$HOME/.pub-cache/bin" >> $GITHUB_PATH
echo "PUB_CACHE=$HOME/.pub-cache" >> $GITHUB_ENV
- name: Install Firebase CLI
run: npm install -g firebase-tools
- name: Install dependencies
run: dart pub get && cd example && dart pub get && cd -
- name: Setup gcloud credentials
run: |
mkdir -p $HOME/.config/gcloud
echo '${{ secrets.CREDS }}' > $HOME/.config/gcloud/application_default_credentials.json
- name: Run tests with coverage
run: ${{ github.workspace }}/scripts/coverage.sh
- name: Check coverage threshold and generate report
if: matrix.dart-version == 'stable'
id: coverage
run: |
dart pub global activate coverage
# Generate coverage report
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage.lcov --packages=.dart_tool/package_config.json --report-on=lib
# Calculate total coverage
TOTAL_LINES=$(grep -E "^(DA|LF):" coverage.lcov | grep "^LF:" | awk -F: '{sum+=$2} END {print sum}')
HIT_LINES=$(grep -E "^(DA|LH):" coverage.lcov | grep "^LH:" | awk -F: '{sum+=$2} END {print sum}')
if [ "$TOTAL_LINES" -gt 0 ]; then
COVERAGE_PCT=$(awk "BEGIN {printf \"%.2f\", ($HIT_LINES/$TOTAL_LINES)*100}")
else
COVERAGE_PCT="0.00"
fi
echo "coverage=${COVERAGE_PCT}" >> $GITHUB_OUTPUT
echo "total_lines=${TOTAL_LINES}" >> $GITHUB_OUTPUT
echo "hit_lines=${HIT_LINES}" >> $GITHUB_OUTPUT
echo "Coverage: ${COVERAGE_PCT}% (${HIT_LINES}/${TOTAL_LINES} lines)"
# Check threshold
if (( $(echo "$COVERAGE_PCT < 40" | bc -l) )); then
echo "status=❌ Coverage ${COVERAGE_PCT}% is below 40% threshold" >> $GITHUB_OUTPUT
exit 1
else
echo "status=✅ Coverage ${COVERAGE_PCT}% meets 40% threshold" >> $GITHUB_OUTPUT
fi
- name: Comment coverage on PR
if: matrix.dart-version == 'stable' && github.event_name == 'pull_request'
uses: actions/github-script@v6
with:
script: |
const coverage = '${{ steps.coverage.outputs.coverage }}';
const status = '${{ steps.coverage.outputs.status }}';
const hitLines = '${{ steps.coverage.outputs.hit_lines }}';
const totalLines = '${{ steps.coverage.outputs.total_lines }}';
const body = `## Coverage Report
${status}
**Coverage:** ${coverage}%
**Lines Covered:** ${hitLines}/${totalLines}
_Minimum threshold: 40%_`;
// Find existing comment
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const botComment = comments.find(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('Coverage Report')
);
if (botComment) {
// Update existing comment
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: body
});
} else {
// Create new comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: body
});
}
- name: Upload coverage to codecov
if: matrix.dart-version == 'stable'
continue-on-error: true
uses: codecov/codecov-action@v3
with:
files: packages/dart_firebase_admin/coverage.lcov
flags: unittests
fail_ci_if_error: false
build:
name: Build verification (Dart ${{ matrix.dart-version }})
runs-on: ubuntu-latest
needs: [lint, test]
strategy:
fail-fast: false
matrix:
dart-version: [stable, beta]
defaults:
run:
working-directory: packages/dart_firebase_admin
steps:
- uses: actions/[email protected]
- uses: subosito/[email protected]
with:
channel: ${{ matrix.dart-version }}
- name: Cache pub dependencies
uses: actions/cache@v3
with:
path: ~/.pub-cache
key: pub-${{ matrix.dart-version }}-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
pub-${{ matrix.dart-version }}-
pub-
- name: Install dependencies
run: dart pub get && cd example && dart pub get && cd -
- name: Verify package
run: dart pub publish --dry-run