Skip to content

Commit 34aa0b2

Browse files
committed
Initial Commit
0 parents  commit 34aa0b2

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed

.github/scripts/minify.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/bin/bash
2+
3+
set -e # Exit on error
4+
5+
# Variables from environment
6+
PACKAGE_NAME="$PACKAGE"
7+
PACKAGE_VERSION="$VERSION"
8+
TARBALL="${PACKAGE_NAME}_${PACKAGE_VERSION}.tar.gz"
9+
EXTRACT_DIR="./extracted"
10+
MINIFIED_TARBALL="${PACKAGE_NAME}_${PACKAGE_VERSION}_minified.tar.gz"
11+
CRAN_URL="https://cran.r-project.org/src/contrib/Archive/${PACKAGE_NAME}/${TARBALL}"
12+
13+
# Fetch tarball
14+
if [ ! -f "$TARBALL" ]; then
15+
curl -L "$CRAN_URL" -o "$TARBALL"
16+
fi
17+
18+
# Extract tarball
19+
mkdir -p "$EXTRACT_DIR"
20+
export COPYFILE_DISABLE=1
21+
tar --no-xattrs -xvf "$TARBALL" -C "$EXTRACT_DIR"
22+
23+
# Clean and repack
24+
rm -rf "$EXTRACT_DIR/$PACKAGE_NAME/tests" \
25+
"$EXTRACT_DIR/$PACKAGE_NAME/man" \
26+
"$EXTRACT_DIR/$PACKAGE_NAME/vignettes" \
27+
"$EXTRACT_DIR/$PACKAGE_NAME/inst"
28+
29+
tar --no-xattrs -czvf "$MINIFIED_TARBALL" -C "$EXTRACT_DIR" .
30+
31+
# Install package
32+
R CMD INSTALL "$MINIFIED_TARBALL"

.github/workflows/minify.yaml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: R Package Size Optimization Workflow
2+
3+
on:
4+
issues:
5+
types: [opened]
6+
7+
jobs:
8+
package-optimization:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- name: Checkout source code
12+
uses: actions/checkout@v3
13+
14+
- name: Parse package metadata from issue
15+
id: parse-description
16+
run: |
17+
DESCRIPTION='${{ github.event.issue.body }}'
18+
PACKAGE=$(echo "$DESCRIPTION" | jq -r '.package')
19+
VERSION=$(echo "$DESCRIPTION" | jq -r '.version')
20+
echo "PACKAGE=$PACKAGE" >> $GITHUB_ENV
21+
echo "VERSION=$VERSION" >> $GITHUB_ENV
22+
23+
- name: Setup R runtime environment
24+
uses: r-lib/actions/setup-r@v2
25+
26+
- name: Query existing optimized package
27+
id: check-artifact
28+
run: |
29+
ARTIFACT_INFO=$(gh api /repos/${{ github.repository }}/actions/artifacts --jq '.artifacts[] | select(.name=="${{ env.PACKAGE }}-${{ env.VERSION }}") | {id: .id, run_id: .workflow_run.id}')
30+
ARTIFACT_ID=$(echo "$ARTIFACT_INFO" | jq -r '.id')
31+
RUN_ID=$(echo "$ARTIFACT_INFO" | jq -r '.run_id')
32+
echo "ARTIFACT_ID=$ARTIFACT_ID" >> $GITHUB_ENV
33+
echo "RUN_ID=$RUN_ID" >> $GITHUB_ENV
34+
env:
35+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36+
37+
- name: Retrieve cached optimized package
38+
if: env.ARTIFACT_ID != ''
39+
uses: actions/download-artifact@v4
40+
with:
41+
name: ${{ env.PACKAGE }}-${{ env.VERSION }}
42+
run-id: ${{ env.RUN_ID }}
43+
github-token: ${{ secrets.GITHUB_TOKEN }}
44+
path: .
45+
46+
- name: Install cached optimized package
47+
if: env.ARTIFACT_ID != ''
48+
run: R CMD INSTALL ${{ env.PACKAGE }}_${{ env.VERSION }}_minified.tar.gz
49+
50+
- name: Generate and install optimized package
51+
if: env.ARTIFACT_ID == ''
52+
run: |
53+
# Fetch Package & Run minification
54+
.github/scripts/minify.sh
55+
56+
# Get original size
57+
ORIG_SIZE=$(du -h ./${{ env.PACKAGE }}_${{ env.VERSION }}.tar.gz | cut -f1)
58+
echo "ORIG_SIZE=$ORIG_SIZE" >> $GITHUB_ENV
59+
60+
# Get minified size
61+
MIN_SIZE=$(du -h ./${{ env.PACKAGE }}_${{ env.VERSION }}_minified.tar.gz | cut -f1)
62+
echo "MIN_SIZE=$MIN_SIZE" >> $GITHUB_ENV
63+
64+
- name: Archive optimized package
65+
if: env.ARTIFACT_ID == ''
66+
uses: actions/upload-artifact@v4
67+
with:
68+
name: ${{ env.PACKAGE }}-${{ env.VERSION }}
69+
path: ./${{ env.PACKAGE }}_${{ env.VERSION }}_minified.tar.gz
70+
retention-days: 90
71+
72+
- name: Report optimization results
73+
run: |
74+
if [[ "${{ job.status }}" == "success" ]]; then
75+
if [[ -n "${{ env.ORIG_SIZE }}" ]]; then
76+
COMMENT="✅ Package successfully optimized!\nOriginal size: ${{ env.ORIG_SIZE }}\nOptimized size: ${{ env.MIN_SIZE }}"
77+
else
78+
COMMENT="✅ Package successfully installed from cache."
79+
fi
80+
else
81+
COMMENT="❌ Package optimization failed. Please check workflow logs."
82+
fi
83+
gh issue comment "${{ github.event.issue.number }}" --body "$COMMENT"
84+
env:
85+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Medium Task for GSoC-R 2025 Project: Optimizing a performance testing workflow by reusing minified R package versions between CI runs
2+
3+
## Description
4+
5+
Write a YAML snippet that:
6+
Checks if a precompiled artifact for a specific historical version of data.table exists.
7+
If it is found, it downloads and installs the artifact, else it builds the version from source, minifies it, and then uploads it as an artifact for future runs. (Name the artifacts based on version numbers for keeping them distinct)
8+
Implement a fallback mechanism in the workflow to build the missing version from source in case artifact retrieval fails.

0 commit comments

Comments
 (0)