Skip to content

Commit 0b081a3

Browse files
authored
Create Binary Size Report Generation (#8539)
Create Binary Size Report Generation This report is prepared for API request to the Metrics Service.
1 parent 52b3560 commit 0b081a3

File tree

19 files changed

+274
-32
lines changed

19 files changed

+274
-32
lines changed

.github/workflows/test_coverage.yml renamed to .github/workflows/health_metrics.yml

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: test_coverage
1+
name: health_metrics
22

33
on:
44
pull_request:
@@ -39,9 +39,33 @@ jobs:
3939
pr_branch: ${{ github.event.pull_request.head.ref }}
4040
run: |
4141
if [ ! -z "${{ env.METRICS_SERVICE_SECRET }}" ]; then
42-
./scripts/code_coverage_report/get_updated_files.sh
42+
./scripts/health_metrics/get_updated_files.sh
4343
fi
4444
45+
binary_size_metrics:
46+
needs: check
47+
if: always() && github.repository == 'Firebase/firebase-ios-sdk' && (github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.pull_request.merged)
48+
runs-on: macOS-latest
49+
strategy:
50+
matrix:
51+
target: [iOS]
52+
steps:
53+
- uses: actions/checkout@v2
54+
- name: Build and test
55+
run: |
56+
FirebaseABTesting=${{ needs.check.outputs.abtesting_run_job }} \
57+
FirebaseAuth=${{ needs.check.outputs.auth_run_job }} \
58+
FirebaseDatabase=${{ needs.check.outputs.database_run_job }} \
59+
FirebaseDynamicLinks=${{ needs.check.outputs.dynamiclinks_run_job }} \
60+
FirebaseFirestore=${{ needs.check.outputs.firestore_run_job }} \
61+
FirebaseFunctions=${{ needs.check.outputs.functions_run_job}} \
62+
FirebaseInAppMessaging=${{ needs.check.outputs.inappmessaging_run_job }} \
63+
FirebaseMessaging=${{ needs.check.outputs.messaging_run_job}} \
64+
FirebasePerformance=${{ needs.check.outputs.performance_run_job }} \
65+
FirebaseRemoteConfig=${{ needs.check.outputs.remoteconfig_run_job }} \
66+
FirebaseStorage=${{ needs.check.outputs.storage_run_job }} \
67+
./scripts/health_metrics/create_binary_size_report.sh
68+
4569
pod-lib-lint-abtesting:
4670
needs: check
4771
# Don't run on private repo unless it is a PR.
@@ -56,7 +80,7 @@ jobs:
5680
- name: Setup Bundler
5781
run: scripts/setup_bundler.sh
5882
- name: Build and test
59-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseABTesting --platform=${{ matrix.target }}
83+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseABTesting --platform=${{ matrix.target }}
6084
- uses: actions/upload-artifact@v2
6185
with:
6286
name: codecoverage
@@ -75,7 +99,7 @@ jobs:
7599
- name: Setup Bundler
76100
run: scripts/setup_bundler.sh
77101
- name: Build and test
78-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseAuth --platform=${{ matrix.target }}
102+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseAuth --platform=${{ matrix.target }}
79103
- uses: actions/upload-artifact@v2
80104
with:
81105
name: codecoverage
@@ -94,7 +118,7 @@ jobs:
94118
- name: Setup Bundler
95119
run: scripts/setup_bundler.sh
96120
- name: Build and test
97-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseDatabase --platform=${{ matrix.target }}
121+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseDatabase --platform=${{ matrix.target }}
98122
- uses: actions/upload-artifact@v2
99123
with:
100124
name: codecoverage
@@ -113,7 +137,7 @@ jobs:
113137
- name: Setup Bundler
114138
run: scripts/setup_bundler.sh
115139
- name: Build and test
116-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseDynamicLinks --platform=${{ matrix.target }}
140+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseDynamicLinks --platform=${{ matrix.target }}
117141
- uses: actions/upload-artifact@v2
118142
with:
119143
name: codecoverage
@@ -133,7 +157,7 @@ jobs:
133157
- name: Setup Bundler
134158
run: scripts/setup_bundler.sh
135159
- name: Build and test
136-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseFirestore --platform=${{ matrix.target }}
160+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseFirestore --platform=${{ matrix.target }}
137161
- uses: actions/upload-artifact@v2
138162
with:
139163
name: codecoverage
@@ -152,7 +176,7 @@ jobs:
152176
- name: Setup Bundler
153177
run: scripts/setup_bundler.sh
154178
- name: Build and test
155-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseFunctions --platform=${{ matrix.target }}
179+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseFunctions --platform=${{ matrix.target }}
156180
- uses: actions/upload-artifact@v2
157181
with:
158182
name: codecoverage
@@ -171,7 +195,7 @@ jobs:
171195
- name: Setup Bundler
172196
run: scripts/setup_bundler.sh
173197
- name: Build and test
174-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseInAppMessaging --platform=${{ matrix.target }}
198+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseInAppMessaging --platform=${{ matrix.target }}
175199
- uses: actions/upload-artifact@v2
176200
with:
177201
name: codecoverage
@@ -190,7 +214,7 @@ jobs:
190214
- name: Setup Bundler
191215
run: scripts/setup_bundler.sh
192216
- name: Build and test
193-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseMessaging --platform=${{ matrix.target }}
217+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseMessaging --platform=${{ matrix.target }}
194218
- uses: actions/upload-artifact@v2
195219
with:
196220
name: codecoverage
@@ -209,7 +233,7 @@ jobs:
209233
- name: Setup Bundler
210234
run: scripts/setup_bundler.sh
211235
- name: Build and test
212-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebasePerformance --platform=${{ matrix.target }}
236+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebasePerformance --platform=${{ matrix.target }}
213237
- uses: actions/upload-artifact@v2
214238
with:
215239
name: codecoverage
@@ -228,7 +252,7 @@ jobs:
228252
- name: Setup Bundler
229253
run: scripts/setup_bundler.sh
230254
- name: Build and test
231-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseRemoteConfig --platform=${{ matrix.target }}
255+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseRemoteConfig --platform=${{ matrix.target }}
232256
- uses: actions/upload-artifact@v2
233257
with:
234258
name: codecoverage
@@ -247,7 +271,7 @@ jobs:
247271
- name: Setup Bundler
248272
run: scripts/setup_bundler.sh
249273
- name: Build and test
250-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh --sdk=FirebaseStorage --platform=${{ matrix.target }}
274+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh --sdk=FirebaseStorage --platform=${{ matrix.target }}
251275
- uses: actions/upload-artifact@v2
252276
with:
253277
name: codecoverage
@@ -286,7 +310,7 @@ jobs:
286310
run: |
287311
# Get Head commit of the branch, instead of a merge commit created by actions/checkout.
288312
if [ -d "${{steps.download.outputs.download-path}}" ]; then
289-
cd scripts/code_coverage_report/generate_code_coverage_report
313+
cd scripts/health_metrics/generate_code_coverage_report
290314
swift run CoverageReportGenerator --presubmit "firebase/firebase-ios-sdk" --head-commit "${GITHUB_SHA}" --token $(gcloud auth print-identity-token) --xcresult-dir "/Users/runner/test/codecoverage" --log-link "https://github.com/firebase/firebase-ios-sdk/actions/runs/${GITHUB_RUN_ID}" --pull-request-num ${{github.event.pull_request.number}} --base-commit "$base_commit"
291315
fi
292316
- name: Incremental Code Coverage
@@ -297,11 +321,11 @@ jobs:
297321
# Get Head commit of the branch, instead of a merge commit created by actions/checkout.
298322
GITHUB_SHA=$(cat $GITHUB_EVENT_PATH | jq -r .pull_request.head.sha)
299323
# Get a JSON of `git diff` from the base commit.
300-
git diff -U0 ${base_commit} "${GITHUB_SHA}" | scripts/code_coverage_report/git_diff_to_json.sh > scripts/code_coverage_report/generate_code_coverage_report/git_diff.json
301-
cat "scripts/code_coverage_report/generate_code_coverage_report/git_diff.json"
324+
git diff -U0 ${base_commit} "${GITHUB_SHA}" | scripts/health_metrics/git_diff_to_json.sh > scripts/health_metrics/generate_code_coverage_report/git_diff.json
325+
cat "scripts/health_metrics/generate_code_coverage_report/git_diff.json"
302326
if [ -d "${{steps.download.outputs.download-path}}" ]; then
303327
# Create an uncovered_file_lines.json including code lines not covered by tests.
304-
cd scripts/code_coverage_report/generate_code_coverage_report
328+
cd scripts/health_metrics/generate_code_coverage_report
305329
swift run IncrementalCoverageReportGenerator --changed-files "git_diff.json" --file-archive-root-path "${GITHUB_WORKSPACE}" --xcresult-dir "${{steps.download.outputs.download-path}}" --uncovered-line-file-json "uncovered_file_lines.json"
306330
# Post uncovered lines to PRs.
307331
pull_number=$(jq --raw-output .pull_request.number "$GITHUB_EVENT_PATH")
@@ -318,6 +342,6 @@ jobs:
318342
if: github.event.pull_request.merged && github.event.pull_request.head.repo.full_name == github.repository
319343
run: |
320344
if [ -d "${{steps.download.outputs.download-path}}" ]; then
321-
cd scripts/code_coverage_report/generate_code_coverage_report
345+
cd scripts/health_metrics/generate_code_coverage_report
322346
swift run CoverageReportGenerator --merge "firebase/firebase-ios-sdk" --head-commit "${GITHUB_SHA}" --token $(gcloud auth print-identity-token) --xcresult-dir "/Users/runner/test/codecoverage" --log-link "https://github.com/firebase/firebase-ios-sdk/actions/runs/${GITHUB_RUN_ID}" --source-branch "${{ github.base_ref }}"
323347
fi
File renamed without changes.

scripts/code_coverage_report/README.md renamed to scripts/health_metrics/README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
# Code Coverage Report Generation
22

3-
This tool is to help generate coverage reports for pull requests. It's defined by the [test_coverage workflow](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/code_coverage_report/code_coverage_file_list.json).
3+
This tool is to help generate coverage reports for pull requests. It's defined by the [test_coverage workflow](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/health_metrics/code_coverage_file_list.json).
44

55
Coverage reports of SDK frameworks will be displayed in a pull request if the change is under corresponding SDK file patterns.
66

7-
[UpdatedFilesCollector](https://github.com/firebase/firebase-ios-sdk/tree/master/scripts/code_coverage_report/generate_code_coverage_report/Sources/UpdatedFilesCollector) will detect file changes and compare file paths to file patterns in [code_coverage_file_list.json](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/code_coverage_report/code_coverage_file_list.json). If updated file paths fit any patterns, corresponding SDK coverage job will be triggered.
7+
[UpdatedFilesCollector](https://github.com/firebase/firebase-ios-sdk/tree/master/scripts/health_metrics/generate_code_coverage_report/Sources/UpdatedFilesCollector) will detect file changes and compare file paths to file patterns in [code_coverage_file_list.json](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/health_metrics/code_coverage_file_list.json). If updated file paths fit any patterns, corresponding SDK coverage job will be triggered.
88

99
## Add a new coverage workflow
1010

1111
To create a code coverage workflow for a new SDK,
12-
1. Add `newsdk` and its patterns in [code_coverage_file_list.json](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/code_coverage_report/code_coverage_file_list.json).
12+
1. Add `newsdk` and its patterns in [code_coverage_file_list.json](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/health_metrics/code_coverage_file_list.json).
1313
2. Add a new output flag, e.g. `newsdk_run_job`, in the [coverage workflow](https://github.com/firebase/firebase-ios-sdk/blob/64d50a7f7b3af104a88f9c9203285ae20ea309d4/.github/workflows/test_coverage.yml#L17). `newsdk_run_job` should be aligned with the name of SDK `newsdk` in code_coverage_file_list.json.
1414
3. Add a newsdk coverage job in the [workflow](https://github.com/firebase/firebase-ios-sdk/blob/master/.github/workflows/test_coverage.yml):
1515
```
@@ -26,13 +26,12 @@ pod-lib-lint-newsdk:
2626
- name: Setup Bundler
2727
run: scripts/setup_bundler.sh
2828
- name: Build and test
29-
run: ./scripts/code_coverage_report/pod_test_code_coverage_report.sh FirebaseNewSDK "${{ matrix.target }}"
29+
run: ./scripts/health_metrics/pod_test_code_coverage_report.sh FirebaseNewSDK "${{ matrix.target }}"
3030
- uses: actions/upload-artifact@v2
3131
with:
3232
name: codecoverage
3333
path: /Users/runner/*.xcresult
3434
```
3535
Add the job name to the [`needs` of `create_report` job](https://github.com/firebase/firebase-ios-sdk/blob/64d50a7f7b3af104a88f9c9203285ae20ea309d4/.github/workflows/test_coverage.yml#L277).
3636

37-
4. If this newsdk podspec has unit test setup, e.g. [database](https://github.com/firebase/firebase-ios-sdk/blob/64d50a7f7b3af104a88f9c9203285ae20ea309d4/FirebaseDatabase.podspec#L44-L57), with `unit_tests.scheme = { :code_coverage => true }`, the code coverage workflow should run unit tests through podspecs and utilize those coverage data and nothing is needed to update here. Otherwise, add [another way of running tests](https://github.com/firebase/firebase-ios-sdk/blob/64d50a7f7b3af104a88f9c9203285ae20ea309d4/scripts/code_coverage_report/pod_test_code_coverage_report.sh#L26) and generating xcresult bundles with code coverage data in pod_test_code_coverage_report.sh.
38-
37+
4. If this newsdk podspec has unit test setup, e.g. [database](https://github.com/firebase/firebase-ios-sdk/blob/64d50a7f7b3af104a88f9c9203285ae20ea309d4/FirebaseDatabase.podspec#L44-L57), with `unit_tests.scheme = { :code_coverage => true }`, the code coverage workflow should run unit tests through podspecs and utilize those coverage data and nothing is needed to update here. Otherwise, add [another way of running tests](https://github.com/firebase/firebase-ios-sdk/blob/64d50a7f7b3af104a88f9c9203285ae20ea309d4/scripts/health_metrics/pod_test_code_coverage_report.sh#L26) and generating xcresult bundles with code coverage data in pod_test_code_coverage_report.sh.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
3+
# Copyright 2021 Google LLC
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
# USAGE: git diff -U0 [base_commit] HEAD | get_diff_lines.sh
18+
#
19+
# This will generate a JSON output of changed files and their newly added
20+
# lines.
21+
22+
BINARY_SIZE_SDK=()
23+
if $FirebaseABTesting == 'true'; then
24+
BINARY_SIZE_SDK+=('FirebaseABTesting')
25+
fi
26+
if $FirebaseAuth == 'true'; then
27+
BINARY_SIZE_SDK+=('FirebaseAuth')
28+
fi
29+
if $FirebaseDatabase == 'true'; then
30+
BINARY_SIZE_SDK+=('FirebaseDatabase')
31+
fi
32+
if $FirebaseDynamicLinks == 'true'; then
33+
BINARY_SIZE_SDK+=('FirebaseDynamicLinks')
34+
fi
35+
if $FirebaseFirestore == 'true'; then
36+
BINARY_SIZE_SDK+=('FirebaseFirestore')
37+
fi
38+
if $FirebaseFunctions == 'true'; then
39+
BINARY_SIZE_SDK+=('FirebaseFunctions')
40+
fi
41+
if $FirebaseInAppMessaging == 'true'; then
42+
BINARY_SIZE_SDK+=('FirebaseInAppMessaging')
43+
fi
44+
if $FirebaseMessaging == 'true'; then
45+
BINARY_SIZE_SDK+=('FirebaseMessaging')
46+
fi
47+
if $FirebasePerformance == 'true'; then
48+
BINARY_SIZE_SDK+=('FirebasePerformance');
49+
fi
50+
if $FirebaseRemoteConfig == 'true'; then
51+
BINARY_SIZE_SDK+=('FirebaseRemoteConfig')
52+
fi
53+
if $FirebaseStorage == 'true'; then
54+
BINARY_SIZE_SDK+=('FirebaseStorage')
55+
fi
56+
if [ -n "$BINARY_SIZE_SDK" ]; then
57+
cd scripts/health_metrics/generate_code_coverage_report/
58+
git clone https://github.com/google/cocoapods-size
59+
swift build
60+
.build/debug/BinarySizeReportGenerator --binary-size-tool-dir cocoapods-size/ --sdk-repo-dir "${GITHUB_WORKSPACE}" --sdk ${BINARY_SIZE_SDK[@]} --log-path "https://github.com/firebase/firebase-ios-sdk/actions/runs/${GITHUB_RUN_ID}"
61+
fi

scripts/code_coverage_report/generate_code_coverage_report/Package.swift renamed to scripts/health_metrics/generate_code_coverage_report/Package.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ let package = Package(
3434
name: "IncrementalCoverageReportGenerator",
3535
targets: ["IncrementalCoverageReportGenerator"]
3636
),
37+
.executable(
38+
name: "BinarySizeReportGenerator",
39+
targets: ["BinarySizeReportGenerator"]
40+
),
3741
],
3842
dependencies: [
3943
.package(url: "https://github.com/apple/swift-argument-parser", from: "0.2.0"),
@@ -59,6 +63,13 @@ let package = Package(
5963
"Utils",
6064
]
6165
),
66+
.target(
67+
name: "BinarySizeReportGenerator",
68+
dependencies: [
69+
.product(name: "ArgumentParser", package: "swift-argument-parser"),
70+
"Utils",
71+
]
72+
),
6273
.target(
6374
name: "Utils"
6475
),
File renamed without changes.

0 commit comments

Comments
 (0)