Skip to content

Commit

Permalink
sdk size checks and updates
Browse files Browse the repository at this point in the history
  • Loading branch information
andremion committed Dec 23, 2024
1 parent e0611ca commit dcebb2a
Show file tree
Hide file tree
Showing 4 changed files with 227 additions and 0 deletions.
117 changes: 117 additions & 0 deletions .github/workflows/sdk-size-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
name: SDK size checks

on:
pull_request:

env:
MODULES: "stream-chat-android-client stream-chat-android-offline stream-chat-android-ui-components stream-chat-android-compose"
METRICS_FILE: "metrics/size.json"
MAX_TOLERANCE: 500
FINE_TOLERANCE: 250

jobs:
compare-sdk-sizes:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3
- uses: ./.github/actions/setup-java
- uses: ./.github/actions/gradle-cache
with:
key-prefix: gradle-build

- name: Assemble SDKs
run: |
for module in $MODULES; do
modules+=" :$module:assembleDebug"
done
./gradlew $modules
- name: Get current SDK sizes
run: |
# Reads current SDK sizes from the metrics file
# and define to a variable using a compact JSON format
# so it can be exported for the next job step
CURRENT_SDK_SIZES=$(jq -c .debug $METRICS_FILE)
echo "CURRENT_SDK_SIZES=$CURRENT_SDK_SIZES" >> $GITHUB_ENV
- name: Calculate PR branch SDK sizes
run: |
echo '{}' > pr_sdk_sizes.json
# Calculate sizes from the .aar files and save them into a temporary JSON file
# so it can be exported for the next job step
for module in $MODULES; do
size=$(du -k $module/build/outputs/aar/*debug.aar | awk '{print $1}')
jq -c --arg sdk "$module" --arg size "$size" '. + {($sdk): ($size | tonumber)}' pr_sdk_sizes.json > temp.json && mv temp.json pr_sdk_sizes.json
done
echo "PR_SDK_SIZES=$(cat pr_sdk_sizes.json)" >> $GITHUB_ENV
- name: Post comment on PR
uses: actions/github-script@v6
with:
script: |
const maxTolerance = process.env.MAX_TOLERANCE
const fineTolerance = process.env.FINE_TOLERANCE
const currentSdkSizes = process.env.CURRENT_SDK_SIZES ? JSON.parse(process.env.CURRENT_SDK_SIZES) : {};
const prSdkSizes = JSON.parse(process.env.PR_SDK_SIZES);
const commentHeader = '## SDK Size Comparison';
// Prepare the comparison table
let commentBody = `
${commentHeader}
| SDK | Before | After | Difference | Status |
|-|-|-|-|-|
`;
Object.keys(prSdkSizes).forEach(sdk => {
const currentSize = currentSdkSizes[sdk] || 0;
const prSize = prSdkSizes[sdk];
const diff = prSize - currentSize;
let status;
if (diff < 0) {
status = "🚀";
} else if (diff >= maxTolerance) {
status = "🔴";
} else if (diff >= fineTolerance) {
status = "🟡";
} else {
status = "🟢";
}
commentBody += `| ${sdk} | ${currentSize} KB | ${prSize} KB | ${diff} KB | ${status} |\n`;
});
// Post or update the PR comment
// Find existing comment
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
});
const comment = comments.find(c => c.body.includes(commentHeader));
if (comment) {
// Update the existing comment
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: comment.id,
body: commentBody,
});
} else {
// Create a new comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: commentBody,
});
}
87 changes: 87 additions & 0 deletions .github/workflows/sdk-sizes-updates.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: SDK sizes updates

on:
pull_request:

workflow_dispatch:

env:
MODULES: "stream-chat-android-client stream-chat-android-offline stream-chat-android-ui-components stream-chat-android-compose"
VARIANTS: "debug release"
METRICS_FILE: "metrics/size.json"
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}

jobs:
update-sdk-sizes:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3
- uses: ./.github/actions/setup-java
- uses: ./.github/actions/gradle-cache
with:
key-prefix: gradle-build

- name: Assemble SDKs
run: |
for module in $MODULES; do
modules+=" :$module:assemble"
done
./gradlew $modules
- name: Update size metrics
run: |
# Create temporary JSON file
echo '{}' > metrics.json
# Calculate sizes
for module in $MODULES; do
for variant in $VARIANTS; do
file="$module/build/outputs/aar/$module-$variant.aar"
# Ensure file exists
if [ -f "$file" ]; then
size=$(du -k "$file" | awk '{print $1}')
else
echo "Warning: $file not found. Setting size to 0."
size=0
fi
# Update JSON
jq --arg module "$module" --arg variant "$variant" --argjson size "$size" \
".\"$variant\".\"$module\" = $size" metrics.json > temp.json && mv temp.json metrics.json
done
done
# Validate Generated JSON
jq . metrics.json
# Move temporary JSON file to the final file
mv metrics.json $METRICS_FILE
- name: Update size badges
run: |
for module in $MODULES; do
size=$(jq --arg module "$module" ".release.\"$module\"" $METRICS_FILE)
badgeUrl="https://img.shields.io/badge/${module//-/--}-$size%20KB-lightgreen"
sed -i "s|!\[$module\](.*)|![$module](${badgeUrl})|" README.md
done
- name: Commit and Push JSON
run: |
git fetch origin $BRANCH_NAME
git checkout $BRANCH_NAME
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
# Add and commit updated metrics file
git add $METRICS_FILE
git commit -m "Update SDK size metrics" || echo "No metrics changes to commit"
# Add and commit updated README file
git add README.md
git commit -m "Update SDK size badges" || echo "No README changes to commit"
git push origin HEAD:$BRANCH_NAME
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@
<a href="https://github.com/GetStream/stream-chat-android/releases"><img src="https://img.shields.io/github/v/release/GetStream/stream-chat-android" /></a>
</p>

<div align="center">

![stream-chat-android-client](https://img.shields.io/badge/stream--chat--android--client-2584%20KB-lightgreen)
![stream-chat-android-offline](https://img.shields.io/badge/stream--chat--android--offline-796%20KB-lightgreen)
![stream-chat-android-ui-components](https://img.shields.io/badge/stream--chat--android--ui--components-2700%20KB-lightgreen)
![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-3684%20KB-lightgreen)

</div>

This is the official Android SDK for [Stream Chat](https://getstream.io/chat/sdk/android/), a service for building chat and messaging applications. This library includes both a low-level chat SDK and a set of reusable UI components. Most users start with the UI components, and fall back to the lower level API when they want to customize things.

We're proud to say that we're the first Android Chat SDK that supports Jetpack Compose! We [released](https://github.com/GetStream/stream-chat-android/releases/tag/4.15.0) our Compose UI Components one day after the official Jetpack Compose 1.0 release and our team members have been working hard on it since then.
Expand Down
14 changes: 14 additions & 0 deletions metrics/size.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"debug": {
"stream-chat-android-client": 2744,
"stream-chat-android-offline": 840,
"stream-chat-android-ui-components": 2840,
"stream-chat-android-compose": 4012
},
"release": {
"stream-chat-android-client": 2584,
"stream-chat-android-offline": 796,
"stream-chat-android-ui-components": 2700,
"stream-chat-android-compose": 3684
}
}

0 comments on commit dcebb2a

Please sign in to comment.